Files
zosbuilder/scripts/install-firmware-minimal.sh
Jan De Landtsheer 91d20b9226 fix: resolve kernel module installation and packaging issues
- Fixed resolve-module-dependencies.sh to handle missing modules gracefully
- Removed destructive 'set -e' behavior that caused immediate exit on missing modules
- Enhanced install-firmware-minimal.sh to handle partial success scenarios
- Fixed install-packages.sh to preserve installed kernel modules (was deleting them)
- Improved setup-initramfs.sh to ensure modules directory always exists
- Now successfully installs 43 essential kernel modules in final initramfs
- Fixes 'depmod: ERROR: could not open directory /lib/modules' boot issue

All kernel modules (.ko files) are now properly included in the final cpio archive.
2025-08-22 16:39:11 +02:00

175 lines
6.8 KiB
Bash
Executable File

#!/bin/bash
set -e
INITRAMFS_ROOT="/build/initramfs"
FIRMWARE_DIR="$INITRAMFS_ROOT/lib/firmware"
echo "[+] Installing minimal network firmware (not full 600MB package)..."
# Create firmware directory
mkdir -p "$FIRMWARE_DIR"
# Install full linux-firmware temporarily to extract essentials
echo " Downloading and extracting linux-firmware package..."
cd /tmp
if apk fetch linux-firmware 2>/dev/null; then
firmware_file=$(ls linux-firmware-*.apk 2>/dev/null | head -1)
if [ -f "$firmware_file" ]; then
tar -xf "$firmware_file"
echo " Firmware package extracted successfully"
FIRMWARE_AVAILABLE=true
else
echo " Warning: Failed to extract linux-firmware package"
FIRMWARE_AVAILABLE=false
fi
else
echo " Warning: Failed to download linux-firmware package (network/repo issue)"
FIRMWARE_AVAILABLE=false
fi
# Extract only essential network firmware
if [ "$FIRMWARE_AVAILABLE" = "true" ]; then
echo " Installing essential network drivers..."
# Intel Ethernet (most common)
if [ -d lib/firmware/intel ]; then
mkdir -p "$FIRMWARE_DIR/intel"
# e1000e, ixgbe, i40e, ice drivers
find lib/firmware/intel -name "*e1000*" -exec cp {} "$FIRMWARE_DIR/intel/" \; 2>/dev/null || true
find lib/firmware/intel -name "*ixgbe*" -exec cp {} "$FIRMWARE_DIR/intel/" \; 2>/dev/null || true
find lib/firmware/intel -name "*i40e*" -exec cp {} "$FIRMWARE_DIR/intel/" \; 2>/dev/null || true
find lib/firmware/intel -name "*ice*" -exec cp {} "$FIRMWARE_DIR/intel/" \; 2>/dev/null || true
intel_size=$(du -sh "$FIRMWARE_DIR/intel" 2>/dev/null | cut -f1 || echo "0")
echo " Intel ethernet firmware: $intel_size"
fi
# Realtek Ethernet
if [ -d lib/firmware/rtl_nic ]; then
mkdir -p "$FIRMWARE_DIR/rtl_nic"
# r8169 driver
cp lib/firmware/rtl_nic/* "$FIRMWARE_DIR/rtl_nic/" 2>/dev/null || true
realtek_size=$(du -sh "$FIRMWARE_DIR/rtl_nic" 2>/dev/null | cut -f1 || echo "0")
echo " Realtek ethernet firmware: $realtek_size"
fi
# Broadcom Ethernet (bnx2, tigon)
if [ -d lib/firmware/bnx2 ]; then
mkdir -p "$FIRMWARE_DIR/bnx2"
cp lib/firmware/bnx2/* "$FIRMWARE_DIR/bnx2/" 2>/dev/null || true
fi
if [ -d lib/firmware/tigon ]; then
mkdir -p "$FIRMWARE_DIR/tigon"
cp lib/firmware/tigon/* "$FIRMWARE_DIR/tigon/" 2>/dev/null || true
fi
# Broadcom tg3 firmware
if [ -d lib/firmware ]; then
find lib/firmware -name "tigon3*" -exec cp {} "$FIRMWARE_DIR/" \; 2>/dev/null || true
fi
# Essential system firmware
if [ -f lib/firmware/regulatory.db ]; then
cp lib/firmware/regulatory.db* "$FIRMWARE_DIR/" 2>/dev/null || true
fi
else
echo " Skipping firmware installation due to download failure"
fi
# Cleanup temporary files
cd /build
rm -rf /tmp/lib /tmp/linux-firmware-*
# Show firmware size
if [ -d "$FIRMWARE_DIR" ]; then
total_size=$(du -sh "$FIRMWARE_DIR" 2>/dev/null | cut -f1)
file_count=$(find "$FIRMWARE_DIR" -type f | wc -l)
echo "[+] Essential firmware installed: $total_size ($file_count files vs 600MB full package)"
else
echo "[-] Warning: No firmware installed"
fi
# Install essential kernel modules using automatic dependency resolution
echo " Installing essential kernel modules with automatic dependency resolution..."
KERNEL_VERSION=$(cat /build/configs/kernel-version)
MODULES_DIR="$INITRAMFS_ROOT/lib/modules/${KERNEL_VERSION}-Zero-OS"
KERNEL_BUILD_DIR="/build/kernel/linux-${KERNEL_VERSION}"
if [ -d "$KERNEL_BUILD_DIR" ]; then
echo " Using modinfo-based dependency resolver..."
# Use the automatic dependency resolver with essential modules list
echo " Running automatic module dependency resolution..."
if /build/scripts/resolve-module-dependencies.sh \
-k "$KERNEL_BUILD_DIR" \
-m "$MODULES_DIR" \
-v "${KERNEL_VERSION}-Zero-OS" \
/build/configs/modules-essential.list; then
# Count installed modules to verify some success
module_count=$(find "$MODULES_DIR" -name "*.ko" 2>/dev/null | wc -l)
if [ "$module_count" -gt 0 ]; then
echo " ✓ Automatic module dependency resolution completed successfully"
echo " Installed $module_count kernel modules with complete dependency chains"
else
echo " ⚠ Module dependency resolution completed but no modules found"
echo " This might indicate kernel build directory issues"
fi
# Create modules.dep and modules.alias for module loading
echo " Creating module dependency files..."
if command -v depmod >/dev/null 2>&1; then
depmod -a -b "$INITRAMFS_ROOT" "${KERNEL_VERSION}-Zero-OS" 2>/dev/null || true
fi
# Create basic module files if depmod failed
if [ ! -f "$MODULES_DIR/modules.dep" ]; then
touch "$MODULES_DIR/modules.dep"
touch "$MODULES_DIR/modules.alias"
touch "$MODULES_DIR/modules.symbols"
fi
else
echo " ⚠ Automatic dependency resolution failed, falling back to manual installation"
# Fallback to minimal manual installation
mkdir -p "$MODULES_DIR/kernel/drivers/net"
mkdir -p "$MODULES_DIR/kernel/drivers/block"
mkdir -p "$MODULES_DIR/kernel/net"
# Install only the most critical modules manually if they exist
for module in tun e1000e virtio_net overlay; do
find "$KERNEL_BUILD_DIR" -name "${module}.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/" \; 2>/dev/null || true
done
# Install virtio block driver
find "$KERNEL_BUILD_DIR" -name "virtio_blk.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/block/" \; 2>/dev/null || true
module_count=$(find "$MODULES_DIR" -name "*.ko" 2>/dev/null | wc -l)
echo " Fallback: Installed $module_count essential modules"
# Create basic module dependency files for depmod compatibility
echo " Creating basic module dependency files..."
touch "$MODULES_DIR/modules.dep"
touch "$MODULES_DIR/modules.alias"
touch "$MODULES_DIR/modules.symbols"
touch "$MODULES_DIR/modules.builtin"
touch "$MODULES_DIR/modules.devname"
fi
else
echo " Warning: Kernel build directory not found at $KERNEL_BUILD_DIR"
# Still create the modules directory structure for depmod compatibility
echo " Creating minimal modules directory structure..."
mkdir -p "$MODULES_DIR"
touch "$MODULES_DIR/modules.dep"
touch "$MODULES_DIR/modules.alias"
touch "$MODULES_DIR/modules.symbols"
touch "$MODULES_DIR/modules.builtin"
touch "$MODULES_DIR/modules.devname"
fi
# Create essential kernel module directories that eudev expects
mkdir -p "$INITRAMFS_ROOT/lib/modules"
mkdir -p "$INITRAMFS_ROOT/sys/module"
mkdir -p "$INITRAMFS_ROOT/dev"
echo "[+] Minimal firmware and driver installation complete"