User reports Blancco was working before our mirror/session activity
today - then my attempted fixes (grubx64.efi rebuild, kexec-initrd
driver sweep, verbose blancco-init.sh) made it worse:
- First attempt (narrow igc driver add) did not help because the
switch-root path was not the one actually loaded by grubx64.efi's
embedded config.
- Second attempt (swapped grub embedded config to Ubuntu-kernel path)
got further, but then kexec-initrd modules failed on insmod.
- Third attempt (full ethernet tree sweep) pulled in broken ancient
drivers (winbond-840, w5100-spi, xirc2ps_cs) that failed with
unknown-symbol errors and prevented good drivers from loading.
Full revert: .gitignore, blancco-init.sh, pxe_server_setup.yml back to
the pre-session commit 6dcf832 state. Removes boot-tools/blancco/grub-
blancco.cfg from git (it was only added this session).
Runtime on both PXE servers was also restored: grubx64.efi and
kexec-initrd.img reverted from the .bak files taken before each
modification this session.
Whatever was there before today is now restored byte-for-byte on both
servers. If there is still a Blancco boot issue on specific modern
hardware that the user needs to fix, we will diagnose that narrowly
against the actual failure mode on that specific machine, not by
making sweeping preemptive changes.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
169 lines
4.8 KiB
Bash
169 lines
4.8 KiB
Bash
#!/bin/sh
|
|
# Blancco PXE Loader - init script for custom initramfs
|
|
# Boot chain: iPXE -> GRUB EFI -> Ubuntu kernel + this initramfs -> switch_root to Blancco
|
|
#
|
|
# Blancco's own kernel freezes on Dell Precision towers during PXE boot.
|
|
# Workaround: boot Ubuntu kernel, download Blancco rootfs (squashfs), mount
|
|
# overlay filesystem, and switch_root into Blancco's userspace.
|
|
|
|
export PATH=/bin:/sbin
|
|
|
|
echo ""
|
|
echo "============================================"
|
|
echo " Blancco PXE loader"
|
|
echo "============================================"
|
|
echo ""
|
|
|
|
mount -t proc proc /proc
|
|
mount -t sysfs sysfs /sys
|
|
mount -t devtmpfs devtmpfs /dev 2>/dev/null
|
|
mkdir -p /tmp /run
|
|
|
|
echo "[1/4] Loading NIC drivers..."
|
|
for mod in /lib/modules/*.ko; do
|
|
echo " insmod $(basename $mod)"
|
|
insmod $mod 2>/dev/null || true
|
|
done
|
|
sleep 5
|
|
|
|
echo " Interfaces after driver load:"
|
|
ls /sys/class/net/ 2>/dev/null
|
|
|
|
echo " Waiting for network interface..."
|
|
IFACE=""
|
|
COUNT=0
|
|
while [ $COUNT -lt 60 ]; do
|
|
for i in /sys/class/net/*; do
|
|
ifname="${i##*/}"
|
|
if [ "$ifname" != "lo" ] && [ -d "$i" ]; then
|
|
IFACE=$ifname
|
|
break 2
|
|
fi
|
|
done
|
|
COUNT=$((COUNT + 1))
|
|
sleep 1
|
|
echo -n "."
|
|
done
|
|
echo ""
|
|
|
|
if [ -z "$IFACE" ]; then
|
|
echo "ERROR: No network interface found!"
|
|
echo "Available interfaces:"
|
|
ls /sys/class/net/ 2>/dev/null
|
|
exec sh
|
|
fi
|
|
|
|
echo " Interface: $IFACE"
|
|
ip link set $IFACE up
|
|
sleep 2
|
|
|
|
SERVER=10.9.100.1
|
|
ifconfig $IFACE 10.9.100.250 netmask 255.255.255.0 up
|
|
sleep 1
|
|
echo " IP: 10.9.100.250"
|
|
|
|
echo "[2/4] Downloading Blancco rootfs (666MB)..."
|
|
wget -O /tmp/airootfs.sfs http://$SERVER/blancco/arch/x86_64/airootfs.sfs 2>&1
|
|
if [ ! -s /tmp/airootfs.sfs ]; then
|
|
echo "ERROR: Failed to download rootfs!"
|
|
exec sh
|
|
fi
|
|
echo " OK ($(wc -c < /tmp/airootfs.sfs) bytes)"
|
|
|
|
echo "[3/4] Mounting rootfs..."
|
|
mkdir -p /run/lower /run/upper /run/work /run/newroot
|
|
|
|
losetup /dev/loop0 /tmp/airootfs.sfs
|
|
mount -t squashfs -o ro /dev/loop0 /run/lower
|
|
if [ $? -ne 0 ]; then
|
|
echo "ERROR: squashfs mount failed!"
|
|
exec sh
|
|
fi
|
|
|
|
insmod /lib/modules/overlay.ko 2>/dev/null
|
|
mount -t tmpfs -o size=50% tmpfs /run/upper
|
|
mkdir -p /run/upper/upper /run/upper/work
|
|
|
|
mount -t overlay overlay -o lowerdir=/run/lower,upperdir=/run/upper/upper,workdir=/run/upper/work /run/newroot
|
|
if [ $? -ne 0 ]; then
|
|
echo "ERROR: overlay mount failed!"
|
|
exec sh
|
|
fi
|
|
|
|
echo "[4/5] Installing kernel modules (132MB)..."
|
|
wget -O /tmp/kmod.tar.gz http://$SERVER/blancco/kmod.tar.gz 2>&1
|
|
if [ -s /tmp/kmod.tar.gz ]; then
|
|
cd /run/newroot
|
|
gunzip -c /tmp/kmod.tar.gz | tar xf -
|
|
rm -f /tmp/kmod.tar.gz
|
|
cd /
|
|
echo " OK"
|
|
else
|
|
echo " WARNING: Failed to download kernel modules"
|
|
fi
|
|
|
|
echo "[5/6] Switching root to Blancco..."
|
|
mkdir -p /run/newroot/run /run/newroot/proc /run/newroot/sys /run/newroot/dev /run/newroot/tmp
|
|
|
|
echo "[6/6] Downloading Blancco config..."
|
|
wget -O /run/newroot/albus/config.xml http://$SERVER/blancco/config-clean.xml 2>&1
|
|
wget -O /run/newroot/albus/preferences.xml http://$SERVER/blancco/preferences.xml 2>&1
|
|
if [ -s /run/newroot/albus/config.xml ]; then
|
|
echo " config.xml: $(wc -c < /run/newroot/albus/config.xml) bytes"
|
|
else
|
|
echo " WARNING: Failed to download config.xml"
|
|
fi
|
|
if [ -s /run/newroot/albus/preferences.xml ]; then
|
|
cp -f /run/newroot/albus/preferences.xml /run/newroot/albus/preferences.save
|
|
echo " preferences.xml: $(wc -c < /run/newroot/albus/preferences.xml) bytes"
|
|
else
|
|
echo " WARNING: Failed to download preferences.xml"
|
|
fi
|
|
|
|
# Pre-configure X.org to use modesetting driver (generic KMS, works with all GPUs)
|
|
mkdir -p /run/newroot/etc/X11/xorg.conf.d
|
|
echo " X.org: forcing modesetting driver"
|
|
cat > /run/newroot/etc/X11/xorg.conf.d/20-failsafeDriver.conf << 'XEOF'
|
|
Section "Device"
|
|
Identifier "Failsafe Video Device"
|
|
Driver "modesetting"
|
|
EndSection
|
|
XEOF
|
|
|
|
# Enable SSH for remote debugging
|
|
echo " Enabling SSH (root:blancco)..."
|
|
if [ -f /run/newroot/etc/ssh/sshd_config ]; then
|
|
sed 's/^#*PermitRootLogin.*/PermitRootLogin yes/' /run/newroot/etc/ssh/sshd_config > /run/newroot/etc/ssh/sshd_config.new || true
|
|
mv /run/newroot/etc/ssh/sshd_config.new /run/newroot/etc/ssh/sshd_config || true
|
|
fi
|
|
|
|
cat > /run/newroot/etc/rc.local << 'RCEOF'
|
|
#!/bin/bash
|
|
echo 'root:blancco' | chpasswd
|
|
ssh-keygen -A 2>/dev/null
|
|
/usr/bin/sshd 2>/dev/null
|
|
RCEOF
|
|
chmod +x /run/newroot/etc/rc.local
|
|
|
|
cat > /run/newroot/etc/systemd/system/pxe-debug.service << 'SVCEOF'
|
|
[Unit]
|
|
Description=PXE Debug SSH
|
|
After=network.target
|
|
|
|
[Service]
|
|
Type=oneshot
|
|
RemainAfterExit=yes
|
|
ExecStart=/etc/rc.local
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
SVCEOF
|
|
ln -sf /etc/systemd/system/pxe-debug.service /run/newroot/etc/systemd/system/multi-user.target.wants/pxe-debug.service 2>/dev/null
|
|
|
|
mount --move /proc /run/newroot/proc
|
|
mount --move /sys /run/newroot/sys
|
|
mount --move /dev /run/newroot/dev
|
|
|
|
echo " Starting Blancco..."
|
|
exec switch_root /run/newroot /sbin/init
|