====== Záchranné OpenWRT - netboot ======
Motivace: Přes NFS můžeme buď nabootovat plnohodnotnou distribuci (tomu se věnuje stránka [[:radar: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…