- Added pps_core.ko module installation for PTP subsystem dependency - Updated grep patterns in both scripts to include 'pps' modules - Fixes 'Unknown symbol pps_register_source' errors for PTP functionality - Ensures complete PTP/PPS dependency chain for e1000e and other drivers
181 lines
8.7 KiB
Bash
Executable File
181 lines
8.7 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
|
|
apk fetch linux-firmware
|
|
firmware_file=$(ls linux-firmware-*.apk | head -1)
|
|
if [ -f "$firmware_file" ]; then
|
|
tar -xf "$firmware_file"
|
|
echo " Firmware package extracted successfully"
|
|
else
|
|
echo " Error: Failed to download linux-firmware package"
|
|
exit 1
|
|
fi
|
|
|
|
# Extract only essential network firmware
|
|
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
|
|
|
|
# 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 ethernet kernel modules
|
|
echo " Installing essential ethernet kernel modules..."
|
|
KERNEL_VERSION=$(cat /build/configs/kernel-version)
|
|
MODULES_DIR="$INITRAMFS_ROOT/lib/modules/${KERNEL_VERSION}-Zero-OS"
|
|
mkdir -p "$MODULES_DIR/kernel/drivers/net/ethernet"
|
|
mkdir -p "$MODULES_DIR/kernel/drivers/net"
|
|
|
|
# Copy essential ethernet driver modules from the built kernel
|
|
KERNEL_BUILD_DIR="/build/kernel/linux-${KERNEL_VERSION}"
|
|
if [ -d "$KERNEL_BUILD_DIR" ]; then
|
|
echo " Copying ethernet drivers from kernel build..."
|
|
|
|
# Intel drivers (e1000, e1000e, igb, ixgbe, i40e, ice)
|
|
find "$KERNEL_BUILD_DIR" -name "e1000.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
|
find "$KERNEL_BUILD_DIR" -name "e1000e.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
|
find "$KERNEL_BUILD_DIR" -name "igb.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
|
find "$KERNEL_BUILD_DIR" -name "ixgbe.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
|
find "$KERNEL_BUILD_DIR" -name "i40e.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
|
find "$KERNEL_BUILD_DIR" -name "ice.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
|
|
|
# Realtek drivers (r8169, 8139too, 8139cp)
|
|
find "$KERNEL_BUILD_DIR" -name "r8169.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
|
find "$KERNEL_BUILD_DIR" -name "8139too.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
|
find "$KERNEL_BUILD_DIR" -name "8139cp.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
|
|
|
# Broadcom drivers (bnx2, bnx2x, tg3, b44, b43, b43legacy)
|
|
find "$KERNEL_BUILD_DIR" -name "bnx2.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
|
find "$KERNEL_BUILD_DIR" -name "bnx2x.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
|
find "$KERNEL_BUILD_DIR" -name "tg3.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
|
find "$KERNEL_BUILD_DIR" -name "b44.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
|
|
|
# Atheros drivers (atl1, atl1e, atl1c, alx)
|
|
find "$KERNEL_BUILD_DIR" -name "atl1.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
|
find "$KERNEL_BUILD_DIR" -name "atl1e.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
|
find "$KERNEL_BUILD_DIR" -name "atl1c.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
|
find "$KERNEL_BUILD_DIR" -name "alx.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
|
|
|
# VirtIO network driver
|
|
find "$KERNEL_BUILD_DIR" -name "virtio_net.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/" \; 2>/dev/null || true
|
|
find "$KERNEL_BUILD_DIR" -name "virtio.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/" \; 2>/dev/null || true
|
|
find "$KERNEL_BUILD_DIR" -name "virtio_ring.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/" \; 2>/dev/null || true
|
|
find "$KERNEL_BUILD_DIR" -name "virtio_pci.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/" \; 2>/dev/null || true
|
|
|
|
# Common dependencies (mii, mdio, libphy)
|
|
find "$KERNEL_BUILD_DIR" -name "mii.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/" \; 2>/dev/null || true
|
|
find "$KERNEL_BUILD_DIR" -name "mdio.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/" \; 2>/dev/null || true
|
|
find "$KERNEL_BUILD_DIR" -name "libphy.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/" \; 2>/dev/null || true
|
|
|
|
# SCSI subsystem dependencies (for virtio_scsi)
|
|
mkdir -p "$MODULES_DIR/kernel/drivers/scsi"
|
|
find "$KERNEL_BUILD_DIR" -name "scsi_mod.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/scsi/" \; 2>/dev/null || true
|
|
find "$KERNEL_BUILD_DIR" -name "sd_mod.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/scsi/" \; 2>/dev/null || true
|
|
|
|
# PTP subsystem dependencies (for e1000e and other ethernet drivers)
|
|
mkdir -p "$MODULES_DIR/kernel/drivers/ptp"
|
|
mkdir -p "$MODULES_DIR/kernel/drivers/pps"
|
|
find "$KERNEL_BUILD_DIR" -name "ptp.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/ptp/" \; 2>/dev/null || true
|
|
find "$KERNEL_BUILD_DIR" -name "pps_core.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/pps/" \; 2>/dev/null || true
|
|
|
|
# Filesystem drivers (overlay for container support)
|
|
find "$KERNEL_BUILD_DIR" -name "overlay.ko" -exec cp {} "$MODULES_DIR/kernel/fs/" \; 2>/dev/null || true
|
|
|
|
# Tunnel drivers (tun for Mycelium networking)
|
|
find "$KERNEL_BUILD_DIR" -name "tun.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/" \; 2>/dev/null || true
|
|
|
|
# Create modules directories
|
|
mkdir -p "$MODULES_DIR/kernel/drivers"
|
|
mkdir -p "$MODULES_DIR/kernel/fs"
|
|
|
|
# Create modules.dep and modules.alias for module loading
|
|
echo " Creating module dependency files..."
|
|
if command -v depmod >/dev/null 2>&1; then
|
|
depmod -b "$INITRAMFS_ROOT" "${KERNEL_VERSION}-Zero-OS" 2>/dev/null || true
|
|
fi
|
|
|
|
# Create a simple modules.dep file if depmod is not available
|
|
if [ ! -f "$MODULES_DIR/modules.dep" ]; then
|
|
touch "$MODULES_DIR/modules.dep"
|
|
touch "$MODULES_DIR/modules.alias"
|
|
touch "$MODULES_DIR/modules.symbols"
|
|
fi
|
|
|
|
module_count=$(find "$MODULES_DIR" -name "*.ko" | wc -l)
|
|
echo " Installed $module_count ethernet driver modules"
|
|
|
|
# List installed modules for debugging
|
|
if [ $module_count -gt 0 ]; then
|
|
echo " Modules installed:"
|
|
find "$MODULES_DIR" -name "*.ko" -exec basename {} \; | sort | sed 's/^/ /'
|
|
fi
|
|
else
|
|
echo " Warning: Kernel build directory not found, modules may not be available"
|
|
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" |