#!/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