raspberry pi ってすべてがSDカードで怖い
SDカードってすぐデータ破損するんだよね。とくにFATのSDカードとかほんとうに怖い。
WindowsでSDカードを使ってるとほんとうによく破損した。あの恐怖感が忘れられない。
raspberry pi ファイルシステムをNFSブートする。
だったら、SDカードじゃなくてNFSディスクやUSB−HDD(このエントリに最後に言及)を使えば安心じゃん?ってことでやってみる。
RPi のSDカードの構造
RaspberryのSDカードにはパーティションが2つあって。
このうち、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側に行けるの便利そう。今度試してみようっかな。
玄箱もいい加減に限界だしね。