Raspberry Pi 2でファイルサーバを作るまでのまとめ


　初めてRaspberry Piに手を出して、試行錯誤しながらファイルサーバを作ったけれど、後から考えればこうすれば良かったと思うところが多々ある。もし、もう一回最初からやり直すとしたら、こうすればいいんじゃないかということを考えながら、自分なりに手順をまとめてみた。

### 前提

- Windowsでバックアップに利用していたUSB外付けHDDを、フォーマット等せずにNTFS形式のままファイルサーバ化する。
- 自分しかいないプライベートネットワークの中だけで利用するので、現時点ではセキュリティは特に考えない。
- セットアップの際にモニタやキーボードを接続するのは面倒なので、すべてMacのターミナルかWindowsのTera Termからネットワーク越しに設定する。

### 購入する物

- [Raspberry Pi 2 Model B](http://www.amazon.co.jp/gp/product/B00T356SFO/)
- [Raspberry Piスターターパック (Pi2用Economy)](http://www.amazon.co.jp/gp/product/B00TLGADII/)

　自分はケース付きのモデルとか、Standard版のスターターパックとか、ヒートシンクも買ってしまったけれど、後から考えれば買うのはこの2点だけで良かった。

#### その理由

- プラスチックケースですっぽり覆ってしまうのは、熱が不安。
- 小型ヒートシンクでは気休めなので、ちゃんと熱対策するならファンの増設等を検討する必要がある。
- LANケーブルは自前のものがあるので不要だった。
- ヘッドレスで設定するので、HDMIケーブルは要らなかった。

### セットアップ

　スターターパックのマイクロSDカードにはRaspbian-2015-05-05がインストール済みなので、マイクロSDカードを差し込んで、LANケーブルをつないで、電源を差し込めば起動する筈。

　起動したら、Macのターミナルから`arp -a`を叩くなり、FingでLAN内を探索するなりして、b8からはじまるRaspberry Piのベンダーコードに紐付いたIPアドレスを見つける。

　該当のIPアドレスにsshでログイン。初期ユーザはpi、パスワードはraspberry。

　ログインできたら、`sudo raspi-config`を叩いて、下記項目を設定。

- ファイルシステムの拡張
- ロケールをja_JP.UTF-8に変更
- タイムゾーンをTokyoに設定
- GPUメモリを64から16に変更
- カメラモジュールをディゼーブルに

　完了後、そのまま再起動。

### Raspbianのアップグレード

　再起動したらsshで入り直して、まずはシステムを最新版にする。

　自分は一通りwheezyで設定した後で変更したけれど、この時点で/etc/apt/sources.listを書き換えて、アップグレード前にリポジトリ先を国内のJAISTなどに変更した方が、後々の作業が早いと思う。あと、wheezyからjessieにリポジトリを書き換えて、最新版のRaspbianも入れてしまう。

```
pi@raspberrypi ~ $ cat /etc/apt/sources.list
#deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi
deb http://ftp.jaist.ac.jp/raspbian jessie main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://archive.raspbian.org/raspbian/ jessie main contrib non-free rpi
pi@raspberrypi ~ $
```

　アップデート系のコマンドを一通り実施。

```
pi@raspberrypi ~ $ #パッケージリストの更新
pi@raspberrypi ~ $ sudo apt-get update
pi@raspberrypi ~ $ #パッケージの更新
pi@raspberrypi ~ $ sudo apt-get upgrade
pi@raspberrypi ~ $ #ディストリビューションの更新
pi@raspberrypi ~ $ sudo apt-get dist-upgrade
pi@raspberrypi ~ $ #ファームウェアの更新
pi@raspberrypi ~ $ sudo rpi-update
pi@raspberrypi ~ $ #依存関係を満たすため一時的にインストールされた不要パッケージの削除
pi@raspberrypi ~ $ sudo apt-get autoremove
pi@raspberrypi ~ $ #システムにインストールされていないパッケージのアーカイブを削除
pi@raspberrypi ~ $ sudo apt-get autoclean
```

　[Debianのアップグレード手引き](https://www.debian.org/releases/stable/i386/release-notes/ch-upgrading.ja.html#nownownow)を参考に、削除したパッケージの完全削除も実施。

```
pi@raspberrypi ~ $ dpkg -l | awk '/^rc/ { print $2 }'
pi@raspberrypi ~ $ sudo apt-get purge $(dpkg -l | awk '/^rc/ { print $2 }')
```

　システムがアップグレードされたことを確認。

```
pi@raspberrypi ~ $ cat /etc/debian_version
8.0
pi@raspberrypi ~ $

pi@raspberrypi ~ $ hostnamectl
   Static hostname: raspberrypi
         Icon name: computer
           Chassis: n/a
        Machine ID: 440a68c6f28d3e287c6b6c7b554a9684
           Boot ID: ec13f69de49744fcbd0258bd4afde2df
  Operating System: Raspbian GNU/Linux 8 (jessie)
            Kernel: Linux 4.1.13-v7+
      Architecture: arm
pi@raspberrypi ~ $
```

　確認後、一度再起動して入り直す。

　デフォルトのランレベルを5相当から3相当に変更。

```
pi@raspberrypi ~ $ systemctl get-default
graphical.target
pi@raspberrypi ~ $

pi@raspberrypi ~ $ sudo systemctl set-default multi-user.target
Created symlink from /etc/systemd/system/default.target to /lib/systemd/system/multi-user.target.
pi@raspberrypi ~ $
```

### USB外付けHDDのマウント

　NTFS形式のHDDをマウントするために、`sudo apt-get install ntfs-3g`を叩いて、ntfs-3gをインストール。

　インストール完了後は、実際にマウントする前に一旦システムを再起動しないと、下記のエラーが出るらしい。というか、出た。

```
pi@raspberrypi ~ $ sudo mount -t ntfs-3g /dev/sda1 /mnt/hdd1
libkmod: ERROR ../libkmod/libkmod.c:554 kmod_search_moddep: could not open moddep file '/lib/modules/3.18.11-v7+/modules.dep.bin'
fuse: device not found, try 'modprobe fuse' first
pi@raspberrypi ~ $
```

　Windowsで使用していたUSB外付けHDDを、Raspberry Piにつないで確認。

```
pi@raspberrypi ~ $ sudo fdisk -l

Disk /dev/mmcblk0: 15.8 GB, 15804137472 bytes
4 heads, 16 sectors/track, 482304 cylinders, total 30867456 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xa6202af7

        Device Boot      Start         End      Blocks   Id  System
/dev/mmcblk0p1            8192      122879       57344    c  W95 FAT32 (LBA)
/dev/mmcblk0p2          122880    30867455    15372288   83  Linux

Disk /dev/sda: 2000.4 GB, 2000398934016 bytes
255 heads, 63 sectors/track, 243201 cylinders, total 3907029168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x11961247

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048  3907026943  1953512448    7  HPFS/NTFS/exFAT
pi@raspberrypi ~ $
```

　/dev/sda1としてHDDが認識されたので、マウントポイントを作成してHDDをマウント。

```
pi@raspberrypi ~ $ sudo mkdir /mnt/hdd1
pi@raspberrypi ~ $

pi@raspberrypi ~ $ sudo mount -t ntfs-3g /dev/sda1 /mnt/hdd1
pi@raspberrypi ~ $

pi@raspberrypi ~ $ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/root         15G  2.8G   12G   20% /
devtmpfs         483M     0  483M    0% /dev
tmpfs             98M  236K   98M    1% /run
tmpfs            5.0M     0  5.0M    0% /run/lock
tmpfs            195M     0  195M    0% /run/shm
/dev/mmcblk0p1    56M   20M   37M   36% /boot
/dev/sda1        1.9T  578G  1.3T   32% /mnt/hdd1
pi@raspberrypi ~ $
```

　起動時に自動的にマウントされるように、HDDのUUIDを確認して、fstabにマウント設定を追加。

```
pi@raspberrypi ~ $ sudo blkid /dev/sda1
/dev/sda1: LABEL="M-cM-^CM-^\M-cM-^CM-*M-cM-^CM-%M-cM-^CM-<M-cM-^CM- " UUID="A25CF7FB5CF7C855" TYPE="ntfs"
pi@raspberrypi ~ $

pi@raspberrypi ~ $ cat /etc/fstab
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
UUID="A25CF7FB5CF7C855" /mnt/hdd1       ntfs-3g defaults,nofail 0       0
# a swapfile is not a swap partition, so no using swapon|off from here on, use  dphys-swapfile swap[on|off]  for that
pi@raspberrypi ~ $
```

　wheezyではマウントオプションにdefaultsだけを記載していたけれど、jessieでは[systemd 配下での起動時のマウント失敗に対する、より厳格な取り扱い](https://www.debian.org/releases/jessie/i386/release-notes/ch-information.ja.html#systemd-auto-mounts-incompat)によると、リムーバブルドライブのマウントオプションはnoautoかnofailを付けるようにとのことなので、nofailを追加した。

#### "/etc/fstabのパースがHDD認識と同時またはそれ以前に行われてしまう"問題の対処

　wheezyの時は再起動すると時々HDDがマウントされていないことがあったので、[Raspberry pi 2が外付けHDDを自動認識してくれなかった- Qiita](http://qiita.com/c01o/items/f45bc9cf6785342ab573)を参考にさせていただき、/boot/cmdline.txtにrootdelay=10を追加した。

```
pi@raspberrypi ~ $ cat /boot/cmdline.txt
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait rootdelay=10
```

　ただ、jessieにした時にマウントオプションにnofailを追加したので、rootdelay=10はもう必要ないんじゃないかとも思うのだけど、確証がないのでそのままにしてある。

### USB外付けHDDの自動停止設定

- [8.USBHDDの定期的なスピンダウン方法 - RaspberryPiで各種サーバー作り！ - ある阪大生の物置小屋](http://kassyjp.ninja-web.net/ras/jessie/spindown.htm)

　こちらのページを参考にさせていただいて、外付けHDDに一定時間アクセスがなかった場合自動的に停止する設定を実施した。

　`sudo apt-get install sdparm`と`sudo apt-get install hdparm`を叩いて、パッケージをインストール。`sudo sdparm -r --command=stop /dev/sda1`や`sudo hdparm -y /dev/sda1`を叩いて、どちらのコマンドでHDDが停止できるか確認。

　当初、sdparmをインストールしてHDDが停止するか試したところ、停止した直後に動き出してしまったのでこちらでは駄目なのかと思いhdparmもインストールしてしまったけれど、単にsdparmのコマンドにrオプションが足りなかっただけで、自分の環境ではどちらのコマンドでもHDDを停止できた。

　あとは上記ページで紹介されている通りにhdd_spindown.shを作成し、systemdでサービスとして設定。

　自分はHDDが60秒で停止するように設定した。

### Samba導入

　自分はwheezyの時に`sudo apt-get install samba`でインストールして、jessieへのアップグレード時にパッケージの更新がかかっていたけれど、jessieでインストールする場合も特に変わらないだろうと思う。

　一応、jessieにアップグレード後のSambaのパッケージ状態はこんな感じだった。

```
pi@raspberrypi ~ $ dpkg -l samba*
要望=(U)不明/(I)インストール/(R)削除/(P)完全削除/(H)保持
| 状態=(N)無/(I)インストール済/(C)設定/(U)展開/(F)設定失敗/(H)半インストール/(W)トリガ待ち/(T)トリガ保留
|/ エラー?=(空欄)無/(R)要再インストール (状態,エラーの大文字=異常)
||/ 名前           バージョン   アーキテクチ 説明
+++-==============-============-============-=================================
ii  samba          2:4.1.17+dfs armhf        SMB/CIFS file, print, and login s
un  samba-ad-dc    <なし>       <なし>       (説明 (description) がありません)
un  samba-client   <なし>       <なし>       (説明 (description) がありません)
ii  samba-common   2:4.1.17+dfs all          common files used by both the Sam
ii  samba-common-b 2:4.1.17+dfs armhf        Samba common files used by both t
un  samba-doc      <なし>       <なし>       (説明 (description) がありません)
ii  samba-dsdb-mod 2:4.1.17+dfs armhf        Samba Directory Services Database
ii  samba-libs:arm 2:4.1.17+dfs armhf        Samba core libraries
un  samba-tools    <なし>       <なし>       (説明 (description) がありません)
ii  samba-vfs-modu 2:4.1.17+dfs armhf        Samba Virtual FileSystem plugins
un  samba4         <なし>       <なし>       (説明 (description) がありません)
un  samba4-clients <なし>       <なし>       (説明 (description) がありません)
un  samba4-common  <なし>       <なし>       (説明 (description) がありません)
un  samba4-common- <なし>       <なし>       (説明 (description) がありません)
pi@raspberrypi ~ $

pi@raspberrypi ~ $ smbd -V
Version 4.1.17-Debian
pi@raspberrypi ~ $
```

　現在のsmb.confを`sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.org`などでバックアップ。下記のように書き換えた。

```
pi@raspberrypi ~ $ cat /etc/samba/smb.conf
[global]
        server role = standalone server
        map to guest = Bad User
        obey pam restrictions = Yes
        pam password change = Yes
        passwd program = /usr/bin/passwd %u
        passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully* .
        unix password sync = Yes
        syslog = 0
        log file = /var/log/samba/log.%m
        max log size = 10
        client max protocol = SMB3
        dns proxy = No
        usershare allow guests = Yes
        panic action = /usr/share/samba/panic-action %d
        idmap config * : backend = tdb
        hosts deny = 192.168.0.100
        printing = bsd

[nas]
        comment = raspberrypi_nas
        path = /mnt/hdd1
        force user = pi
        read only = No
        guest ok = Yes
pi@raspberrypi ~ $
```

　smb.confの編集は、資料を参考にある程度適当に書き換えたら、一度`testparm`コマンドを叩いて出力された結果を不要な項目を削除してsmb.confに流し込み、`testparm -v`を叩いて値が変わっていて欲しいデフォルトの項目を追記する形で実施してみた。

　host deny = 192.168.0.100を入れているのは、うちのネットワーク上に存在する東芝レグザ（テレビ）が、Sambaに対して5分に1回アクセスしてくる影響で、HDDが起動と自動停止を繰り返してしまうから。レグザのIPアドレスを固定して、該当アドレスを弾くようにした。

　printing = bsdを入れただけだと、まだ下記のようなメッセージが出力されたので、`sudo touch /etc/printcap`を叩いてprintcapを作成した。

```
[2015/11/22 09:52:06.503937,  0] printing/print_standard.c:68(std_pcap_cache_reload)
  Unable to open printcap file /etc/printcap for read!
```

　client max protocol = SMB3を入れたことで、実際にMacのターミナルで`smbutil statshares -a`を叩いてSMB_VERSIONがSMB_3.0となったことを確認。ただ、うちの環境では結局Mac（El Capitan）からSambaがまともに扱えない状況は解消できなかった。net.inet.tcp.delayed_ack=0なども試したけれど、効果なし。

　Windowsからはもちろん、iPad上のCommic Glassといったアプリからも、全く問題なくSambaへアクセスできる。[MacOSX - El CapitanからのSMB接続で、濁点・半濁点のあるフォルダが開けない - Qiita](http://qiita.com/tatsuki_kokita/items/035ded011e80d9a26c76)などの問題もあるらしいので、現時点ではMacからSambaを扱うことは諦めた。

　Macからファイルサーバへの接続には、SFTPを利用することにした。sshが使えれば利用可能なので、ほぼデフォルトで利用可能だし、実際Yummy FTPでSFTP接続すると非常に速い。

　編集が完了したら、サービスをリスタート。

```
pi@raspberrypi ~ $ sudo systemctl restart smbd
pi@raspberrypi ~ $ sudo systemctl restart nmbd
```

### IPアドレスの固定

　当初、wheezyで/etc/network/interfacesにIPアドレスの設定を書き込んだままjessieに引き継いでいたのだけど、Fingで確認するとRaspberry Piに割り当てられたIPアドレスが2つになってしまっていた。Raspbian 2015-05-05以降、設定箇所が/etc/network/interfacesから/etc/dhcpcd.confに変更になったとの情報を見つけたので、/etc/network/interfacesは元どおりに差し戻して、設定をやり直した。

　/etc/dhcpcd.confの末尾に設定を追記。

```
interface eth0
static ip_address=192.168.0.101/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
```

　再起動して、設定したIPアドレスでログインが可能で、Fing上でRaspberry Piに割り当てられたIPアドレスが設定したIPアドレス一個になったことを確認した。

### NTP先をNICTに変更

　NTP先も国内に変更しておいた方がいいだろうと、NICTへ変更した。

　/etc/ntp.confを編集。

```
pi@raspberrypi ~ $ diff /etc/ntp.conf /etc/ntp.conf.org
21,25c21,24
< #server 0.debian.pool.ntp.org iburst
< #server 1.debian.pool.ntp.org iburst
< #server 2.debian.pool.ntp.org iburst
< #server 3.debian.pool.ntp.org iburst
< pool ntp.nict.jp iburst
---
> server 0.debian.pool.ntp.org iburst
> server 1.debian.pool.ntp.org iburst
> server 2.debian.pool.ntp.org iburst
> server 3.debian.pool.ntp.org iburst
pi@raspberrypi ~ $
```

### rsyslogd-2007: action 'action 17' suspendedがログに出力され続ける問題の対処

　ヘッドレスで運用している所為か、下記のメッセージが何度も出力されてしまう。

```
Nov 30 03:35:01 raspberrypi rsyslogd-2007: action 'action 17' suspended, next retry is Mon Nov 30 03:36:31 2015 [try http://www.rsyslog.com/e/2007 ]
```

　[rsyslogd-2007: action 'action 18' suspended が出る場合の対策 [tosihisa's public notebook]](https://www.netfort.gr.jp/~tosihisa/notebook/doku.php/raspberrypi/log20151101_rsyslogd-2007)を参考にさせていただき、/etc/rsyslog.confの最後にある段落をコメントアウトした。

```
pi@raspberrypi ~ $ diff /etc/rsyslog.conf /etc/rsyslog.conf.org
118,121c118,121
< #daemon.*;mail.*;\
< #     news.err;\
< #     *.=debug;*.=info;\
< #     *.=notice;*.=warn       |/dev/xconsole
---
> daemon.*;mail.*;\
>       news.err;\
>       *.=debug;*.=info;\
>       *.=notice;*.=warn       |/dev/xconsole
pi@raspberrypi ~ $
```

### とりあえず締め

　とりあえず、今のところはここまで。

　Raspberry Piは手元に外付けHDDがあれば一万円未満でファイルサーバが作れて、ついでにLinuxをいじって遊べるのは悪くないなあと思う。