Jak na boot Raspberry Pi ze sítě

Proč?

Doma používám Raspberry Pi k mnoha účelům – vzdálený SDR server, ADS-B přijímač, přijímač dat z meteostanice, audioserver, webkamera atd. – a často jsem se setkával s tím, že mi na RPi odchází SD karty. Jedno z možných řešení této nepříjemné situace je vyzkoušet boot ze sítě. Vzhledem k tomu, že mám server běžící 24×7 a jsem tak trochu maximalista, byl pro mě netboot jasná volba.

Předpoklady

Vycházel jsem z návodů, které byly pro RPi 3, ale nakonec to dopadlo tak, že by to mohlo fungovat i na jedničce. Otestoval jsem však jen na RPi 2. Takže moje konfigurace je následující:

  1. Raspberry Pi verze 2, SD karta s nainstalovaným a funkčním Raspbianem Lite
  2. Linuxový server s nainstalovaným NFS serverem

Jak na to

Vlastně to je docela jednoduché – shrňme to do několika kroků:

  1. obsah SD karty z RPi zkopírovat do adresáře na serveru, který zpřístupníme jako NFS export
  2. upravit cmdline.txt v boot partiton na SD kartě RPi
  3. upravit /etc/fstab nakopírovaný do adresáře na serveru

Fakt jen tyto tři kroky! A ano, bystřejší si již všimli, že ze sítě vlastně nebudeme bootovat, ale jen namountujeme root. To nicméně řeší v zásadě všechny důvody, proč bychom ze sítě chtěli bootovat, vyjma ceny SD karty, kterou ale považuji za zanedbatelnou. V této situaci vám totiž bude stačit klidně pársetmegová kartička, jejíž cena bude v řádu desetikorun.

1 – Zkopírovat systém na server

Aby se zachovala oprávnění, použijme rsync:
sudo rsync -xa --progress /mnt/sdkarta /nfs/rpi1
Zde je /mnt/sdkarta místo, kam jsme namountovali druhou partition s nainstalovaným raspbianem a /nfs/rpi1 adresář, který budeme exportovat jako NFS. To provedeme příkazem
echo "/nfs/rpi1 *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports

2 – upravit cmdline.txt na SD kartě RPi

Můžeme buď nabootovat RPi klasickým způsobem a soubor /boot/cmdline.txt zeditovat v systému, nebo soubor upravit v jiném počítači. Boot partition je první a je čitelná i ve Windows, neb je na ní FAT filesystém. Soubor cmdline.txt tedy upravte následovně – od příkazu root= vše umažte a nahraďte následujícím:
root=/dev/nfs nfsroot=192.168.0.250:/nfs/rpi1 rw ip=dhcp rootwait elevator=deadline
kde samozřejmě nfsroot ukazuje na IP vašeho serveru a adresář na výše vytvořený, ve kterém je nakopírovaný systém.

3 – upravit /etc/fstab na SD kartě RPi

Ze souboru /etc/fstab na druhé partition SD karty odmažte nebo zakomentujte řádek mountující root partition z SD karty. Boot partition zachováme tak, jak je – jen se přesvědčte, že existuje adresář /boot a je prázdný, aby bylo kam parition připojit. Defaultně vypadá řádek takto:
/dev/mmcblk0p2 / ext4 defaults,noatime 0 1

Závěr

A to je vše, přátelé. Zkuste restartovat malinu s takto upraveným obsahem SD karty a po restartu mrkněte na výstup příkazu mount – tím se přesvědčíte, že / (root) opravdu není namountován z /dev/mmcblk0p2, ale z NFS:
root@sdrpi2:/pub# mount
192.168.0.250:/nfs/sdrpi2 on / type nfs (rw,relatime,vers=2,rsize=4096,wsize=4096,namlen=255,hard,nolock,proto=udp,timeo=11,retrans=3,sec=sys,mountaddr=192.168.0.250,mountvers=1,mountproto=udp,local_lock=all,addr=192.168.0.250)
devtmpfs on /dev type devtmpfs (rw,relatime,size=462068k,nr_inodes=115517,mode=755)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,mode=755)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=22,pgrp=1,timeout=300,minproto=5,maxproto=5,direct)
debugfs on /sys/kernel/debug type debugfs (rw,relatime)
mqueue on /dev/mqueue type mqueue (rw,relatime)
configfs on /sys/kernel/config type configfs (rw,relatime)

Doplnění 29.12.2016 – konverze existující maliny na NFS root

Na serveru vytvořit adresář a vyexportovat jako NFS:

  1. sudo mkdir /nfs/webcam
  2. echo "/nfs/webcam *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports
  3. sudo exportfs -a

Na malině namountovat NFS share, zkopírovat na něj běžící systém, upravit fstab a cmdline.txt:

  1. sudo mkdir /mnt/dest
  2. sudo mount -t nfs 192.168.0.250:/nfs/webcam /mnt/dest -o nolock
  3. sudo rsync -xa --progress --exclude /mnt / /mnt/dest
  4. + upravit /etc/fstab a /boot/cmdline podle výše uvedeného postupu.
  5. sudo reboot – a hotovo!