Edited at

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

More than 3 years have passed since last update.

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


前提


  • Windowsでバックアップに利用していたUSB外付けHDDを、フォーマット等せずにNTFS形式のままファイルサーバ化する。

  • 自分しかいないプライベートネットワークの中だけで利用するので、現時点ではセキュリティは特に考えない。

  • セットアップの際にモニタやキーボードを接続するのは面倒なので、すべてMacのターミナルかWindowsのTera Termからネットワーク越しに設定する。


購入する物

 自分はケース付きのモデルとか、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のアップグレード手引きを参考に、削除したパッケージの完全削除も実施。

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 配下での起動時のマウント失敗に対する、より厳格な取り扱いによると、リムーバブルドライブのマウントオプションはnoautoかnofailを付けるようにとのことなので、nofailを追加した。


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

 wheezyの時は再起動すると時々HDDがマウントされていないことがあったので、Raspberry pi 2が外付けHDDを自動認識してくれなかった- Qiitaを参考にさせていただき、/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の自動停止設定

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

 sudo apt-get install sdparmsudo apt-get install hdparmを叩いて、パッケージをインストール。sudo sdparm -r --command=stop /dev/sda1sudo 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などの問題もあるらしいので、現時点では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]を参考にさせていただき、/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をいじって遊べるのは悪くないなあと思う。