それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

raspberryPiをNFSで起動する。

raspberry pi ってすべてがSDカードで怖い

SDカードってすぐデータ破損するんだよね。とくにFATのSDカードとかほんとうに怖い。

WindowsでSDカードを使ってるとほんとうによく破損した。あの恐怖感が忘れられない。

raspberry pi ファイルシステムNFSブートする。

だったら、SDカードじゃなくてNFSディスクやUSB−HDD(このエントリに最後に言及)を使えば安心じゃん?ってことでやってみる。

RPi のSDカードの構造

RaspberryのSDカードにはパーティションが2つあって。

  1. boot 呼ばれる起動用ディスク(FAT)
  2. ext3(ext4) で出来たLinuxのディスク

このうち、1の部分は、Raspberry pi の起動に大事な部分。

パーティションが1のFAT領域はRaspberryPi(ARM)のBIOSの役割を果たしていると思ってください。

パーティション2のext4部分は起動後にmountするので、変更が可能

/dev/mmcblk0p1 さえアレば、何とかなりそう。

RPi はARMプロセッサなのでBIOS相当のものがない。(と理解して下さい。*1

BIOS無い上に、ネットワークカードも機能が限られておりPXEブートもできない。

そのため完全なSDディスクレスブートは期待できないようです。

完全ディスクレスをするのは不可能ですが、FATのパーティション1さえSDにあれば、起動はする。これでNFS側においたRaspbian を扱えるようです。

起動中の raspberry Pi を NFS に移動

NFSサーバー側で /var/exports/raspbian を用意

NFS サーバー /etc/exports に追記

設定を追加して

/var/exports/raspbian          *(rw,sync,no_root_squash,no_subtree_check)

nfs をリロードして

sudo /etc/init.d/nfs-kernel-server reload

nfs のリロードの結果を確認

sudo exportfs -v

RPi 側で、NFSをマウントする。

NFS をマウントする準備

sudo apt-get install  rpcbind nfs-common
sudo update-rc.d rpcbind enable && update-rc.d nfs-common enable
sudo reboot

NFS マウントする

sudo mount 192.168.21.19:/var/exports/raspbian /mnt

NFS サーバーに、現在のRaspbianをコピーする

sudo rsync -av --progress --partial  /. /mnt/.
sudo cp -axv /dev/. /mnt/dev/.

起動オプションを変更する。

起動オプションを変更して、SDカードの起動時に、sdカード内のext4 をマウントせずに、NFSをマウントするようにする

SDカードの先頭パーティション(FAT)が/boot にマウントされていることを確認。

mount  | grep boot
/dev/mmcblk0p1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)

起動オプションをバックアップ

sudo cp /boot/cmdline.txt /boot/cmdline.txt.back

現在の起動オプション

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

これを、NFSをするように変更

dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1  root=/dev/nfs rootfstype=nfs nfsroot=192.168.21.19:/var/export/raspbian,udp,vers=3 smsc95xx.turbo_mode=N ip=dhcp elevator=deadline rootwait

最後に /etc/fstab の変更

NFSサーバー側にコピーしたRaspberryPiのイメージで の fstab を変更しないといけない。

そのままの /etc/fstab はこれ。

proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1

このままだと、せっかく、NFS側に起動イメージを取りに行くのに、SDカードがマウントされそう。

/mnt/etc/fstab/

Raspberry pi 側でNFSをマウントした状態で

sudo vim /mnt/etc/fstab/
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
#/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1 # ←コメントアウト

LANケーブルをRPiに挿したら準備完了

もちろんWifiは使えないからね。

sudo reboot

NFS側から起動する

NFS側から起動したら、スワップ作ったり、書き込みをしてみたり。

NFS側から起動するようにしておけば、SDカードを差し替えずにXBMC raspberry Piや、Arch Linuxに差し替えられるから便利ですね。

まぁ、いろいろやったけど、Wifiで使うのが一番便利だからNFSはそこまで多用しないと思うけど。。。

USB メモリやUSB−HDDを使う。

NFSでcmdline.txtを使えば、起動ディスクに Linuxのルートファイルシステムを用意しないでいいとわかる。

つまり、おなじようにやれば、 /bootだけを書いた512MB 程度のSDカードとUSB−HDDがアレば十分だとわかる。

cmdline.txt

boot=/dev/mmcblk0p1 disk=/dev/sda1 (ry

などとすれば、簡単にUSB−HDDをつかったNASが作れることがわかる。。LinuxのルートファイルシステムごとUSB側に行けるの便利そう。今度試してみようっかな。

玄箱もいい加減に限界だしね。

参考資料

Boot Raspberry Pi over NFS - WhaleBlubber

http://wiki.xbmc.org/index.php?title=HOW-TO

*1:*ブートローダーが無いというほうが正確だと思う。