Blancco 7.15.1 upgrade: native kernel boot, BMC cloud licensing
- Switch to Blancco native kernel (vmlinuz-bde-linux) for hardware compat - Config.img preferences with BMC connection (classic.eu-west-1.blancco.cloud) - Disable wired LAN in preferences so WiFi takes default route to BMC - WiFi SSID INTERNETACCESS configured in plaintext in config.img - Slim GRUB EFI (1.3MB standalone with minimal modules) - Fix Windows line endings in blancco-init.sh - Add extra NIC drivers to switch_root initramfs - SSH enabled in modified airootfs.sfs (root:blancco) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,162 +1,168 @@
|
||||
#!/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
|
||||
insmod $mod 2>/dev/null
|
||||
done
|
||||
sleep 2
|
||||
|
||||
echo " Waiting for network interface..."
|
||||
IFACE=""
|
||||
COUNT=0
|
||||
while [ $COUNT -lt 30 ]; 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!"
|
||||
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)..."
|
||||
sed -i 's/^#*PermitRootLogin.*/PermitRootLogin yes/' /run/newroot/etc/ssh/sshd_config 2>/dev/null
|
||||
cat > /run/newroot/etc/rc.local << 'RCEOF'
|
||||
#!/bin/bash
|
||||
echo 'root:blancco' | chpasswd
|
||||
ssh-keygen -A 2>/dev/null
|
||||
IFACE=$(ls /sys/class/net/ | grep -v lo | head -1)
|
||||
ip addr add 10.9.100.250/24 dev "$IFACE" 2>/dev/null
|
||||
/usr/bin/sshd
|
||||
RCEOF
|
||||
chmod +x /run/newroot/etc/rc.local
|
||||
|
||||
ln -sf /usr/lib/systemd/system/rc-local.service /run/newroot/etc/systemd/system/multi-user.target.wants/rc-local.service 2>/dev/null
|
||||
cat > /run/newroot/etc/systemd/system/pxe-debug.service << 'SVCEOF'
|
||||
[Unit]
|
||||
Description=PXE Debug SSH
|
||||
After=systemd-networkd.service
|
||||
Wants=systemd-networkd.service
|
||||
|
||||
[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
|
||||
|
||||
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
|
||||
#!/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
|
||||
|
||||
Reference in New Issue
Block a user