Blancco: playbook now produces working Ubuntu-kernel initramfs out of the box
Companion to the previous commit (4550d43). Three files that should have
been in the same commit but got left out of `git add`:
- .gitignore: negate rule for boot-tools/blancco/grub-blancco.cfg so the
tracked cfg (source of truth for grubx64.efi rebuilds) survives
the blanket boot-tools/ ignore.
- playbook/blancco-init.sh: rewritten for modprobe-with-deps, full NIC
driver coverage, set -x trace to /dev/console, dmesg + PCI-device +
/proc/modules dump + interactive shell on "no NIC after 60s".
Replaces the narrow insmod-loop version that silently hung on
unsupported NICs.
- playbook/pxe_server_setup.yml "Build Blancco PXE initramfs" task now
sweeps the full drivers/net/ tree (ethernet + phy + mdio + usb + fddi
+ wan) plus overlay / squashfs / loop / ptp / libphy / mii deps, runs
depmod to regenerate modules.dep inside the initramfs (required for
modprobe dependency resolution), and symlinks the full applet list
blancco-init.sh needs (modprobe, insmod, dmesg, find, env, etc).
Result: ~20 MB initramfs vs the old 2 MB narrow build.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -700,42 +700,66 @@
|
||||
# Boot Ubuntu kernel, download Blancco rootfs, overlay mount, switch_root.
|
||||
|
||||
- name: "Build Blancco PXE initramfs"
|
||||
# The narrow hand-picked NIC driver list used before 2026-04-22 produced
|
||||
# a 2 MB initramfs that hung on "waiting for network interface" for any
|
||||
# hardware outside e1000e/igb/tg3/bnx2/bnxt_en/b44. This rewrite sweeps
|
||||
# the full drivers/net/ tree (ethernet + phy + mdio + usb + fddi + wan)
|
||||
# plus overlay / squashfs / loop / ptp / libphy / mii deps, runs depmod
|
||||
# so blancco-init.sh can use modprobe with proper dependency resolution,
|
||||
# and produces a ~20 MB initramfs. Size isn't a concern - HTTP loads it
|
||||
# in under two seconds at gigabit, versus the many minutes of hangtime
|
||||
# the narrow build cost us when a NIC was unsupported.
|
||||
args:
|
||||
executable: /bin/bash
|
||||
creates: "{{ web_root }}/blancco/kexec-initrd.img"
|
||||
shell: |
|
||||
set -e
|
||||
WORK=$(mktemp -d)
|
||||
mkdir -p "$WORK"/{bin,lib/modules,lib64,sbin,usr/share/udhcpc}
|
||||
KVER=$(uname -r)
|
||||
mkdir -p "$WORK"/{bin,lib/modules/$KVER/kernel,lib64,sbin,usr/share/udhcpc,etc,run,proc,sys,dev}
|
||||
|
||||
# Busybox (static) - bundled on USB at playbook/busybox-static
|
||||
if [ -f /bin/busybox ]; then
|
||||
cp /bin/busybox "$WORK/bin/"
|
||||
cp /bin/busybox "$WORK/bin/busybox"
|
||||
elif [ -f "{{ usb_root }}/playbook/busybox-static" ]; then
|
||||
cp "{{ usb_root }}/playbook/busybox-static" "$WORK/bin/busybox"
|
||||
chmod +x "$WORK/bin/busybox"
|
||||
else
|
||||
echo "ERROR: No busybox available (not at /bin/busybox or on USB)"
|
||||
exit 1
|
||||
fi
|
||||
for cmd in sh awk cat chmod echo grep gunzip ifconfig ip ln losetup ls mkdir mknod mount reboot route sed sleep switch_root tar udhcpc umount wget cpio; do
|
||||
chmod +x "$WORK/bin/busybox"
|
||||
# All applets blancco-init.sh uses: modprobe, insmod, dmesg, find, env
|
||||
# and export added vs the old narrow list.
|
||||
for cmd in sh ash awk cat chmod cp dd echo grep gunzip ifconfig ip insmod ln losetup ls mkdir mknod modprobe mount mv reboot rm rmdir route sed sleep switch_root tar udhcpc umount wget cpio dmesg env export find; do
|
||||
ln -sf busybox "$WORK/bin/$cmd"
|
||||
done
|
||||
|
||||
# NIC drivers (common server NICs)
|
||||
KVER=$(uname -r)
|
||||
KMOD="/lib/modules/$KVER/kernel/drivers/net/ethernet"
|
||||
for drv in intel/e1000e/e1000e.ko.zst intel/igb/igb.ko.zst broadcom/tg3.ko.zst broadcom/bnx2.ko.zst broadcom/bnxt/bnxt_en.ko.zst broadcom/b44.ko.zst; do
|
||||
if [ -f "$KMOD/$drv" ]; then
|
||||
zstd -d "$KMOD/$drv" -o "$WORK/lib/modules/$(basename ${drv%.zst})" 2>/dev/null
|
||||
# Full drivers/net/ tree - ethernet + phy + mdio + usb + fddi + wan.
|
||||
# Preserve path under /lib/modules/$KVER so depmod can resolve deps.
|
||||
NETDIR=/lib/modules/$KVER/kernel/drivers/net
|
||||
for sub in ethernet mdio phy usb fddi wan; do
|
||||
if [ -d "$NETDIR/$sub" ]; then
|
||||
mkdir -p "$WORK/lib/modules/$KVER/kernel/drivers/net/$sub"
|
||||
cp -r "$NETDIR/$sub/"* "$WORK/lib/modules/$KVER/kernel/drivers/net/$sub/" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
# Overlay + squashfs + loop + usb + hid + ptp + mii + net/core deps
|
||||
for modpath in fs/overlayfs fs/squashfs drivers/block drivers/usb/core drivers/usb/host drivers/hid drivers/ptp drivers/net/mii.ko net/core; do
|
||||
if [ -e "/lib/modules/$KVER/kernel/$modpath" ]; then
|
||||
mkdir -p "$WORK/lib/modules/$KVER/kernel/$(dirname $modpath)"
|
||||
cp -r "/lib/modules/$KVER/kernel/$modpath" "$WORK/lib/modules/$KVER/kernel/$modpath" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
|
||||
# Overlay module
|
||||
OVMOD="/lib/modules/$KVER/kernel/fs/overlayfs/overlay.ko.zst"
|
||||
if [ -f "$OVMOD" ]; then
|
||||
zstd -d "$OVMOD" -o "$WORK/lib/modules/overlay.ko" 2>/dev/null
|
||||
fi
|
||||
# Decompress zstd modules in-place (busybox insmod can't handle .zst)
|
||||
find "$WORK/lib/modules" -name '*.ko.zst' -print0 | \
|
||||
xargs -0 -I {} sh -c 'zstd -d --rm -o "${1%.zst}" "$1" 2>/dev/null' _ {} || true
|
||||
|
||||
# Preserve modules.builtin / modules.order, regenerate modules.dep so
|
||||
# modprobe can resolve dependencies inside the initramfs.
|
||||
cp /lib/modules/$KVER/modules.builtin "$WORK/lib/modules/$KVER/" 2>/dev/null || true
|
||||
cp /lib/modules/$KVER/modules.order "$WORK/lib/modules/$KVER/" 2>/dev/null || true
|
||||
(cd "$WORK" && depmod -b . $KVER) 2>/dev/null || echo "depmod warning (non-fatal)"
|
||||
|
||||
# Init script
|
||||
cp "{{ usb_root }}/playbook/blancco-init.sh" "$WORK/init"
|
||||
@@ -743,7 +767,8 @@
|
||||
|
||||
# Build CPIO
|
||||
cd "$WORK"
|
||||
find . | cpio -o -H newc 2>/dev/null | gzip > "{{ web_root }}/blancco/kexec-initrd.img"
|
||||
find . | cpio -o -H newc --quiet | gzip -1 > "{{ web_root }}/blancco/kexec-initrd.img"
|
||||
cd /
|
||||
rm -rf "$WORK"
|
||||
echo "Built kexec-initrd.img: $(stat -c %s '{{ web_root }}/blancco/kexec-initrd.img') bytes"
|
||||
ignore_errors: yes
|
||||
|
||||
Reference in New Issue
Block a user