RaspberryPi2でMacとWindows両対応のNASを構築する

## 背景
### 手軽に使えるNASが欲しい。
外付けHDDが余っていたので、RaspberryPi2でNAS（ファイルサーバ）を構築しました。「NASってどんなもの？」という感じで具体的にイメージが湧かないため「実際に構築することでNASについて知ろう！」という目的もあります。今回は個人的にオウチで利用するかんたんなNASとなっているため、RAIDを構成したり、信頼性・データの冗長性の確保などは考慮していません。

### MacからもWindowsからも読み書きできる制限のないNAS。

現在の作業環境はデスクトップにWindows、持ち運びにMacbook Airなので、WindowsとMacに両対応し、どの端末からも読み書きが可能な不自由なく利用できることを意識したNASを構築しました。
※ また、万が一NASが正常に動作しなくなった場合にMAC・Windowsどちらからでもデータの読み書きを行えるようにしておきます。

## 実行環境

- [Raspberry Pi2 Model B](http://www.amazon.co.jp/gp/product/B00TBKFAI2/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B00TBKFAI2&linkCode=as2&tag=makaidevelop-22) - Raspbian  Jessie8.0
- 外付けHDD（ストレージ）
- MacbookAir（SSH・作業用） - OS X El Capitan 10.11.1
- Windowsマシン - Windows10
- Samba（ファイルサーバー） - Version 4.1.17-Debian

## やってみよう!

### HDDを準備しよう

#### 最適なフォーマット形式を考える

Windowsでデフォルトの`NTFS`フォーマット形式は、Macでは読み取り専用で書き込みができません。一方、Macでデフォルトの`HFS+`フォーマット形式は、Windowsでは読み込むことさえ出来ません。

`FAT32`という両プラットフォームで読み書き可能な互換性の高いフォーマット形式があります。しかし、欠点があり1ファイルにつき最大4GBまでしか書き込めず、Windowsではボリューム全体として最大32GBまでの領域しかフォーマットできないという制限があります。

そこでFAT32の後継として登場したのが、 `exFAT` (Extended FAT)形式。主な特徴は以下のとおりです。

- ドライブとファイルの最大容量制限がない（と考えていいほど大きい）
- **WindowsとMacに両対応**
- 以下の環境は未対応
  - Windows - VistaSP1未満
  - Mac - OS X10.6.5未満
- NTFSが備えるファイルの暗号化機能やボリュームの圧縮/拡張機能などを持たず、シンプルに読み書きするのみ

#### どのフォーマット形式を使うか

- MacとWindowsなどOSが混在している環境
- OSが比較的新しい環境
- 大きいファイルを扱える（容量制限がない）NASのほうが安心

以上の3点から`exFAT`形式でフォーマットすることにします。


#### フォーマットを行う

`exFAT`形式でのフォーマットはWindows、Macどちらでも可能です。ここでは、Macで行うことにします。

[![https://gyazo.com/667973c538c97dadf156a27a9edfef81](https://i.gyazo.com/667973c538c97dadf156a27a9edfef81.png)](https://gyazo.com/667973c538c97dadf156a27a9edfef81)

- ディスクユーティリティを開く
  - `Finder`  > `アプリケーション` > `ユーティリティ` > `ディスクユーティリティ`
- 外付けHDDをMacに繋ぐ
- 左サイドに表示される該当する`HDD`を選択
- 中央上部の`消去タブ`を選択
- フォーマットとして`exFAT`を選択
- 任意のHDD名を入力（ここでは`RaspberryPi`とした）
- 方式は`GUIDパーティションマップ`を選択
- `消去`を選択
- Macから外付けHDDを取り外す

以上でフォーマットは完了です。


### マウント - 外付けHDDをマウントしよう

はじめに、マウントの意味を確認します。

>マウントとは、コンピュータに接続した周辺機器や外部記憶装置(あるいは、装置に挿入されたディスクなどの記録メディア)をOSに認識させ、利用可能な状態にすること。
>[マウントとは｜mount ： IT用語辞典](http://e-words.jp/w/%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88.html)

ここからはRaspberryPi2のターミナルでの作業です。

#### Jessie(RaspberryPi2)でexFATを使えるようにする

下準備としてJessieでexFAT形式を扱うために`exfat-fuse`と`exfat-utils`をインストールする。

```sh:Terminal
$ sudo apt-get install exfat-fuse exfat-utils
```

#### 該当HDDのUUIDを調べる

RaspberryPiにHDDをつなげてから、`blkid`で該当HDDのUUID（デバイスの一意な識別子）を調べて、控える。

```sh:Terminal
$ sudo blkid
/dev/sda1: LABEL="EFI" UUID="67E3-17ED" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="f0a75650-cf5d-4718-8af1-dc7b66a3f895"
/dev/sda2: LABEL="RaspberryPi" UUID="5662-CA45" TYPE="exfat" PARTLABEL="RaspberryPi" PARTUUID="8e245eff-3662-4cb7-8a3b-637ac7f6ac66"
```

先ほどフォーマットする際に指定したHDD名がLABELとして示されています。
この場合だと、`LABEL="RaspberryPi"`が該当HDDで、`UUID="5662-CA45"`だと分かります。

#### 起動時に自動でマウントしてくれるように設定

手動で`mount`コマンドでマウントすることも可能ですが、`fstab`に設定を指定すれば起動時に自動でマウントしてくれます。

設定ファイルは`/etc/fstab`です。（ここでは`vim`で編集しますが、`nano`などを使っても大丈夫です）

```sh:Terminal
$ sudo vim /etc/fstab
```

```sh:/etc/fstab
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p6  /boot           vfat    defaults          0       2
/dev/mmcblk0p7  /               ext4    defaults,noatime  0       1
UUID="5662-CA45"        /mnt/hdd/raspberrypi    exfat-fuse      async,auto,dev,exec,gid=65534,rw,uid=65534,umask=007    0       0
```

例にならって記述すれば問題ありません。ここで、先ほど控えた`UUID`を用いています。`/dev/sda2`のようなデバイス指定方法も可能ですが、何かのタイミングで`/dev/sdb2`のように変更されてしまった場合、正しいデバイスでマウントされないため、デバイスを一意に特定できる`UUID`を指定する必要があります。

指定の概要は以下のとおりです。

- 1列目 - デバイス指定
- 2列目 - マウントポイント
- 3列目 - ファイルシステム
- 4列目 - マウント時のオプション

ここで重要な点は、Unixにおける`exFAT`の扱いです。

>`exFAT`は、Windowsのファイルシステムなので、そもそもUnixでのオーナーや、アクセス権（パーミッション）の概念がファイルシステム上に存在しない。また、exFAT形式のストレージをマウントした後に`chmod`コマンドなどでパーミッション指定することはできない。そのため、Unixでマウントする際にはマウント時の`fstab`などの設定ファイルでオプションを適切に指定する必要がある。

オプションの中身の説明は以下のサイトにて詳しく説明されています。

-  [fstab - ArchWiki](https://wiki.archlinuxjp.org/index.php/Fstab)
-  [Umask - ArchWiki](https://wiki.archlinuxjp.org/index.php/Umask)

設定を書き込み保存したら、再起動する。

```sh:Terminal
$ sudo reboot
```

再起動が完了したら、該当HDDがマウントされているかを確認。

```sh:Terminal
$ sudo df
ファイルシス   1K-ブロック  使用    使用可        使用%  マウント位置
/dev/sda2    976556032  534016  976022016    1%    /mnt/hdd/raspberrypi
```
無事、マウントできているのが確認できます。

### Samba - ファイルサーバーをインストールしよう

まずSambaとは、「Linux上でWindowsサーバー相当の機能を実現するソフトウェア」のことです。これを導入することによってNASを実現します。

```sh:Terminal
$ sudo apt-get install samba
```

以上のコマンドでSambaをインストールします。

途中の`Do you want to continue [Y/n]?` は、`y`で進みます。

#### Sambaを設定する

設定ファイルは`/etc/samba/smb.conf`です。

```sh:Terminal
$ sudo vim /etc/samba/smb.conf
```

末尾に以下のものを追記します。

```vim:/etc/samba/smb.conf
[pi]
   comment = RaspberryPi2によるNAS
   path= /mnt/hdd/raspberrypi
   read only = no
   guest ok = yes
   force user = pi
   unix extensions = no
```

設定プロパティの意味としては、

・[任意の共有名]
　・comment：任意のコメント
　・path ：先ほど設定した外付けHDDのマウントポイントを設定
　・read only：Noで「読み込みだけでなく、書き込みも可能」とする
　・guest ok：Yesで「クライアントからの接続は、ゲスト接続」
　・force user：サーバー側では、ファイル操作を「pi」 で行う

といった感じです。


#### Sambaを再起動する

設定を保存したら、Sambaを再起動する。

```sh:Terminal
$ sudo service samba restart
```

うまくいけば、この時点でファイルサーバーが立ち上がります。

### NASにアクセスしよう

#### （ホスト名を設定していない人向け）ホスト名を設定しよう

NASにアクセスする前に、毎度IPアドレスでアクセスするのではなく、Avahiを使ってホスト名を設定し、ホスト名のみでアクセスできるように設定します。

Avahiを設定することで動的に変更される`192.168.0.0`というようなIPアドレスではなく、`raspi2.local`といったホスト名のみでRaspberryPiにアクセスすることが可能になります。NASにもこのホスト名でアクセスすることが出来るため、ここで設定しておくと後々楽だと思います。


#### Avahiのインストール

```sh:Terminal
$ sudo apt-get install avahi-daemon
```

`続行しますか？[Y/n]?` については　`y` で進めて、インストールを完了します。

#### ホスト名の変更

ホスト名を変更するために `/etc/hostname` を開く。

```sh:Terminal
sudo vim /etc/hostname
```

```sh:/etc/hostname
raspberrypi
```

この`raspberrypi`を任意のhostnameに変更します。ここでは`raspi2`と変更しました。
次に`/etc/hosts`を変更する。

```sh:Terminal
sudo vim /etc/hosts
```

`/etc/hosts`の末尾の

```sh:/etc/hosts
127.0.1.1       raspberrypi
```

を先ほど`/etc/hostname`で記述した任意のホスト名（ここでは`raspi2`）に変更し保存。

インストールが完了した後、`exit`コマンドでログアウトしたあと、MacのTerminalから

```sh:Mac
ssh ユーザ名@[任意のhost名].local
```

でRaspberryPiへアクセスが可能になります。

#### MacでNASにアクセスする


[![https://gyazo.com/cf3eda7202be649adb85402dac308322](https://i.gyazo.com/cf3eda7202be649adb85402dac308322.png)](https://gyazo.com/cf3eda7202be649adb85402dac308322)

- `finder`を開く
- メニューの`移動` > `サーバーへ接続...`
- サーバーアドレス:
	- `smb://サーバのホスト名、もしくは ip アドレス`
	- 例) `smb://hoge`, `smb://10.0.0.2` ...

- （必要であればユーザ名やパスワードを入力）


以上の手順でアクセスが可能。

#### WindowsでNASにアクセスする

[![https://gyazo.com/7ff40f6791f940293af89d6d8e5461e4](https://i.gyazo.com/7ff40f6791f940293af89d6d8e5461e4.png)](https://gyazo.com/7ff40f6791f940293af89d6d8e5461e4)

- `ファイル名を指定して実行`を起動（ショートカット：[Windows] + r）
- `¥¥[サーバのIP]or[ホスト名]`を入力して実行
- （必要であればユーザ名やパスワードを入力）

以上の手順でアクセスが可能。

## 所感

転がっていた外付けHDDと、RaspberryPi2のみでお手軽なMac,Windows両対応のNASを構築することが出来て、満足。とりあえず、音楽ファイルを置きました。


## まとめ

- 環境に応じてストレージのフォーマット形式を考えよう
- HDDをRaspberyyPiでマウントする方法
- Sambaをインストール,設定する方法
- Avahiでホスト名を設定するとすごく楽になる話
- MacとWindowsからNASにアクセスしてみる

## 参考

1. [RaspberryPi - Raspberry pi 2が外付けHDDを自動認識してくれなかった - Qiita](http://qiita.com/c01o/items/f45bc9cf6785342ab573)
2. [Make Magic, RaspberryPiでsambaサーバーを立てる](http://r--k.tumblr.com/post/59280652328/raspberrypi%E3%81%A7samba%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%92%E7%AB%8B%E3%81%A6%E3%82%8B)
3. [Linux - blkidコマンド(UUIDに対応するディスクパーティション確認) - Qiita](http://qiita.com/shyamahira/items/dfb85a1165b59091a2a5)
4. [mac(book air)とwindowsの両方の外付けHDDにするための共用フォーマット手順 - 共用フォーマットはExFATにして両方のバックアップを外付けHDDに！ - tweeeetyのぶろぐ的めも ](http://tweeeety.hateblo.jp/entry/2014/11/30/161825)