Table of Contents
Záchranné OpenWRT - netboot
Motivace: Přes NFS můžeme buď nabootovat plnohodnotnou distribuci (tomu se věnuje stránka rp-netboot), nebo si můžeme trápení s NFS a nastavením mountu / po síti ušetřit a nabootovat minimalistickou live distribuci, která funguje z initramdisku, který se stahuje přes TFTP přímo bootloaderem.
OpenWRT
Když si kompilujete vlastní OpenWRT pro amd64, tak v make menuconfig můžete zaškrtnout Target Images → Ramdisk nebo tak něco, vyrobí to soubor openwrt-x86-64-generic-initramfs-kernel.bin a ten jde nabootovat jako ramdisk a běží to z něj. Oficiální obrazy ale tuhle volbu zaškrtnutou nemají a nabootovat bez rootfs device se mi to nepodařilo. Vlastní openwrt si kompilovat nechcete, protože pak nejdou instalovat jejich balíčky a zejména kernel moduly.
Bylo zjištěno, že ty obrazy se liší pouze přítomností souboru /init v initramdiku (ten co chceme ho má, oficiální buildy ho nemají).
Pořídíme si soubory z https://archive.openwrt.org/releases/23.05.1/targets/x86/64/
- xxx-x86-64-generic-kernel.bin
- rozbalený rootfs
V tom rozbalením rootfs vyrobíme /init (a asi chmod +x) s následujícím obsahem:
#!/bin/sh export INITRAMFS=1 # switch to tmpfs to allow run daemons in jail on initramfs boot DIRS=$(echo *) NEW_ROOT=/new_root mkdir -p $NEW_ROOT mount -t tmpfs tmpfs $NEW_ROOT cp -pr $DIRS $NEW_ROOT exec switch_root $NEW_ROOT /sbin/init
TODO v tom rootfs povolit v /etc/config/firewall připojení na SSH z WAN portu. A zakázat SSH s heslem/bez hesla (jen klíče) nebo vygenerovat silné náhodné heslo.
# cd rozbalený_root # find . -print0 | fakeroot cpio --null -o --format=newc | gzip -9 > ../initrd.gz
Připravíme si grub.cfg:
set timeout=2000 menuentry 'OpenWRT rescue' { linux kernel.bin console=ttyS0,115200 initrd initrd.gz }
Netboot
Chceme to bootovat z OpenWRT routeru (v našem případě console), který poskytne TFTP.
V /etc/dnsmasq.conf přidáme:
enable-tftp tftp-root=/tmp/tftp dhcp-boot=grubnetx64.efi,,192.168.60.30 # IP adresa console, pozor že někde je historicky .57. a na radarech s blade je to asi .40.
Pro OpenWRT>=23, které má dnsmasq v ujailu, jsem vymyslel jen do /etc/init.d/dnsmasq přidat to do procd_add_jail_mount
Do /tmp/tftp nakopírujeme potřebné soubory:
ssh $1 "mkdir -p /tmp/tftp/grub" scp -O grub.cfg $1:/tmp/tftp/grub/ SCP="rsync -zz --inplace -avhPe ssh" $SCP /usr/lib/grub/x86_64-efi/monolithic/grubnetx64.efi $1:/tmp/tftp/ $SCP openwrt-22.03.5-x86-64-generic-kernel.bin $1:/tmp/tftp/kernel.bin $SCP initrd.gz $1:/tmp/tftp/
A mělo by to bootovat…