User Tools

Site Tools


public:tech:openwrt-netboot

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
# 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.57.1

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…

public/tech/openwrt-netboot.txt · Last modified: 2024/03/06 12:05 by jenda

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki