Embellishments for module dependencies and initramfs bootup sequence
- add recursive module dependencies based on porper tools (modinfo)
- fix zinit boot sequences
- /dev/shm mount for alpine-built haveged
- mycelium
- rfs copy fixes
- better sequencing overall (god I miss 'before:'
This commit is contained in:
@@ -100,4 +100,4 @@ fi
|
|||||||
|
|
||||||
echo "[+] switching root"
|
echo "[+] switching root"
|
||||||
echo " exec switch_root /mnt/root /sbin/zinit init"
|
echo " exec switch_root /mnt/root /sbin/zinit init"
|
||||||
exec switch_root /mnt/root /sbin/zinit -d init
|
exec switch_root /mnt/root /sbin/zinit init
|
||||||
41
configs/modules-essential.list
Normal file
41
configs/modules-essential.list
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# Essential kernel modules for Zero-OS Alpine initramfs
|
||||||
|
# This file contains a curated list of essential modules for network and storage functionality
|
||||||
|
# Comments are supported (lines starting with #)
|
||||||
|
|
||||||
|
# Network drivers - Intel
|
||||||
|
e1000
|
||||||
|
e1000e
|
||||||
|
igb
|
||||||
|
ixgbe
|
||||||
|
i40e
|
||||||
|
ice
|
||||||
|
|
||||||
|
# Network drivers - Realtek
|
||||||
|
r8169
|
||||||
|
8139too
|
||||||
|
8139cp
|
||||||
|
|
||||||
|
# Network drivers - Broadcom
|
||||||
|
bnx2
|
||||||
|
bnx2x
|
||||||
|
tg3
|
||||||
|
b44
|
||||||
|
|
||||||
|
# Network drivers - Atheros
|
||||||
|
atl1
|
||||||
|
atl1e
|
||||||
|
atl1c
|
||||||
|
alx
|
||||||
|
|
||||||
|
# VirtIO drivers
|
||||||
|
virtio_net
|
||||||
|
virtio_scsi
|
||||||
|
virtio_blk
|
||||||
|
|
||||||
|
# Tunnel and container support
|
||||||
|
tun
|
||||||
|
overlay
|
||||||
|
|
||||||
|
# Storage subsystem (essential only)
|
||||||
|
scsi_mod
|
||||||
|
sd_mod
|
||||||
3
configs/zinit/init/shm.sh
Normal file → Executable file
3
configs/zinit/init/shm.sh
Normal file → Executable file
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
mkdir /dev/shm
|
||||||
|
mount -t tmpfs shm /dev/shm
|
||||||
2
configs/zinit/lo.yaml
Normal file
2
configs/zinit/lo.yaml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
exec: ip l set lo up
|
||||||
|
oneshot: true
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
exec: ip netns exec public /usr/bin/mycelium --key-file /tmp/mycelium_priv_key.bin
|
exec: /usr/bin/mycelium --key-file /tmp/mycelium_priv_key.bin
|
||||||
--tun-name my0 --silent --peers tcp://188.40.132.242:9651 tcp://136.243.47.186:9651
|
--tun-name my0 --silent --peers tcp://188.40.132.242:9651 tcp://136.243.47.186:9651
|
||||||
tcp://185.69.166.7:9651 tcp://185.69.166.8:9651 tcp://65.21.231.58:9651 tcp://65.109.18.113:9651
|
tcp://185.69.166.7:9651 tcp://185.69.166.8:9651 tcp://65.21.231.58:9651 tcp://65.109.18.113:9651
|
||||||
tcp://209.159.146.190:9651 tcp://5.78.122.16:9651 tcp://5.223.43.251:9651 tcp://142.93.217.194:9651
|
tcp://209.159.146.190:9651 tcp://5.78.122.16:9651 tcp://5.223.43.251:9651 tcp://142.93.217.194:9651
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
exec: sh /etc/zinit/init/ntpd.sh
|
exec: sh /etc/zinit/init/ntpd.sh
|
||||||
after:
|
after:
|
||||||
- internet
|
- network
|
||||||
@@ -1 +1,2 @@
|
|||||||
exec: /etc/zinit/shm.sh
|
exec: /etc/zinit/init/shm.sh
|
||||||
|
oneshot: true
|
||||||
@@ -79,98 +79,56 @@ else
|
|||||||
echo "[-] Warning: No firmware installed"
|
echo "[-] Warning: No firmware installed"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Install essential ethernet kernel modules
|
# Install essential kernel modules using automatic dependency resolution
|
||||||
echo " Installing essential ethernet kernel modules..."
|
echo " Installing essential kernel modules with automatic dependency resolution..."
|
||||||
KERNEL_VERSION=$(cat /build/configs/kernel-version)
|
KERNEL_VERSION=$(cat /build/configs/kernel-version)
|
||||||
MODULES_DIR="$INITRAMFS_ROOT/lib/modules/${KERNEL_VERSION}-Zero-OS"
|
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}"
|
KERNEL_BUILD_DIR="/build/kernel/linux-${KERNEL_VERSION}"
|
||||||
|
|
||||||
if [ -d "$KERNEL_BUILD_DIR" ]; then
|
if [ -d "$KERNEL_BUILD_DIR" ]; then
|
||||||
echo " Copying ethernet drivers from kernel build..."
|
echo " Using modinfo-based dependency resolver..."
|
||||||
|
|
||||||
# Intel drivers (e1000, e1000e, igb, ixgbe, i40e, ice)
|
# Use the automatic dependency resolver with essential modules list
|
||||||
find "$KERNEL_BUILD_DIR" -name "e1000.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
if /build/scripts/resolve-module-dependencies.sh \
|
||||||
find "$KERNEL_BUILD_DIR" -name "e1000e.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
-k "$KERNEL_BUILD_DIR" \
|
||||||
find "$KERNEL_BUILD_DIR" -name "igb.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
-m "$MODULES_DIR" \
|
||||||
find "$KERNEL_BUILD_DIR" -name "ixgbe.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
-v "${KERNEL_VERSION}-Zero-OS" \
|
||||||
find "$KERNEL_BUILD_DIR" -name "i40e.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
/build/configs/modules-essential.list; then
|
||||||
find "$KERNEL_BUILD_DIR" -name "ice.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
|
||||||
|
|
||||||
# Realtek drivers (r8169, 8139too, 8139cp)
|
echo " ✓ Automatic module dependency resolution completed successfully"
|
||||||
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)
|
# Count installed modules
|
||||||
find "$KERNEL_BUILD_DIR" -name "bnx2.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
module_count=$(find "$MODULES_DIR" -name "*.ko" 2>/dev/null | wc -l)
|
||||||
find "$KERNEL_BUILD_DIR" -name "bnx2x.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
echo " Installed $module_count kernel modules with complete dependency chains"
|
||||||
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)
|
# Create modules.dep and modules.alias for module loading
|
||||||
find "$KERNEL_BUILD_DIR" -name "atl1.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
echo " Creating module dependency files..."
|
||||||
find "$KERNEL_BUILD_DIR" -name "atl1e.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
if command -v depmod >/dev/null 2>&1; then
|
||||||
find "$KERNEL_BUILD_DIR" -name "atl1c.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
depmod -b "$INITRAMFS_ROOT" "${KERNEL_VERSION}-Zero-OS" 2>/dev/null || true
|
||||||
find "$KERNEL_BUILD_DIR" -name "alx.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/ethernet/" \; 2>/dev/null || true
|
fi
|
||||||
|
|
||||||
# VirtIO network driver
|
# Create basic module files if depmod failed
|
||||||
find "$KERNEL_BUILD_DIR" -name "virtio_net.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/" \; 2>/dev/null || true
|
if [ ! -f "$MODULES_DIR/modules.dep" ]; then
|
||||||
find "$KERNEL_BUILD_DIR" -name "virtio.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/" \; 2>/dev/null || true
|
touch "$MODULES_DIR/modules.dep"
|
||||||
find "$KERNEL_BUILD_DIR" -name "virtio_ring.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/" \; 2>/dev/null || true
|
touch "$MODULES_DIR/modules.alias"
|
||||||
find "$KERNEL_BUILD_DIR" -name "virtio_pci.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/" \; 2>/dev/null || true
|
touch "$MODULES_DIR/modules.symbols"
|
||||||
|
fi
|
||||||
|
|
||||||
# Common dependencies (mii, mdio, libphy)
|
else
|
||||||
find "$KERNEL_BUILD_DIR" -name "mii.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/" \; 2>/dev/null || true
|
echo " Warning: Automatic dependency resolution failed, falling back to manual installation"
|
||||||
find "$KERNEL_BUILD_DIR" -name "mdio.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/" \; 2>/dev/null || true
|
# Fallback to minimal manual installation
|
||||||
find "$KERNEL_BUILD_DIR" -name "libphy.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/" \; 2>/dev/null || true
|
mkdir -p "$MODULES_DIR/kernel/drivers/net"
|
||||||
|
|
||||||
# SCSI subsystem dependencies (for virtio_scsi)
|
# Install only the most critical modules manually
|
||||||
mkdir -p "$MODULES_DIR/kernel/drivers/scsi"
|
for module in tun e1000e virtio_net overlay; do
|
||||||
find "$KERNEL_BUILD_DIR" -name "scsi_mod.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/scsi/" \; 2>/dev/null || true
|
find "$KERNEL_BUILD_DIR" -name "${module}.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/net/" \; 2>/dev/null || true
|
||||||
find "$KERNEL_BUILD_DIR" -name "sd_mod.ko" -exec cp {} "$MODULES_DIR/kernel/drivers/scsi/" \; 2>/dev/null || true
|
done
|
||||||
|
|
||||||
# PTP subsystem dependencies (for e1000e and other ethernet drivers)
|
module_count=$(find "$MODULES_DIR" -name "*.ko" 2>/dev/null | wc -l)
|
||||||
mkdir -p "$MODULES_DIR/kernel/drivers/ptp"
|
echo " Fallback: Installed $module_count essential modules"
|
||||||
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
|
fi
|
||||||
else
|
else
|
||||||
echo " Warning: Kernel build directory not found, modules may not be available"
|
echo " Warning: Kernel build directory not found at $KERNEL_BUILD_DIR"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Create essential kernel module directories that eudev expects
|
# Create essential kernel module directories that eudev expects
|
||||||
|
|||||||
268
scripts/resolve-module-dependencies.sh
Executable file
268
scripts/resolve-module-dependencies.sh
Executable file
@@ -0,0 +1,268 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# resolve-module-dependencies.sh - Automatically resolve kernel module dependencies using modinfo
|
||||||
|
# This script builds a complete dependency tree for specified kernel modules
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
KERNEL_BUILD_DIR=""
|
||||||
|
MODULES_DIR=""
|
||||||
|
KERNEL_VERSION=""
|
||||||
|
VERBOSE=${VERBOSE:-0}
|
||||||
|
|
||||||
|
# Global arrays for tracking
|
||||||
|
declare -A RESOLVED_MODULES=() # Track resolved modules to avoid duplicates
|
||||||
|
declare -A PROCESSING_MODULES=() # Track modules being processed to detect cycles
|
||||||
|
declare -a DEPENDENCY_ORDER=() # Final ordered list of modules
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "Usage: $0 [OPTIONS] MODULE [MODULE...]"
|
||||||
|
echo ""
|
||||||
|
echo "Resolve kernel module dependencies using modinfo and copy to initramfs"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo " -k DIR Kernel build directory (e.g., /build/kernel/linux-6.12.41)"
|
||||||
|
echo " -m DIR Target modules directory (e.g., /build/initramfs/lib/modules/6.12.41-Zero-OS)"
|
||||||
|
echo " -v VER Kernel version (e.g., 6.12.41-Zero-OS)"
|
||||||
|
echo " -V Verbose output"
|
||||||
|
echo " -h Show this help"
|
||||||
|
echo ""
|
||||||
|
echo "Examples:"
|
||||||
|
echo " $0 -k /build/kernel/linux-6.12.41 -m /build/initramfs/lib/modules/6.12.41-Zero-OS -v 6.12.41-Zero-OS tun e1000e"
|
||||||
|
echo " $0 -k /build/kernel/linux-6.12.41 -m /build/initramfs/lib/modules/6.12.41-Zero-OS -v 6.12.41-Zero-OS mycelium-modules.list"
|
||||||
|
}
|
||||||
|
|
||||||
|
log() {
|
||||||
|
if [ "$VERBOSE" -eq 1 ]; then
|
||||||
|
echo "[INFO] $*" >&2
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
warn() {
|
||||||
|
echo "[WARN] $*" >&2
|
||||||
|
}
|
||||||
|
|
||||||
|
error() {
|
||||||
|
echo "[ERROR] $*" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Find a kernel module file in the build directory
|
||||||
|
find_module() {
|
||||||
|
local module_name="$1"
|
||||||
|
|
||||||
|
# Try with .ko extension
|
||||||
|
local ko_file=$(find "$KERNEL_BUILD_DIR" -name "${module_name}.ko" -type f 2>/dev/null | head -1)
|
||||||
|
if [ -n "$ko_file" ]; then
|
||||||
|
echo "$ko_file"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Try without extension (in case it was passed with .ko)
|
||||||
|
local base_name="${module_name%.ko}"
|
||||||
|
ko_file=$(find "$KERNEL_BUILD_DIR" -name "${base_name}.ko" -type f 2>/dev/null | head -1)
|
||||||
|
if [ -n "$ko_file" ]; then
|
||||||
|
echo "$ko_file"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get dependencies for a module using modinfo
|
||||||
|
get_module_dependencies() {
|
||||||
|
local module_file="$1"
|
||||||
|
local module_name=$(basename "$module_file" .ko)
|
||||||
|
|
||||||
|
if [ ! -f "$module_file" ]; then
|
||||||
|
warn "Module file not found: $module_file"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Use modinfo to get dependencies
|
||||||
|
local deps=$(modinfo -F depends "$module_file" 2>/dev/null | tr ',' ' ')
|
||||||
|
|
||||||
|
if [ -n "$deps" ]; then
|
||||||
|
log "Dependencies for $module_name: $deps"
|
||||||
|
echo "$deps"
|
||||||
|
else
|
||||||
|
log "No dependencies for $module_name"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Recursively resolve module dependencies
|
||||||
|
resolve_dependencies() {
|
||||||
|
local module_name="$1"
|
||||||
|
local depth="$2"
|
||||||
|
local indent=""
|
||||||
|
|
||||||
|
# Create indentation for visual tree
|
||||||
|
for i in $(seq 1 $depth); do
|
||||||
|
indent=" $indent"
|
||||||
|
done
|
||||||
|
|
||||||
|
log "${indent}Resolving: $module_name (depth: $depth)"
|
||||||
|
|
||||||
|
# Check if we're already processing this module (circular dependency)
|
||||||
|
if [ "${PROCESSING_MODULES[$module_name]}" = "1" ]; then
|
||||||
|
warn "${indent}Circular dependency detected for: $module_name"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if already resolved
|
||||||
|
if [ "${RESOLVED_MODULES[$module_name]}" = "1" ]; then
|
||||||
|
log "${indent}Already resolved: $module_name"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Mark as being processed
|
||||||
|
PROCESSING_MODULES[$module_name]=1
|
||||||
|
|
||||||
|
# Find the module file
|
||||||
|
local module_file=$(find_module "$module_name")
|
||||||
|
if [ -z "$module_file" ]; then
|
||||||
|
warn "${indent}Module not found: $module_name"
|
||||||
|
unset PROCESSING_MODULES[$module_name]
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get dependencies
|
||||||
|
local deps=$(get_module_dependencies "$module_file")
|
||||||
|
|
||||||
|
# Recursively resolve dependencies first
|
||||||
|
for dep in $deps; do
|
||||||
|
if [ -n "$dep" ]; then
|
||||||
|
resolve_dependencies "$dep" $((depth + 1))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Mark as resolved and add to ordered list
|
||||||
|
RESOLVED_MODULES[$module_name]=1
|
||||||
|
DEPENDENCY_ORDER+=("$module_name")
|
||||||
|
log "${indent}Resolved: $module_name"
|
||||||
|
|
||||||
|
# Remove from processing list
|
||||||
|
unset PROCESSING_MODULES[$module_name]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Copy module to target directory
|
||||||
|
copy_module() {
|
||||||
|
local module_name="$1"
|
||||||
|
local module_file=$(find_module "$module_name")
|
||||||
|
|
||||||
|
if [ -z "$module_file" ]; then
|
||||||
|
warn "Cannot copy module, file not found: $module_name"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Determine target subdirectory based on module path
|
||||||
|
local rel_path=$(echo "$module_file" | sed "s|^$KERNEL_BUILD_DIR/||")
|
||||||
|
local target_dir="$MODULES_DIR/$(dirname "$rel_path")"
|
||||||
|
local target_file="$target_dir/$(basename "$module_file")"
|
||||||
|
|
||||||
|
# Create target directory
|
||||||
|
mkdir -p "$target_dir"
|
||||||
|
|
||||||
|
# Copy module
|
||||||
|
cp "$module_file" "$target_file"
|
||||||
|
log "Copied: $module_name -> $target_file"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse command line arguments
|
||||||
|
while getopts "k:m:v:Vh" opt; do
|
||||||
|
case $opt in
|
||||||
|
k) KERNEL_BUILD_DIR="$OPTARG" ;;
|
||||||
|
m) MODULES_DIR="$OPTARG" ;;
|
||||||
|
v) KERNEL_VERSION="$OPTARG" ;;
|
||||||
|
V) VERBOSE=1 ;;
|
||||||
|
h) usage; exit 0 ;;
|
||||||
|
*) usage; exit 1 ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
shift $((OPTIND-1))
|
||||||
|
|
||||||
|
# Validate required parameters
|
||||||
|
if [ -z "$KERNEL_BUILD_DIR" ] || [ -z "$MODULES_DIR" ] || [ -z "$KERNEL_VERSION" ]; then
|
||||||
|
error "Missing required parameters. Use -h for help."
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d "$KERNEL_BUILD_DIR" ]; then
|
||||||
|
error "Kernel build directory not found: $KERNEL_BUILD_DIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $# -eq 0 ]; then
|
||||||
|
error "No modules specified. Use -h for help."
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Parse module list (can be individual modules or a file containing module names)
|
||||||
|
REQUIRED_MODULES=()
|
||||||
|
for arg in "$@"; do
|
||||||
|
if [ -f "$arg" ]; then
|
||||||
|
# Read modules from file
|
||||||
|
log "Reading modules from file: $arg"
|
||||||
|
while IFS= read -r line; do
|
||||||
|
# Skip empty lines and comments
|
||||||
|
line=$(echo "$line" | sed 's/#.*//' | xargs)
|
||||||
|
if [ -n "$line" ]; then
|
||||||
|
REQUIRED_MODULES+=("$line")
|
||||||
|
fi
|
||||||
|
done < "$arg"
|
||||||
|
else
|
||||||
|
# Individual module name
|
||||||
|
REQUIRED_MODULES+=("$arg")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ ${#REQUIRED_MODULES[@]} -eq 0 ]; then
|
||||||
|
error "No valid modules found to process"
|
||||||
|
fi
|
||||||
|
|
||||||
|
log "Processing ${#REQUIRED_MODULES[@]} required modules: ${REQUIRED_MODULES[*]}"
|
||||||
|
|
||||||
|
# Resolve dependencies for all required modules
|
||||||
|
echo "Resolving dependencies for: ${REQUIRED_MODULES[*]}"
|
||||||
|
for module in "${REQUIRED_MODULES[@]}"; do
|
||||||
|
echo "Processing: $module"
|
||||||
|
resolve_dependencies "$module" 0
|
||||||
|
done
|
||||||
|
|
||||||
|
# Report results
|
||||||
|
echo ""
|
||||||
|
echo "Dependency resolution complete!"
|
||||||
|
echo "Total modules required: ${#DEPENDENCY_ORDER[@]}"
|
||||||
|
echo ""
|
||||||
|
echo "Dependency order:"
|
||||||
|
for i in "${!DEPENDENCY_ORDER[@]}"; do
|
||||||
|
printf "%3d. %s\n" $((i+1)) "${DEPENDENCY_ORDER[$i]}"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Copy all modules
|
||||||
|
echo ""
|
||||||
|
echo "Copying modules to: $MODULES_DIR"
|
||||||
|
mkdir -p "$MODULES_DIR"
|
||||||
|
|
||||||
|
COPIED_COUNT=0
|
||||||
|
FAILED_COUNT=0
|
||||||
|
|
||||||
|
for module in "${DEPENDENCY_ORDER[@]}"; do
|
||||||
|
if copy_module "$module"; then
|
||||||
|
((COPIED_COUNT++))
|
||||||
|
else
|
||||||
|
((FAILED_COUNT++))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Summary
|
||||||
|
echo ""
|
||||||
|
echo "Module installation summary:"
|
||||||
|
echo " Successfully copied: $COPIED_COUNT modules"
|
||||||
|
echo " Failed to copy: $FAILED_COUNT modules"
|
||||||
|
echo " Target directory: $MODULES_DIR"
|
||||||
|
|
||||||
|
if [ $FAILED_COUNT -gt 0 ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "All modules installed successfully!"
|
||||||
@@ -129,47 +129,20 @@ if [ "$BINARIES_FOUND" = "false" ]; then
|
|||||||
echo "[DEBUG] Make sure to run compile-components.sh before setup-initramfs.sh"
|
echo "[DEBUG] Make sure to run compile-components.sh before setup-initramfs.sh"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Install kernel modules for network interfaces
|
# Kernel modules are now installed by install-firmware-minimal.sh using automatic dependency resolution
|
||||||
echo " Installing essential network kernel modules..."
|
echo " Kernel modules installed by firmware installation script with automatic dependency resolution"
|
||||||
|
|
||||||
|
# Copy essential kernel module metadata files from kernel build if they exist
|
||||||
KERNEL_VERSION=$(cat /build/configs/kernel-version)
|
KERNEL_VERSION=$(cat /build/configs/kernel-version)
|
||||||
MODULES_DIR="$INITRAMFS_ROOT/lib/modules/${KERNEL_VERSION}-Zero-OS"
|
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"
|
|
||||||
mkdir -p "$MODULES_DIR/kernel/drivers"
|
|
||||||
|
|
||||||
KERNEL_BUILD_DIR="/build/kernel/linux-${KERNEL_VERSION}"
|
KERNEL_BUILD_DIR="/build/kernel/linux-${KERNEL_VERSION}"
|
||||||
if [ -d "$KERNEL_BUILD_DIR" ]; then
|
|
||||||
echo " Copying essential ethernet drivers from kernel build..."
|
|
||||||
|
|
||||||
# Copy essential network driver modules and their dependencies
|
if [ -d "$KERNEL_BUILD_DIR" ] && [ -d "$MODULES_DIR" ]; then
|
||||||
find "$KERNEL_BUILD_DIR" -name "*.ko" | grep -E "(e1000|r8169|bnx2|tg3|virtio|igb|ixgbe|i40e|ice|atl1|alx|8139|b44|mii|mdio|libphy|net_failover|failover|tun|ptp|pps|scsi|overlay)" | while read ko; do
|
|
||||||
if [ -f "$ko" ]; then
|
|
||||||
cp "$ko" "$MODULES_DIR/kernel/drivers/net/ethernet/" 2>/dev/null || \
|
|
||||||
cp "$ko" "$MODULES_DIR/kernel/drivers/net/" 2>/dev/null || \
|
|
||||||
cp "$ko" "$MODULES_DIR/kernel/drivers/" 2>/dev/null || \
|
|
||||||
cp "$ko" "$MODULES_DIR/kernel/net/" 2>/dev/null
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Also copy any net_failover modules from net/ directory
|
|
||||||
find "$KERNEL_BUILD_DIR" -path "*/net/*" -name "*failover*.ko" | while read ko; do
|
|
||||||
if [ -f "$ko" ]; then
|
|
||||||
mkdir -p "$MODULES_DIR/kernel/net/"
|
|
||||||
cp "$ko" "$MODULES_DIR/kernel/net/"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Count actual installed modules
|
|
||||||
actual_modules=$(find "$MODULES_DIR" -name "*.ko" 2>/dev/null | wc -l)
|
|
||||||
echo " Installed $actual_modules network driver modules"
|
|
||||||
|
|
||||||
# Copy essential kernel module metadata files from kernel build
|
|
||||||
echo " Copying kernel module metadata files..."
|
echo " Copying kernel module metadata files..."
|
||||||
if [ -f "$KERNEL_BUILD_DIR/modules.order" ]; then
|
if [ -f "$KERNEL_BUILD_DIR/modules.order" ]; then
|
||||||
cp "$KERNEL_BUILD_DIR/modules.order" "$MODULES_DIR/"
|
cp "$KERNEL_BUILD_DIR/modules.order" "$MODULES_DIR/"
|
||||||
echo " ✓ modules.order copied"
|
echo " ✓ modules.order copied"
|
||||||
else
|
else
|
||||||
echo " Warning: modules.order not found in kernel build"
|
|
||||||
touch "$MODULES_DIR/modules.order"
|
touch "$MODULES_DIR/modules.order"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -177,7 +150,6 @@ if [ -d "$KERNEL_BUILD_DIR" ]; then
|
|||||||
cp "$KERNEL_BUILD_DIR/modules.builtin" "$MODULES_DIR/"
|
cp "$KERNEL_BUILD_DIR/modules.builtin" "$MODULES_DIR/"
|
||||||
echo " ✓ modules.builtin copied"
|
echo " ✓ modules.builtin copied"
|
||||||
else
|
else
|
||||||
echo " Warning: modules.builtin not found in kernel build"
|
|
||||||
touch "$MODULES_DIR/modules.builtin"
|
touch "$MODULES_DIR/modules.builtin"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -185,18 +157,10 @@ if [ -d "$KERNEL_BUILD_DIR" ]; then
|
|||||||
cp "$KERNEL_BUILD_DIR/modules.builtin.modinfo" "$MODULES_DIR/"
|
cp "$KERNEL_BUILD_DIR/modules.builtin.modinfo" "$MODULES_DIR/"
|
||||||
echo " ✓ modules.builtin.modinfo copied"
|
echo " ✓ modules.builtin.modinfo copied"
|
||||||
else
|
else
|
||||||
echo " Warning: modules.builtin.modinfo not found in kernel build"
|
|
||||||
touch "$MODULES_DIR/modules.builtin.modinfo"
|
touch "$MODULES_DIR/modules.builtin.modinfo"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Create basic module dependency files (these will be updated by depmod)
|
|
||||||
touch "$MODULES_DIR/modules.dep"
|
|
||||||
touch "$MODULES_DIR/modules.alias"
|
|
||||||
touch "$MODULES_DIR/modules.symbols"
|
|
||||||
|
|
||||||
echo " Module metadata files installed"
|
echo " Module metadata files installed"
|
||||||
else
|
|
||||||
echo " Warning: Kernel build directory not found at $KERNEL_BUILD_DIR"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Copy other system configurations
|
# Copy other system configurations
|
||||||
|
|||||||
Reference in New Issue
Block a user