Raspberry Pi を Network boot (with LANDISK NFS)

2016/07/29Raspberry Pi, 自宅サーバー

Raspberry Pi/Pi2のSDカードが壊れる」の続き。

小さなサーバーとして便利な Raspberry Pi ですが、うちの環境では時々 SDカードの中身が吹っ飛んでしまう事故が多発。

毎回毎回再設定ではやってられないので、Network Bootを試してみることにしました。

Network bootする方法

以下の2通り。1は ほぼ全てをNFS上に持っていけるのだが、tftpが必要だし準備が面倒くさそう。USBシリアルケーブルがあれば少しは楽かな。
とりあえず2を試してみた。

  1. SDカードからRPi U-Bootを読み、tftpを使ってLinux kernelを読み込んだのちに起動。ファイルシステムは全てnfsマウントする
  2. SDカードから通常通りboot loader・kernelを読み込み、ファイルシステムだけNFSマウントする

NFSサーバーの用意

家に転がっていた I/O DATA製のLANDISKに telnetd/sshd/nfsd を入れた。今となっては遅いNASだがRaspberry Pi相手なら十分だろう。
容量も250GBしかないけど、不足するようならその時考える。

NFSブートへの移行

youresuchageek: Howto: Raspberry Pi Root NFS share – boot your System over NFS share and definitively deal with Flash data corruption” に従って作業するのが一番楽。

microSD から NFS サーバーへの転送も上記ドキュメントのように マウントしてから cp が簡単。実環境からの転送だと /proc /sys の処理でハマる。

/boot/cmdline.txt は下記のように設定。rw と smsc95xx.turbo_mode=N が必要。

dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 ip=192.168.xxx.clientip:192.168.xxx.nfsserverip:192.168.xxx.gateway:255.255.255.0:rpi_hostname:eth0:off root=/dev/nfs rootfstype=nfs nfsroot=192.168.xxx.nfsserverip:/rpi_directory,udp,vers=2 rw smsc95xx.turbo_mode=N elevator=deadline rootwait

/boot はFAT領域にあるので、万一 cmdline.txt を設定し間違えても、PCから修正できる。

NFSサーバーへの転送とRaspberry Pi側の設定完了後、再起動すればOK。SDからの起動よりも時間がかかるので慌てないように。

サーバー側のディスク容量は raspbian-jessie が 4.4GB、 raspbian-jessie-lite が 1.8GB。 この程度のサイズならバックアップを取るのも簡単だ。
昔はディスクを節約するために /usr/bin のバイナリを共有したり涙ぐましい努力をしたものだが、その苦労も遠い昔。

$ sudo du -sh *
4.4G Raspberry1
1.8G Raspberry2

NFS転送速度

LANDISK内蔵ハードディスクは SAMSUNG HA250JC。 10年前のディスクですので転送速度はこんなもんでしょう。SSD化したら速くなったりするのだろうか。

# hdparm -i /dev/hda

/dev/hda:

Model=SAMSUNG HA250JC, FwRev=WE100-30, SerialNo=S094J10Y439117
Config={ Fixed }
RawCHS=16383/16/63, TrkSize=34902, SectSize=554, ECCbytes=4
BuffType=DualPortCache, BuffSize=2048kB, MaxMultSect=16, MultSect=16
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=268435455
IORDY=on/off, tPIO={min:240,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes: pio0 pio1 pio2 pio3 pio4
DMA modes: mdma0 mdma1 mdma2
UDMA modes: udma0 udma1 udma2
AdvancedPM=no WriteCache=enabled
Drive conforms to: unknown: 1 2 3 4 5 6 7

# hdparm -ft /dev/hda

/dev/hda:
Timing buffered disk reads: 64 MB in 3.96 seconds = 16.16 MB/sec

# time dd if=/dev/zero of=dummy bs=1M count=1024
1024+0 records in
1024+0 records out
0.02user 37.70system 0:42.17elapsed 89%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (126major+19minor)pagefaults 0swaps

Raspberry Pi (Model B+) と Pi2 から書き込んでみた。速度差がかなりあるけど、CPUの差か?生ディスクに比べるとかなり遅い。

microSDなら read で 20MB/s, write も 10MB/s ぐらいは出るので、NFSはやや遅め。

# dd if=/dev/zero of=dummy bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 233.708 s, 4.6 MB/s

# dd if=/dev/zero of=dummy bs=1M count=1024
1024+0 レコード入力
1024+0 レコード出力
1073741824 バイト (1.1 GB) コピーされました、 140.832 秒、 7.6 MB/秒

LANDISKがSPOF

NFS bootに変更したことで microSD には書き込まなくなったので、Raspberry Pi側の耐久性はかなり向上したと思う。

問題は NFSサーバー側。余り物の LANDISK なので寿命が心配だし、壊れた場合には同一製品は再入手困難。まだ入手可能な HDL2-A シリーズは中身がいじれるようなので、壊れたらこちらを買うかな…
(追記:最近の機種はDLNA絡みでセキュリティが強化されてて telnetd 追加できないっぽい。残念)

追記:ネットワークアクセス頻度

muninサーバーが入っているRaspberry Pi2のネットワークアクセス頻度。17回/秒の書き込みが発生している。
監視対象を増やしたり、別のプログラムを走らせれば数倍にはなるから、microSDが壊れるのは当たり前か。

NFSに移行したおかげでmicroSD側へのアクセスはほぼ0になっているので、これでしばらく様子をみるつもり。

20160731-nfs2_client-day

参考リンク