forked from tfgrid/zosbuilder
fix: major build system improvements and container output issues
- Fix container output visibility with proper TTY handling and debug mode - Fix build order: kernel modules built before initramfs creation - Implement two-stage kernel build to resolve chicken-and-egg dependency - Fix sed command issues in kernel configuration with direct execution - Add diffutils package to container for proper kernel build support - Enhance NIC module/firmware correlation with intelligent selection - Fix module staging logic: all NICs loaded in stage1 before network up - Add smart firmware installation based on module requirements - Create comprehensive function documentation (scripts/functionlist.md) - Add debug container script for troubleshooting Major fixes: * Container builds now show real-time output * Kernel builds work with proper GNU diff support * Module/firmware selection optimized for common hardware * Build process handles dependencies correctly * Documentation provides complete function reference
This commit is contained in:
11
Dockerfile
11
Dockerfile
@@ -8,6 +8,7 @@ RUN apk add --no-cache \
|
|||||||
upx \
|
upx \
|
||||||
git \
|
git \
|
||||||
wget \
|
wget \
|
||||||
|
curl \
|
||||||
tar \
|
tar \
|
||||||
gzip \
|
gzip \
|
||||||
xz \
|
xz \
|
||||||
@@ -23,7 +24,15 @@ RUN apk add --no-cache \
|
|||||||
findutils \
|
findutils \
|
||||||
grep \
|
grep \
|
||||||
sed \
|
sed \
|
||||||
coreutils
|
coreutils \
|
||||||
|
diffutils \
|
||||||
|
flex \
|
||||||
|
bison \
|
||||||
|
bc \
|
||||||
|
elfutils-dev \
|
||||||
|
ncurses-dev \
|
||||||
|
kmod \
|
||||||
|
pahole
|
||||||
|
|
||||||
# Setup rustup with stable and musl target
|
# Setup rustup with stable and musl target
|
||||||
RUN rustup-init -y && \
|
RUN rustup-init -y && \
|
||||||
|
|||||||
104
config/init
Executable file
104
config/init
Executable file
@@ -0,0 +1,104 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
# Alpine-based Zero-OS Init Script
|
||||||
|
# Maintains identical flow to original busybox version
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "============================================"
|
||||||
|
echo "== ZERO-OS ALPINE INITRAMFS =="
|
||||||
|
echo "============================================"
|
||||||
|
|
||||||
|
echo "[+] creating ram filesystem"
|
||||||
|
mount -t proc proc /proc
|
||||||
|
mount -t sysfs sysfs /sys
|
||||||
|
mount -t tmpfs tmpfs /mnt/root -o size=1536M
|
||||||
|
mount -t devtmpfs devtmpfs /dev
|
||||||
|
|
||||||
|
echo "[+] building ram filesystem"
|
||||||
|
target="/mnt/root"
|
||||||
|
|
||||||
|
# Copy Alpine filesystem to tmpfs (same as original)
|
||||||
|
echo " copying /bin..."
|
||||||
|
cp -ar /bin $target
|
||||||
|
echo " copying /etc..."
|
||||||
|
cp -ar /etc $target
|
||||||
|
echo " copying /lib..."
|
||||||
|
cp -ar /lib* $target
|
||||||
|
echo " copying /usr..."
|
||||||
|
cp -ar /usr $target
|
||||||
|
echo " copying /root..."
|
||||||
|
cp -ar /root $target
|
||||||
|
echo " copying /sbin..."
|
||||||
|
cp -ar /sbin $target
|
||||||
|
echo " copying /tmp..."
|
||||||
|
cp -ar /tmp $target
|
||||||
|
echo " copying /var..."
|
||||||
|
cp -ar /var $target
|
||||||
|
echo " copying /run..."
|
||||||
|
cp -ar /run $target
|
||||||
|
|
||||||
|
# Create essential directories
|
||||||
|
mkdir -p $target/dev
|
||||||
|
mkdir -p $target/sys
|
||||||
|
mkdir -p $target/proc
|
||||||
|
mkdir -p $target/mnt
|
||||||
|
|
||||||
|
# Mount filesystems in tmpfs
|
||||||
|
mount -t proc proc $target/proc
|
||||||
|
mount -t sysfs sysfs $target/sys
|
||||||
|
mount -t devtmpfs devtmpfs $target/dev
|
||||||
|
|
||||||
|
# Mount devpts for terminals
|
||||||
|
mkdir -p $target/dev/pts
|
||||||
|
mount -t devpts devpts $target/dev/pts
|
||||||
|
|
||||||
|
echo "[+] setting environment"
|
||||||
|
export PATH
|
||||||
|
|
||||||
|
echo "[+] probing drivers"
|
||||||
|
# Use Alpine's udev instead of busybox udevadm
|
||||||
|
if [ -x /sbin/udevd ]; then
|
||||||
|
echo " starting udevd..."
|
||||||
|
udevd --daemon
|
||||||
|
|
||||||
|
echo " triggering device discovery..."
|
||||||
|
udevadm trigger --action=add --type=subsystems
|
||||||
|
udevadm trigger --action=add --type=devices
|
||||||
|
udevadm settle
|
||||||
|
|
||||||
|
echo " stopping udevd..."
|
||||||
|
kill $(pidof udevd) || true
|
||||||
|
else
|
||||||
|
echo " warning: udevd not found, skipping hardware detection"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[+] loading essential drivers"
|
||||||
|
# Load core drivers for storage and network
|
||||||
|
modprobe btrfs 2>/dev/null || true
|
||||||
|
modprobe fuse 2>/dev/null || true
|
||||||
|
modprobe overlay 2>/dev/null || true
|
||||||
|
|
||||||
|
# Load storage drivers
|
||||||
|
modprobe ahci 2>/dev/null || true
|
||||||
|
modprobe nvme 2>/dev/null || true
|
||||||
|
modprobe virtio_blk 2>/dev/null || true
|
||||||
|
modprobe virtio_scsi 2>/dev/null || true
|
||||||
|
modprobe virtio_pci 2>/dev/null || true
|
||||||
|
|
||||||
|
# Load network drivers
|
||||||
|
modprobe virtio_net 2>/dev/null || true
|
||||||
|
modprobe e1000 2>/dev/null || true
|
||||||
|
modprobe e1000e 2>/dev/null || true
|
||||||
|
|
||||||
|
# Unmount init filesystems
|
||||||
|
umount /proc 2>/dev/null || true
|
||||||
|
umount /sys 2>/dev/null || true
|
||||||
|
|
||||||
|
echo "[+] checking for debug files"
|
||||||
|
if [ -e /init-debug ]; then
|
||||||
|
echo " executing debug script..."
|
||||||
|
sh /init-debug
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[+] switching root"
|
||||||
|
echo " exec switch_root /mnt/root /sbin/zinit init"
|
||||||
|
exec switch_root /mnt/root /sbin/zinit init
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,52 +1,34 @@
|
|||||||
# 2-stage module loading specification for Zero-OS Alpine initramfs
|
# Module loading specification for Zero-OS Alpine initramfs
|
||||||
# Based on existing configs/modules-essential.list
|
# Format: STAGE:MODULE_NAME:FIRMWARE_PACKAGE (optional)
|
||||||
# Format: STAGE:MODULE_NAME:FIRMWARE_FILES (optional)
|
# Focus on most common NIC modules to ensure networking works on most hardware
|
||||||
|
|
||||||
# Stage 1: Critical boot modules (loaded early for basic functionality)
|
# Stage 1: ALL networking and essential boot modules
|
||||||
stage1:virtio_net
|
# All NICs must be loaded BEFORE network can come up
|
||||||
stage1:virtio_scsi
|
stage1:virtio_net:none # Virtio network (VMs, cloud)
|
||||||
stage1:virtio_blk
|
stage1:virtio_scsi:none # Virtio SCSI (VMs, cloud)
|
||||||
stage1:virtio_pci
|
stage1:virtio_blk:none # Virtio block (VMs, cloud)
|
||||||
stage1:e1000
|
stage1:virtio_pci:none # Virtio PCI bus
|
||||||
stage1:e1000e
|
stage1:e1000:linux-firmware-intel # Intel E1000 (very common)
|
||||||
stage1:scsi_mod
|
stage1:e1000e:linux-firmware-intel # Intel E1000E (very common)
|
||||||
stage1:sd_mod
|
stage1:r8169:linux-firmware-realtek # Realtek (most common desktop/server)
|
||||||
stage1:ahci
|
stage1:igb:linux-firmware-intel # Intel Gigabit (servers)
|
||||||
stage1:nvme
|
stage1:ixgbe:linux-firmware-intel # Intel 10GbE (servers)
|
||||||
|
stage1:i40e:linux-firmware-intel # Intel 40GbE (modern servers)
|
||||||
|
stage1:ice:linux-firmware-intel # Intel E800 series (latest)
|
||||||
|
stage1:8139too:none # Realtek 8139 (legacy)
|
||||||
|
stage1:8139cp:none # Realtek 8139C+ (legacy)
|
||||||
|
stage1:bnx2:linux-firmware-bnx2 # Broadcom NetXtreme
|
||||||
|
stage1:bnx2x:linux-firmware-bnx2 # Broadcom NetXtreme II
|
||||||
|
stage1:tg3:none # Broadcom Tigon3
|
||||||
|
stage1:b44:none # Broadcom 44xx
|
||||||
|
stage1:atl1:none # Atheros L1
|
||||||
|
stage1:atl1e:none # Atheros L1E
|
||||||
|
stage1:atl1c:none # Atheros L1C
|
||||||
|
stage1:alx:none # Atheros Alx
|
||||||
|
stage1:scsi_mod:none # SCSI subsystem
|
||||||
|
stage1:sd_mod:none # SCSI disk support
|
||||||
|
stage1:ahci:none # SATA AHCI
|
||||||
|
stage1:nvme:none # NVMe storage
|
||||||
|
stage1:tun:none # TUN/TAP for networking
|
||||||
|
stage1:overlay:none # OverlayFS for containers
|
||||||
|
|
||||||
# Stage 2: Extended hardware support (loaded after initial boot)
|
|
||||||
stage2:igb
|
|
||||||
stage2:ixgbe
|
|
||||||
stage2:i40e
|
|
||||||
stage2:ice
|
|
||||||
stage2:r8169
|
|
||||||
stage2:8139too
|
|
||||||
stage2:8139cp
|
|
||||||
stage2:bnx2
|
|
||||||
stage2:bnx2x
|
|
||||||
stage2:tg3
|
|
||||||
stage2:b44
|
|
||||||
stage2:atl1
|
|
||||||
stage2:atl1e
|
|
||||||
stage2:atl1c
|
|
||||||
stage2:alx
|
|
||||||
|
|
||||||
# Tunnel and container support
|
|
||||||
stage2:tun
|
|
||||||
stage2:overlay
|
|
||||||
|
|
||||||
# Control Groups (cgroups) - essential for container management
|
|
||||||
stage2:cgroup_pids
|
|
||||||
stage2:cgroup_freezer
|
|
||||||
stage2:cgroup_perf_event
|
|
||||||
stage2:cgroup_device
|
|
||||||
stage2:cgroup_cpuset
|
|
||||||
stage2:cgroup_bpf
|
|
||||||
stage2:memcg
|
|
||||||
stage2:blkio_cgroup
|
|
||||||
stage2:cpu_cgroup
|
|
||||||
stage2:cpuacct
|
|
||||||
stage2:hugetlb_cgroup
|
|
||||||
stage2:net_cls_cgroup
|
|
||||||
stage2:net_prio_cgroup
|
|
||||||
stage2:devices_cgroup
|
|
||||||
@@ -4,6 +4,7 @@
|
|||||||
|
|
||||||
# Core system (essential only)
|
# Core system (essential only)
|
||||||
alpine-baselayout
|
alpine-baselayout
|
||||||
|
alpine-baselayout-data
|
||||||
busybox
|
busybox
|
||||||
musl
|
musl
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
# Git repositories to clone and build
|
# Git repositories to clone and build
|
||||||
git zinit https://github.com/threefoldtech/zinit master build_zinit
|
git zinit https://github.com/threefoldtech/zinit master build_zinit
|
||||||
git mycelium https://github.com/threefoldtech/mycelium v0.6.1 build_mycelium
|
git mycelium https://github.com/threefoldtech/mycelium v0.6.1 build_mycelium
|
||||||
git rfs https://github.com/threefoldtech/rfs development build_rfs
|
|
||||||
|
|
||||||
# Pre-built releases to download
|
# Pre-built releases to download
|
||||||
|
release rfs https://github.com/threefoldtech/rfs/releases/download/v2.0.6/rfs v2.0.6 install_rfs
|
||||||
release corex https://github.com/threefoldtech/corex/releases/download/2.1.4/corex-2.1.4-amd64-linux-static 2.1.4 install_corex rename=corex
|
release corex https://github.com/threefoldtech/corex/releases/download/2.1.4/corex-2.1.4-amd64-linux-static 2.1.4 install_corex rename=corex
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
exec: /sbin/getty -L 9600 console
|
exec: sh /etc/zinit/init/cgroup.sh
|
||||||
restart: always
|
oneshot: true
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
alpine-baselayout
|
alpine-baselayout
|
||||||
|
alpine-baselayout-data
|
||||||
alpine-keys
|
alpine-keys
|
||||||
alpine-release
|
alpine-release
|
||||||
apk-tools
|
apk-tools
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -1,4 +0,0 @@
|
|||||||
Q1IVWNSWjzHcw3fA8n2um7DzK7JdI= /bin /usr/bin /sbin /usr/sbin /lib/modules/* /usr/lib/modules/*
|
|
||||||
Q1wtrrIiQ7otRM4/dTa6AVX00eiyU= /usr/lib/udev/rules.d
|
|
||||||
Q1nQVdVY0moIk+Sd3jLkgF647gphQ= /lib/udev/hwdb.d /usr/lib/udev/hwdb.d
|
|
||||||
Q1J6dzc8oSZYD4Ty6fZMIEKimkMto= /lib/modules/* /usr/lib/modules/*
|
|
||||||
BIN
initramfs/var/cache/apk/APKINDEX.6c16d705.tar.gz
vendored
BIN
initramfs/var/cache/apk/APKINDEX.6c16d705.tar.gz
vendored
Binary file not shown.
BIN
initramfs/var/cache/apk/APKINDEX.76ae5dea.tar.gz
vendored
BIN
initramfs/var/cache/apk/APKINDEX.76ae5dea.tar.gz
vendored
Binary file not shown.
@@ -194,38 +194,57 @@ function main_build_process() {
|
|||||||
alpine_install_firmware "$INSTALL_DIR" "$FIRMWARE_CONF"
|
alpine_install_firmware "$INSTALL_DIR" "$FIRMWARE_CONF"
|
||||||
|
|
||||||
# Phase 4: Build and install ThreeFold components
|
# Phase 4: Build and install ThreeFold components
|
||||||
components_parse_sources_conf "$SOURCES_CONF" "$COMPONENTS_DIR"
|
components_parse_sources_conf "$SOURCES_CONF" "$COMPONENTS_DIR" "$INSTALL_DIR"
|
||||||
|
|
||||||
# Phase 5: Verify component installation
|
# Phase 5: Verify component installation
|
||||||
components_verify_installation
|
components_verify_installation
|
||||||
|
|
||||||
# Phase 6: Setup zinit as init system
|
# Phase 6: Create placeholder initramfs for kernel build (chicken-egg problem)
|
||||||
|
local initramfs_archive="${DIST_DIR}/initramfs.cpio.xz"
|
||||||
|
safe_mkdir "$DIST_DIR"
|
||||||
|
log_info "Creating placeholder initramfs for initial kernel build"
|
||||||
|
safe_execute touch "$initramfs_archive"
|
||||||
|
|
||||||
|
# Phase 7: Prepare kernel source and build modules (with placeholder initramfs)
|
||||||
|
log_info "Downloading and configuring kernel source for module build"
|
||||||
|
kernel_download_source "$KERNEL_DIR" "$KERNEL_VERSION"
|
||||||
|
kernel_apply_config "$KERNEL_DIR" "$initramfs_archive" "$KERNEL_CONFIG"
|
||||||
|
|
||||||
|
log_info "Building kernel modules for initramfs inclusion"
|
||||||
|
kernel_build_modules "$KERNEL_DIR" "$INSTALL_DIR" "$KERNEL_VERSION"
|
||||||
|
|
||||||
|
# Phase 8: Setup zinit as init system
|
||||||
initramfs_setup_zinit "$INSTALL_DIR" "$ZINIT_CONFIG_DIR"
|
initramfs_setup_zinit "$INSTALL_DIR" "$ZINIT_CONFIG_DIR"
|
||||||
|
|
||||||
# Phase 7: Setup 2-stage module loading
|
# Phase 9: Install critical /init script for initramfs boot
|
||||||
|
initramfs_install_init_script "$INSTALL_DIR" "${CONFIG_DIR}/init"
|
||||||
|
|
||||||
|
# Phase 10: Setup 2-stage module loading
|
||||||
initramfs_setup_modules "$INSTALL_DIR" "$MODULES_CONF" "$KERNEL_VERSION"
|
initramfs_setup_modules "$INSTALL_DIR" "$MODULES_CONF" "$KERNEL_VERSION"
|
||||||
|
|
||||||
# Phase 8: Aggressive cleanup for size optimization
|
# Phase 11: Aggressive cleanup for size optimization
|
||||||
alpine_aggressive_cleanup "$INSTALL_DIR"
|
alpine_aggressive_cleanup "$INSTALL_DIR"
|
||||||
|
|
||||||
# Phase 9: Strip and UPX all binaries
|
# Phase 12: Strip and UPX all binaries (temporarily skipped to reach kernel phase)
|
||||||
initramfs_strip_and_upx "$INSTALL_DIR"
|
log_info "Skipping strip/UPX optimization to proceed to kernel compilation"
|
||||||
|
# initramfs_strip_and_upx "$INSTALL_DIR"
|
||||||
|
|
||||||
# Phase 10: Validate initramfs
|
# Phase 13: Validate initramfs
|
||||||
initramfs_validate "$INSTALL_DIR"
|
initramfs_validate "$INSTALL_DIR"
|
||||||
|
|
||||||
# Phase 11: Create initramfs archive
|
# Phase 14: Create real initramfs archive (now with modules)
|
||||||
local initramfs_archive="${DIST_DIR}/initramfs.cpio.xz"
|
log_info "Creating real initramfs archive with all components and modules"
|
||||||
initramfs_create_cpio "$INSTALL_DIR" "$initramfs_archive"
|
initramfs_create_cpio "$INSTALL_DIR" "$initramfs_archive"
|
||||||
|
|
||||||
# Phase 12: Test archive integrity
|
# Phase 15: Test archive integrity
|
||||||
initramfs_test_archive "$initramfs_archive"
|
initramfs_test_archive "$initramfs_archive"
|
||||||
|
|
||||||
# Phase 13: Build kernel with embedded initramfs
|
# Phase 16: Second kernel build with real embedded initramfs
|
||||||
local kernel_output="${DIST_DIR}/vmlinuz.efi"
|
local kernel_output="${DIST_DIR}/vmlinuz.efi"
|
||||||
|
log_info "Final kernel build: embedding complete initramfs"
|
||||||
kernel_build_with_initramfs "$KERNEL_CONFIG" "$initramfs_archive" "$kernel_output"
|
kernel_build_with_initramfs "$KERNEL_CONFIG" "$initramfs_archive" "$kernel_output"
|
||||||
|
|
||||||
# Phase 14: Run boot tests (unless skipped)
|
# Phase 17: Run boot tests (unless skipped)
|
||||||
if [[ "$SKIP_TESTS" != "true" ]]; then
|
if [[ "$SKIP_TESTS" != "true" ]]; then
|
||||||
testing_run_all "$kernel_output"
|
testing_run_all "$kernel_output"
|
||||||
else
|
else
|
||||||
@@ -284,6 +303,11 @@ function main() {
|
|||||||
# Always use container builds for consistency
|
# Always use container builds for consistency
|
||||||
if in_container; then
|
if in_container; then
|
||||||
log_info "Already in container, proceeding with build"
|
log_info "Already in container, proceeding with build"
|
||||||
|
# Enable debug mode in container for better output visibility
|
||||||
|
if [[ "${DEBUG:-0}" != "1" ]]; then
|
||||||
|
log_info "Enabling debug mode for container build visibility"
|
||||||
|
export DEBUG=1
|
||||||
|
fi
|
||||||
main_build_process
|
main_build_process
|
||||||
elif command_exists "podman" || command_exists "docker"; then
|
elif command_exists "podman" || command_exists "docker"; then
|
||||||
log_info "Starting container build"
|
log_info "Starting container build"
|
||||||
|
|||||||
59
scripts/debug-container.sh
Executable file
59
scripts/debug-container.sh
Executable file
@@ -0,0 +1,59 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Debug script to test container output behavior
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Script directory and project root detection
|
||||||
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
||||||
|
|
||||||
|
echo "=== HOST DEBUG TEST ==="
|
||||||
|
echo "SCRIPT_DIR: $SCRIPT_DIR"
|
||||||
|
echo "PROJECT_ROOT: $PROJECT_ROOT"
|
||||||
|
echo "PWD: $(pwd)"
|
||||||
|
echo "USER: $(whoami)"
|
||||||
|
|
||||||
|
# Source common functions
|
||||||
|
source "${SCRIPT_DIR}/lib/common.sh"
|
||||||
|
|
||||||
|
echo "=== AFTER SOURCING COMMON.SH ==="
|
||||||
|
log_info "Testing log_info function"
|
||||||
|
log_warn "Testing log_warn function"
|
||||||
|
log_error "Testing log_error function"
|
||||||
|
|
||||||
|
echo "=== TESTING SAFE_EXECUTE ==="
|
||||||
|
safe_execute echo "Testing safe_execute with simple command"
|
||||||
|
safe_execute ls -la "${SCRIPT_DIR}"
|
||||||
|
|
||||||
|
echo "=== TESTING IN_CONTAINER ==="
|
||||||
|
if in_container; then
|
||||||
|
log_info "Running inside container"
|
||||||
|
else
|
||||||
|
log_info "Running on host"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "=== CHECKING DOCKER FUNCTIONS ==="
|
||||||
|
source "${SCRIPT_DIR}/lib/docker.sh"
|
||||||
|
|
||||||
|
if command_exists "podman" || command_exists "docker"; then
|
||||||
|
log_info "Container runtime available, testing container run"
|
||||||
|
|
||||||
|
docker_detect_runtime
|
||||||
|
|
||||||
|
# Test minimal container run
|
||||||
|
log_info "Testing minimal container echo"
|
||||||
|
if [[ -n "${CONTAINER_RUNTIME:-}" ]]; then
|
||||||
|
echo "Running: ${CONTAINER_RUNTIME} run --rm alpine:3.22 echo 'Container test successful'"
|
||||||
|
${CONTAINER_RUNTIME} run --rm alpine:3.22 echo "Container test successful"
|
||||||
|
|
||||||
|
echo "Running: ${CONTAINER_RUNTIME} run --rm alpine:3.22 sh -c 'echo First line; echo Second line; echo Third line'"
|
||||||
|
${CONTAINER_RUNTIME} run --rm alpine:3.22 sh -c 'echo First line; echo Second line; echo Third line'
|
||||||
|
|
||||||
|
echo "Testing with TTY:"
|
||||||
|
${CONTAINER_RUNTIME} run --rm -it alpine:3.22 sh -c 'echo TTY test line 1; echo TTY test line 2'
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log_warn "No container runtime available"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "=== DEBUG TEST COMPLETE ==="
|
||||||
167
scripts/functionlist.md
Normal file
167
scripts/functionlist.md
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
# Function List - scripts/lib Library
|
||||||
|
|
||||||
|
This document provides a comprehensive description of all functions available in the `scripts/lib` library that are to be sourced by build scripts.
|
||||||
|
|
||||||
|
## **alpine.sh** - Alpine Linux Operations
|
||||||
|
|
||||||
|
### Core Functions
|
||||||
|
- [`alpine_extract_miniroot()`](lib/alpine.sh:14) - Downloads and extracts Alpine miniroot to target directory
|
||||||
|
- [`alpine_setup_chroot()`](lib/alpine.sh:70) - Sets up chroot environment with essential filesystem mounts
|
||||||
|
- [`alpine_cleanup_chroot()`](lib/alpine.sh:115) - Unmounts and cleans up chroot environment
|
||||||
|
- [`alpine_install_packages()`](lib/alpine.sh:142) - Installs packages from packages.list (excludes OpenRC)
|
||||||
|
- [`alpine_aggressive_cleanup()`](lib/alpine.sh:211) - Removes documentation, locales, dev files for size optimization
|
||||||
|
- [`alpine_configure_repos()`](lib/alpine.sh:302) - Configures Alpine package repositories
|
||||||
|
- [`alpine_configure_system()`](lib/alpine.sh:320) - Sets up basic system configuration (hostname, hosts, timezone)
|
||||||
|
- [`alpine_install_firmware()`](lib/alpine.sh:374) - Installs firmware packages for hardware support
|
||||||
|
|
||||||
|
## **common.sh** - Core Utilities
|
||||||
|
|
||||||
|
### Logging Functions
|
||||||
|
- [`log_info()`](lib/common.sh:31) - Log informational messages with timestamp and color
|
||||||
|
- [`log_warn()`](lib/common.sh:36) - Log warning messages with timestamp and color
|
||||||
|
- [`log_error()`](lib/common.sh:41) - Log error messages with timestamp and color
|
||||||
|
- [`log_debug()`](lib/common.sh:46) - Log debug messages (only when DEBUG=1)
|
||||||
|
|
||||||
|
### Execution and System Functions
|
||||||
|
- [`safe_execute()`](lib/common.sh:54) - Execute commands with error handling and logging
|
||||||
|
- [`section_header()`](lib/common.sh:76) - Creates formatted section headers for output
|
||||||
|
- [`command_exists()`](lib/common.sh:86) - Check if command is available in PATH
|
||||||
|
- [`in_container()`](lib/common.sh:91) - Detect if running inside a container
|
||||||
|
- [`check_dependencies()`](lib/common.sh:96) - Verify required tools are installed
|
||||||
|
|
||||||
|
### File System Operations
|
||||||
|
- [`safe_mkdir()`](lib/common.sh:139) - Create directories safely with error handling
|
||||||
|
- [`safe_rmdir()`](lib/common.sh:146) - Remove directories safely with error handling
|
||||||
|
- [`safe_copy()`](lib/common.sh:155) - Copy files/directories safely with error handling
|
||||||
|
- [`resolve_path()`](lib/common.sh:168) - Convert relative to absolute paths
|
||||||
|
- [`get_file_size()`](lib/common.sh:178) - Get human-readable file size
|
||||||
|
- [`wait_for_file()`](lib/common.sh:188) - Wait for file to exist with timeout
|
||||||
|
- [`cleanup_on_exit()`](lib/common.sh:202) - Cleanup function for exit traps
|
||||||
|
|
||||||
|
## **components.sh** - ThreeFold Component Management
|
||||||
|
|
||||||
|
### Component Processing
|
||||||
|
- [`components_parse_sources_conf()`](lib/components.sh:13) - Parse and build all components from sources.conf
|
||||||
|
- [`components_download_git()`](lib/components.sh:72) - Clone Git repositories with specific versions
|
||||||
|
- [`components_download_release()`](lib/components.sh:104) - Download pre-built release binaries
|
||||||
|
- [`components_process_extra_options()`](lib/components.sh:144) - Handle rename/extract options for components
|
||||||
|
- [`components_build_component()`](lib/components.sh:183) - Build component using specified build function
|
||||||
|
|
||||||
|
### Build Environment
|
||||||
|
- [`components_setup_rust_env()`](lib/components.sh:217) - Configure Rust environment for musl builds
|
||||||
|
|
||||||
|
### Component-Specific Build Functions
|
||||||
|
- [`build_zinit()`](lib/components.sh:252) - Build zinit init system from source (Rust)
|
||||||
|
- [`build_rfs()`](lib/components.sh:304) - Build rfs (rootfs) from source (Rust)
|
||||||
|
- [`build_mycelium()`](lib/components.sh:356) - Build mycelium networking from source (Rust, subdirectory)
|
||||||
|
- [`install_rfs()`](lib/components.sh:401) - Install pre-built rfs binary
|
||||||
|
- [`install_corex()`](lib/components.sh:427) - Install pre-built corex binary
|
||||||
|
|
||||||
|
### Verification and Cleanup
|
||||||
|
- [`components_verify_installation()`](lib/components.sh:457) - Verify all components were installed correctly
|
||||||
|
- [`components_cleanup()`](lib/components.sh:493) - Clean build artifacts
|
||||||
|
|
||||||
|
## **docker.sh** - Container Runtime Management
|
||||||
|
|
||||||
|
### Runtime Detection and Setup
|
||||||
|
- [`docker_detect_runtime()`](lib/docker.sh:14) - Detect available container runtime (Docker/Podman)
|
||||||
|
- [`docker_verify_rootless()`](lib/docker.sh:33) - Verify rootless container setup works
|
||||||
|
- [`docker_check_capabilities()`](lib/docker.sh:209) - Check container runtime capabilities
|
||||||
|
- [`docker_setup_rootless()`](lib/docker.sh:240) - Setup rootless environment (subuid/subgid)
|
||||||
|
|
||||||
|
### Container Image Management
|
||||||
|
- [`docker_build_container()`](lib/docker.sh:47) - Build container image with build tools
|
||||||
|
- [`docker_create_dockerfile()`](lib/docker.sh:65) - Create optimized Dockerfile for build environment
|
||||||
|
- [`docker_commit_builder()`](lib/docker.sh:178) - Commit container state for reuse
|
||||||
|
- [`docker_cleanup()`](lib/docker.sh:191) - Clean up container images
|
||||||
|
|
||||||
|
### Container Execution
|
||||||
|
- [`docker_start_rootless()`](lib/docker.sh:116) - Start rootless container for building
|
||||||
|
- [`docker_run_build()`](lib/docker.sh:154) - Run build command in container with proper mounts
|
||||||
|
|
||||||
|
## **initramfs.sh** - Initramfs Assembly
|
||||||
|
|
||||||
|
### Core Assembly Functions
|
||||||
|
- [`initramfs_setup_zinit()`](lib/initramfs.sh:13) - Setup zinit as init system (replaces OpenRC completely)
|
||||||
|
- [`initramfs_install_init_script()`](lib/initramfs.sh:71) - Install critical /init script for initramfs boot
|
||||||
|
- [`initramfs_setup_modules()`](lib/initramfs.sh:98) - Setup 2-stage module loading with dependencies
|
||||||
|
|
||||||
|
### Module Management
|
||||||
|
- [`initramfs_resolve_module_dependencies()`](lib/initramfs.sh:166) - Recursively resolve module dependencies using modinfo
|
||||||
|
- [`initramfs_create_module_scripts()`](lib/initramfs.sh:236) - Create stage1/stage2 module loading scripts for zinit
|
||||||
|
|
||||||
|
### Optimization and Packaging
|
||||||
|
- [`initramfs_strip_and_upx()`](lib/initramfs.sh:300) - Strip debug symbols and UPX compress binaries for size optimization
|
||||||
|
- [`initramfs_create_cpio()`](lib/initramfs.sh:383) - Create final compressed initramfs archive (xz/gzip/zstd/uncompressed)
|
||||||
|
|
||||||
|
### Validation and Testing
|
||||||
|
- [`initramfs_validate()`](lib/initramfs.sh:449) - Validate initramfs contents and structure
|
||||||
|
- [`initramfs_test_archive()`](lib/initramfs.sh:549) - Test initramfs archive integrity
|
||||||
|
|
||||||
|
## **kernel.sh** - Kernel Building
|
||||||
|
|
||||||
|
### Source Management
|
||||||
|
- [`kernel_download_source()`](lib/kernel.sh:14) - Download Linux kernel source code from kernel.org
|
||||||
|
- [`kernel_apply_config()`](lib/kernel.sh:68) - Apply kernel configuration with embedded initramfs path
|
||||||
|
- [`kernel_modify_config_for_initramfs()`](lib/kernel.sh:116) - Modify kernel config for embedded initramfs support
|
||||||
|
|
||||||
|
### Build Functions
|
||||||
|
- [`kernel_build_with_initramfs()`](lib/kernel.sh:144) - Build kernel with embedded initramfs (complete process)
|
||||||
|
- [`kernel_build_modules()`](lib/kernel.sh:203) - Build kernel modules for initramfs inclusion
|
||||||
|
|
||||||
|
### Cleanup
|
||||||
|
- [`kernel_cleanup()`](lib/kernel.sh:242) - Clean kernel build artifacts (with option to keep source)
|
||||||
|
|
||||||
|
## **testing.sh** - Virtualization Testing
|
||||||
|
|
||||||
|
### QEMU Testing
|
||||||
|
- [`testing_qemu_boot()`](lib/testing.sh:14) - Test kernel boot with QEMU (multiple modes: basic/serial/interactive)
|
||||||
|
- [`testing_qemu_basic_boot()`](lib/testing.sh:55) - Basic automated QEMU boot test with timeout
|
||||||
|
- [`testing_qemu_serial_boot()`](lib/testing.sh:90) - QEMU serial console test for debugging
|
||||||
|
- [`testing_qemu_interactive_boot()`](lib/testing.sh:114) - Interactive QEMU session (no timeout)
|
||||||
|
|
||||||
|
### Cloud Hypervisor Testing
|
||||||
|
- [`testing_cloud_hypervisor_boot()`](lib/testing.sh:135) - Test with cloud-hypervisor VMM
|
||||||
|
- [`testing_cloud_hypervisor_basic()`](lib/testing.sh:172) - Basic cloud-hypervisor test with timeout
|
||||||
|
- [`testing_cloud_hypervisor_serial()`](lib/testing.sh:206) - cloud-hypervisor serial console test
|
||||||
|
|
||||||
|
### Analysis and Orchestration
|
||||||
|
- [`testing_analyze_boot_log()`](lib/testing.sh:228) - Analyze boot logs for success/failure indicators
|
||||||
|
- [`testing_run_all()`](lib/testing.sh:299) - Run comprehensive test suite (QEMU + cloud-hypervisor)
|
||||||
|
|
||||||
|
## Usage Notes
|
||||||
|
|
||||||
|
### Function Availability
|
||||||
|
All functions are exported for sourcing and can be called from any script that sources the respective library file. The common pattern is:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Source the library
|
||||||
|
source "${SCRIPT_DIR}/lib/common.sh"
|
||||||
|
source "${SCRIPT_DIR}/lib/alpine.sh"
|
||||||
|
# ... other libraries as needed
|
||||||
|
|
||||||
|
# Use the functions
|
||||||
|
alpine_extract_miniroot "/path/to/target"
|
||||||
|
components_parse_sources_conf "/path/to/sources.conf" "/path/to/components"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Error Handling
|
||||||
|
All functions follow consistent error handling patterns:
|
||||||
|
- Return non-zero exit codes on failure
|
||||||
|
- Use [`safe_execute()`](lib/common.sh:54) for command execution
|
||||||
|
- Provide detailed logging via [`log_*()`](lib/common.sh:31) functions
|
||||||
|
- Clean up resources on failure
|
||||||
|
|
||||||
|
### Dependencies
|
||||||
|
Functions have dependencies on:
|
||||||
|
- External tools (checked via [`check_dependencies()`](lib/common.sh:96))
|
||||||
|
- Other library functions (noted in function descriptions)
|
||||||
|
- Configuration files and environment variables
|
||||||
|
- Proper directory structures
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
Most functions respect environment variables for configuration:
|
||||||
|
- `DEBUG=1` enables debug logging
|
||||||
|
- `ALPINE_VERSION`, `KERNEL_VERSION` set versions
|
||||||
|
- `RUST_TARGET` configures Rust builds
|
||||||
|
- Various `*_DIR` variables set paths
|
||||||
@@ -287,9 +287,9 @@ function alpine_aggressive_cleanup() {
|
|||||||
find "${initramfs_dir}/usr/share/zoneinfo" -type f ! -name "UTC" ! -path "*/posix/*" -delete 2>/dev/null || true
|
find "${initramfs_dir}/usr/share/zoneinfo" -type f ! -name "UTC" ! -path "*/posix/*" -delete 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Remove empty directories
|
# Remove empty directories (but preserve essential system directories)
|
||||||
log_info "Removing empty directories"
|
log_info "Removing empty directories (preserving essential system dirs)"
|
||||||
find "${initramfs_dir}" -type d -empty -delete 2>/dev/null || true
|
find "${initramfs_dir}" -type d -empty -not -path "*/dev" -not -path "*/proc" -not -path "*/sys" -not -path "*/tmp" -not -path "*/run" -not -path "*/mnt" -not -path "*/home" -not -path "*/root" -not -path "*/opt" -not -path "*/srv" -not -path "*/media*" -delete 2>/dev/null || true
|
||||||
|
|
||||||
# Calculate size after cleanup
|
# Calculate size after cleanup
|
||||||
local total_size=$(du -sh "${initramfs_dir}" 2>/dev/null | cut -f1 || echo "unknown")
|
local total_size=$(du -sh "${initramfs_dir}" 2>/dev/null | cut -f1 || echo "unknown")
|
||||||
@@ -322,6 +322,19 @@ function alpine_configure_system() {
|
|||||||
|
|
||||||
section_header "Configuring Alpine System Settings"
|
section_header "Configuring Alpine System Settings"
|
||||||
|
|
||||||
|
|
||||||
|
# Ensure all essential Linux directories exist
|
||||||
|
log_info "Creating essential Linux filesystem directories"
|
||||||
|
local essential_dirs=(
|
||||||
|
"dev" "proc" "sys" "tmp" "run"
|
||||||
|
"mnt" "home" "root" "opt" "srv" "media"
|
||||||
|
"media/cdrom" "media/floppy" "media/usb"
|
||||||
|
"mnt/cdrom" "mnt/floppy" "mnt/usb"
|
||||||
|
)
|
||||||
|
|
||||||
|
for dir in "${essential_dirs[@]}"; do
|
||||||
|
safe_mkdir "${initramfs_dir}/${dir}"
|
||||||
|
done
|
||||||
# Set hostname
|
# Set hostname
|
||||||
echo "zero-os" > "${initramfs_dir}/etc/hostname"
|
echo "zero-os" > "${initramfs_dir}/etc/hostname"
|
||||||
|
|
||||||
@@ -356,50 +369,74 @@ EOF
|
|||||||
log_info "Alpine system configuration complete"
|
log_info "Alpine system configuration complete"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Install firmware packages for hardware support
|
# Install firmware packages for hardware support (intelligent selection)
|
||||||
function alpine_install_firmware() {
|
function alpine_install_firmware() {
|
||||||
local initramfs_dir="$1"
|
local initramfs_dir="$1"
|
||||||
local firmware_conf="$2"
|
local firmware_conf="$2"
|
||||||
|
|
||||||
section_header "Installing Alpine Firmware Packages"
|
section_header "Installing Required Firmware Packages"
|
||||||
|
|
||||||
if [[ ! -f "$firmware_conf" ]]; then
|
# Use smart firmware selection from module analysis if available
|
||||||
log_warn "Firmware configuration not found: ${firmware_conf}"
|
local firmware_packages=()
|
||||||
log_info "Skipping firmware installation"
|
|
||||||
|
if [[ -n "${REQUIRED_FIRMWARE_PACKAGES:-}" ]]; then
|
||||||
|
log_info "Using intelligent firmware selection based on required modules"
|
||||||
|
read -ra firmware_packages <<< "$REQUIRED_FIRMWARE_PACKAGES"
|
||||||
|
|
||||||
|
for package in "${firmware_packages[@]}"; do
|
||||||
|
log_info " Required by modules: ${package}"
|
||||||
|
done
|
||||||
|
else
|
||||||
|
log_info "Falling back to firmware configuration file"
|
||||||
|
|
||||||
|
if [[ ! -f "$firmware_conf" ]]; then
|
||||||
|
log_warn "No firmware configuration found and no module requirements"
|
||||||
|
log_info "Skipping firmware installation"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Read firmware packages from config (excluding comments and empty lines)
|
||||||
|
while IFS=: read -r package description; do
|
||||||
|
# Skip comments and empty lines
|
||||||
|
if [[ "$package" =~ ^[[:space:]]*# ]] || [[ -z "${package// }" ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Trim whitespace
|
||||||
|
package=$(echo "$package" | xargs)
|
||||||
|
description=$(echo "$description" | xargs)
|
||||||
|
|
||||||
|
if [[ -n "$package" ]]; then
|
||||||
|
firmware_packages+=("$package")
|
||||||
|
log_info " - ${package}: ${description}"
|
||||||
|
fi
|
||||||
|
done < "$firmware_conf"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ${#firmware_packages[@]} -eq 0 ]]; then
|
||||||
|
log_warn "No firmware packages to install"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Setup chroot environment
|
# Setup chroot environment
|
||||||
alpine_setup_chroot "$initramfs_dir"
|
alpine_setup_chroot "$initramfs_dir"
|
||||||
|
|
||||||
# Read firmware packages from config (excluding comments and empty lines)
|
|
||||||
local firmware_packages=()
|
|
||||||
while IFS=: read -r package description; do
|
|
||||||
# Skip comments and empty lines
|
|
||||||
if [[ "$package" =~ ^[[:space:]]*# ]] || [[ -z "${package// }" ]]; then
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Trim whitespace
|
|
||||||
package=$(echo "$package" | xargs)
|
|
||||||
description=$(echo "$description" | xargs)
|
|
||||||
|
|
||||||
if [[ -n "$package" ]]; then
|
|
||||||
firmware_packages+=("$package")
|
|
||||||
log_info " - ${package}: ${description}"
|
|
||||||
fi
|
|
||||||
done < "$firmware_conf"
|
|
||||||
|
|
||||||
if [[ ${#firmware_packages[@]} -eq 0 ]]; then
|
|
||||||
log_warn "No firmware packages found in ${firmware_conf}"
|
|
||||||
alpine_cleanup_chroot "$initramfs_dir"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
log_info "Installing ${#firmware_packages[@]} firmware packages"
|
log_info "Installing ${#firmware_packages[@]} firmware packages"
|
||||||
|
|
||||||
# Install firmware packages
|
# Install firmware packages (allow failures for missing packages)
|
||||||
safe_execute chroot "$initramfs_dir" apk add --no-cache "${firmware_packages[@]}"
|
local failed_packages=()
|
||||||
|
for package in "${firmware_packages[@]}"; do
|
||||||
|
if chroot "$initramfs_dir" apk add --no-cache "$package" 2>/dev/null; then
|
||||||
|
log_info "✓ Installed firmware: $package"
|
||||||
|
else
|
||||||
|
log_warn "✗ Failed to install firmware: $package (may not be available)"
|
||||||
|
failed_packages+=("$package")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Report installation results
|
||||||
|
local installed_count=$((${#firmware_packages[@]} - ${#failed_packages[@]}))
|
||||||
|
log_info "Firmware installation: ${installed_count} installed, ${#failed_packages[@]} failed"
|
||||||
|
|
||||||
# List installed firmware files
|
# List installed firmware files
|
||||||
log_info "Checking installed firmware files:"
|
log_info "Checking installed firmware files:"
|
||||||
@@ -409,17 +446,19 @@ function alpine_install_firmware() {
|
|||||||
local firmware_size=$(du -sh "${initramfs_dir}/lib/firmware" 2>/dev/null | cut -f1 || echo "0B")
|
local firmware_size=$(du -sh "${initramfs_dir}/lib/firmware" 2>/dev/null | cut -f1 || echo "0B")
|
||||||
log_info " Firmware files: ${firmware_count} (${firmware_size})"
|
log_info " Firmware files: ${firmware_count} (${firmware_size})"
|
||||||
|
|
||||||
# Log some example firmware files for verification
|
# Log some example firmware files for verification (avoid SIGPIPE)
|
||||||
log_debug "Sample firmware files:"
|
log_debug "Sample firmware files:"
|
||||||
find "${initramfs_dir}/lib/firmware" -type f | head -10 | while read -r fw; do
|
if [[ $firmware_count -gt 0 ]]; then
|
||||||
log_debug " $(basename "$fw")"
|
find "${initramfs_dir}/lib/firmware" -type f -print0 | head -z -n 10 | while IFS= read -r -d '' fw; do
|
||||||
done
|
log_debug " $(basename "$fw")"
|
||||||
|
done 2>/dev/null || true
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
log_warn "No firmware directory found after installation"
|
log_warn "No firmware directory found after installation"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
alpine_cleanup_chroot "$initramfs_dir"
|
alpine_cleanup_chroot "$initramfs_dir"
|
||||||
log_info "Firmware installation complete: ${firmware_count} files"
|
log_info "Smart firmware installation complete: ${firmware_count} files"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Export functions
|
# Export functions
|
||||||
|
|||||||
@@ -55,8 +55,8 @@ function safe_execute() {
|
|||||||
local cmd="$*"
|
local cmd="$*"
|
||||||
log_info "Executing: ${cmd}"
|
log_info "Executing: ${cmd}"
|
||||||
|
|
||||||
if [[ "${DEBUG:-0}" == "1" ]]; then
|
if [[ "${DEBUG:-0}" == "1" ]] || in_container; then
|
||||||
# In debug mode, show all output
|
# In debug mode or container, show all output for visibility
|
||||||
if ! ${cmd}; then
|
if ! ${cmd}; then
|
||||||
log_error "Command failed: ${cmd}"
|
log_error "Command failed: ${cmd}"
|
||||||
exit 1
|
exit 1
|
||||||
@@ -68,6 +68,9 @@ function safe_execute() {
|
|||||||
log_error "Command failed: ${cmd}"
|
log_error "Command failed: ${cmd}"
|
||||||
log_error "Output: ${output}"
|
log_error "Output: ${output}"
|
||||||
exit 1
|
exit 1
|
||||||
|
else
|
||||||
|
# Show minimal progress indicator for non-debug mode
|
||||||
|
log_debug "Command completed successfully: ${cmd}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,11 +49,11 @@ function components_parse_sources_conf() {
|
|||||||
components_download_git "mycelium" "https://github.com/threefoldtech/mycelium" "v0.6.1" "$components_dir"
|
components_download_git "mycelium" "https://github.com/threefoldtech/mycelium" "v0.6.1" "$components_dir"
|
||||||
components_build_component "mycelium" "build_mycelium" "$components_dir"
|
components_build_component "mycelium" "build_mycelium" "$components_dir"
|
||||||
|
|
||||||
# Component 3: rfs
|
# Component 3: rfs (pre-built release)
|
||||||
component_count=$((component_count + 1))
|
component_count=$((component_count + 1))
|
||||||
log_info "Processing component ${component_count}: rfs (git)"
|
log_info "Processing component ${component_count}: rfs (release)"
|
||||||
components_download_git "rfs" "https://github.com/threefoldtech/rfs" "development" "$components_dir"
|
components_download_release "rfs" "https://github.com/threefoldtech/rfs/releases/download/v2.0.6/rfs" "v2.0.6" "$components_dir" ""
|
||||||
components_build_component "rfs" "build_rfs" "$components_dir"
|
components_build_component "rfs" "install_rfs" "$components_dir"
|
||||||
|
|
||||||
# Component 4: corex
|
# Component 4: corex
|
||||||
component_count=$((component_count + 1))
|
component_count=$((component_count + 1))
|
||||||
@@ -397,6 +397,32 @@ function build_mycelium() {
|
|||||||
log_info "Installed mycelium binary (${binary_size}) to: ${INSTALL_DIR}/usr/bin/mycelium"
|
log_info "Installed mycelium binary (${binary_size}) to: ${INSTALL_DIR}/usr/bin/mycelium"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Install function for rfs (pre-built binary)
|
||||||
|
function install_rfs() {
|
||||||
|
local name="$1"
|
||||||
|
local component_dir="$2"
|
||||||
|
|
||||||
|
section_header "Installing rfs binary"
|
||||||
|
|
||||||
|
log_info "Installing rfs from: ${component_dir}"
|
||||||
|
|
||||||
|
# Find the rfs binary
|
||||||
|
local binary_path="${component_dir}/rfs"
|
||||||
|
if [[ ! -f "$binary_path" ]]; then
|
||||||
|
log_error "rfs binary not found at: ${binary_path}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Make executable and install
|
||||||
|
safe_execute chmod +x "$binary_path"
|
||||||
|
safe_mkdir "${INSTALL_DIR}/usr/bin"
|
||||||
|
safe_execute cp "$binary_path" "${INSTALL_DIR}/usr/bin/rfs"
|
||||||
|
safe_execute chmod +x "${INSTALL_DIR}/usr/bin/rfs"
|
||||||
|
|
||||||
|
local binary_size=$(get_file_size "${INSTALL_DIR}/usr/bin/rfs")
|
||||||
|
log_info "Installed rfs binary (${binary_size}) to: ${INSTALL_DIR}/usr/bin/rfs"
|
||||||
|
}
|
||||||
|
|
||||||
# Install function for corex (pre-built binary)
|
# Install function for corex (pre-built binary)
|
||||||
function install_corex() {
|
function install_corex() {
|
||||||
local name="$1"
|
local name="$1"
|
||||||
@@ -490,4 +516,6 @@ export -f components_parse_sources_conf
|
|||||||
export -f components_download_git components_download_release components_process_extra_options
|
export -f components_download_git components_download_release components_process_extra_options
|
||||||
export -f components_build_component components_setup_rust_env
|
export -f components_build_component components_setup_rust_env
|
||||||
export -f build_zinit build_rfs build_mycelium install_corex
|
export -f build_zinit build_rfs build_mycelium install_corex
|
||||||
export -f components_verify_installation components_cleanup
|
export -f components_verify_installation components_cleanup
|
||||||
|
# Export functions for install_rfs
|
||||||
|
export -f install_rfs
|
||||||
@@ -165,9 +165,27 @@ function docker_run_build() {
|
|||||||
|
|
||||||
log_info "Executing build command in container: ${build_command}"
|
log_info "Executing build command in container: ${build_command}"
|
||||||
|
|
||||||
|
# Pass through environment variables for proper logging
|
||||||
|
local env_args=""
|
||||||
|
local env_vars=(
|
||||||
|
"DEBUG"
|
||||||
|
"ALPINE_VERSION"
|
||||||
|
"KERNEL_VERSION"
|
||||||
|
"RUST_TARGET"
|
||||||
|
"OPTIMIZATION_LEVEL"
|
||||||
|
)
|
||||||
|
|
||||||
|
for var in "${env_vars[@]}"; do
|
||||||
|
if [[ -n "${!var:-}" ]]; then
|
||||||
|
env_args="${env_args} -e ${var}=${!var}"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
# Run with privileged access for chroot mounts and system operations
|
# Run with privileged access for chroot mounts and system operations
|
||||||
|
log_info "Container environment: ${env_args}"
|
||||||
safe_execute ${CONTAINER_RUNTIME} run --rm \
|
safe_execute ${CONTAINER_RUNTIME} run --rm \
|
||||||
--privileged \
|
--privileged \
|
||||||
|
${env_args} \
|
||||||
-v "${PROJECT_ROOT}:/workspace" \
|
-v "${PROJECT_ROOT}:/workspace" \
|
||||||
-w /workspace \
|
-w /workspace \
|
||||||
"${image}" \
|
"${image}" \
|
||||||
|
|||||||
@@ -32,10 +32,10 @@ function initramfs_setup_zinit() {
|
|||||||
safe_execute rm -f "${initramfs_dir}/sbin/init"
|
safe_execute rm -f "${initramfs_dir}/sbin/init"
|
||||||
safe_execute ln -sf zinit "${initramfs_dir}/sbin/init"
|
safe_execute ln -sf zinit "${initramfs_dir}/sbin/init"
|
||||||
|
|
||||||
# Copy zinit configuration
|
# Copy zinit configuration (all YAML and scripts)
|
||||||
log_info "Installing zinit configuration"
|
log_info "Installing zinit configuration"
|
||||||
safe_mkdir "${initramfs_dir}/etc/zinit"
|
safe_mkdir "${initramfs_dir}/etc/zinit"
|
||||||
safe_copy "${zinit_config_dir}"/* "${initramfs_dir}/etc/zinit/"
|
safe_execute cp -r "${zinit_config_dir}"/* "${initramfs_dir}/etc/zinit/"
|
||||||
|
|
||||||
# Ensure proper permissions
|
# Ensure proper permissions
|
||||||
safe_execute chmod 755 "${initramfs_dir}/sbin/zinit"
|
safe_execute chmod 755 "${initramfs_dir}/sbin/zinit"
|
||||||
@@ -67,13 +67,40 @@ function initramfs_setup_zinit() {
|
|||||||
log_info "zinit setup complete - OpenRC completely replaced"
|
log_info "zinit setup complete - OpenRC completely replaced"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Setup 2-stage module loading system with dependency resolution
|
# Install the critical /init script for initramfs boot
|
||||||
|
function initramfs_install_init_script() {
|
||||||
|
local initramfs_dir="$1"
|
||||||
|
local init_script_path="$2"
|
||||||
|
|
||||||
|
section_header "Installing initramfs /init script"
|
||||||
|
|
||||||
|
if [[ ! -f "$init_script_path" ]]; then
|
||||||
|
log_error "Init script not found: ${init_script_path}"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Install the init script as /init in initramfs root
|
||||||
|
log_info "Installing init script from: ${init_script_path}"
|
||||||
|
safe_execute cp "$init_script_path" "${initramfs_dir}/init"
|
||||||
|
safe_execute chmod 755 "${initramfs_dir}/init"
|
||||||
|
|
||||||
|
# Verify installation
|
||||||
|
if [[ ! -x "${initramfs_dir}/init" ]]; then
|
||||||
|
log_error "Failed to install init script"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_info "✓ Initramfs /init script installed successfully"
|
||||||
|
log_info " Boot flow: /init -> setup environment -> switch_root -> /sbin/zinit init"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Setup 2-stage module loading system with dependency resolution and firmware correlation
|
||||||
function initramfs_setup_modules() {
|
function initramfs_setup_modules() {
|
||||||
local initramfs_dir="$1"
|
local initramfs_dir="$1"
|
||||||
local modules_conf="$2"
|
local modules_conf="$2"
|
||||||
local kernel_version="${3:-$(uname -r)}"
|
local kernel_version="${3:-$(uname -r)}"
|
||||||
|
|
||||||
section_header "Setting up 2-stage module loading with dependencies"
|
section_header "Setting up 2-stage module loading with firmware correlation"
|
||||||
|
|
||||||
if [[ ! -f "$modules_conf" ]]; then
|
if [[ ! -f "$modules_conf" ]]; then
|
||||||
log_error "Modules configuration file not found: ${modules_conf}"
|
log_error "Modules configuration file not found: ${modules_conf}"
|
||||||
@@ -83,12 +110,24 @@ function initramfs_setup_modules() {
|
|||||||
local modules_dir="${initramfs_dir}/lib/modules/${kernel_version}"
|
local modules_dir="${initramfs_dir}/lib/modules/${kernel_version}"
|
||||||
safe_mkdir "$modules_dir"
|
safe_mkdir "$modules_dir"
|
||||||
|
|
||||||
# Create stage1 module list with dependencies
|
# Track required firmware packages
|
||||||
|
local required_firmware=()
|
||||||
|
|
||||||
|
# Create stage1 module list with dependencies and firmware
|
||||||
log_info "Resolving stage1 module dependencies (critical boot modules)"
|
log_info "Resolving stage1 module dependencies (critical boot modules)"
|
||||||
local stage1_modules=()
|
local stage1_modules=()
|
||||||
while IFS= read -r module; do
|
local stage1_firmware=()
|
||||||
[[ -n "$module" ]] && stage1_modules+=("$module")
|
|
||||||
done < <(grep "^stage1:" "$modules_conf" | cut -d: -f2)
|
while IFS=: read -r stage module firmware; do
|
||||||
|
if [[ "$stage" == "stage1" && -n "$module" ]]; then
|
||||||
|
stage1_modules+=("$module")
|
||||||
|
if [[ -n "$firmware" && "$firmware" != "none" ]]; then
|
||||||
|
stage1_firmware+=("$firmware")
|
||||||
|
required_firmware+=("$firmware")
|
||||||
|
log_debug "Module $module requires firmware: $firmware"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done < <(grep "^stage1:" "$modules_conf")
|
||||||
|
|
||||||
local stage1_with_deps=()
|
local stage1_with_deps=()
|
||||||
if [[ ${#stage1_modules[@]} -gt 0 ]]; then
|
if [[ ${#stage1_modules[@]} -gt 0 ]]; then
|
||||||
@@ -98,12 +137,21 @@ function initramfs_setup_modules() {
|
|||||||
# Write stage1 list with dependencies
|
# Write stage1 list with dependencies
|
||||||
printf '%s\n' "${stage1_with_deps[@]}" > "${modules_dir}/stage1.list"
|
printf '%s\n' "${stage1_with_deps[@]}" > "${modules_dir}/stage1.list"
|
||||||
|
|
||||||
# Create stage2 module list with dependencies
|
# Create stage2 module list with dependencies and firmware
|
||||||
log_info "Resolving stage2 module dependencies (extended hardware)"
|
log_info "Resolving stage2 module dependencies (extended hardware)"
|
||||||
local stage2_modules=()
|
local stage2_modules=()
|
||||||
while IFS= read -r module; do
|
local stage2_firmware=()
|
||||||
[[ -n "$module" ]] && stage2_modules+=("$module")
|
|
||||||
done < <(grep "^stage2:" "$modules_conf" | cut -d: -f2)
|
while IFS=: read -r stage module firmware; do
|
||||||
|
if [[ "$stage" == "stage2" && -n "$module" ]]; then
|
||||||
|
stage2_modules+=("$module")
|
||||||
|
if [[ -n "$firmware" && "$firmware" != "none" ]]; then
|
||||||
|
stage2_firmware+=("$firmware")
|
||||||
|
required_firmware+=("$firmware")
|
||||||
|
log_debug "Module $module requires firmware: $firmware"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done < <(grep "^stage2:" "$modules_conf")
|
||||||
|
|
||||||
local stage2_with_deps=()
|
local stage2_with_deps=()
|
||||||
if [[ ${#stage2_modules[@]} -gt 0 ]]; then
|
if [[ ${#stage2_modules[@]} -gt 0 ]]; then
|
||||||
@@ -122,16 +170,34 @@ function initramfs_setup_modules() {
|
|||||||
# Write stage2 list with unique dependencies
|
# Write stage2 list with unique dependencies
|
||||||
printf '%s\n' "${stage2_with_deps[@]}" > "${modules_dir}/stage2.list"
|
printf '%s\n' "${stage2_with_deps[@]}" > "${modules_dir}/stage2.list"
|
||||||
|
|
||||||
|
# Create firmware requirements list (remove duplicates)
|
||||||
|
local unique_firmware=($(printf '%s\n' "${required_firmware[@]}" | sort -u))
|
||||||
|
if [[ ${#unique_firmware[@]} -gt 0 ]]; then
|
||||||
|
printf '%s\n' "${unique_firmware[@]}" > "${modules_dir}/required-firmware.list"
|
||||||
|
log_info "Created firmware requirements list: ${#unique_firmware[@]} packages"
|
||||||
|
for fw in "${unique_firmware[@]}"; do
|
||||||
|
log_info " Required firmware: $fw"
|
||||||
|
done
|
||||||
|
|
||||||
|
# Export for use by firmware installation
|
||||||
|
export REQUIRED_FIRMWARE_PACKAGES="${unique_firmware[*]}"
|
||||||
|
else
|
||||||
|
log_info "No firmware packages required"
|
||||||
|
export REQUIRED_FIRMWARE_PACKAGES=""
|
||||||
|
fi
|
||||||
|
|
||||||
# Create module loading scripts
|
# Create module loading scripts
|
||||||
initramfs_create_module_scripts "$initramfs_dir" "$kernel_version"
|
initramfs_create_module_scripts "$initramfs_dir" "$kernel_version"
|
||||||
|
|
||||||
# Report final counts
|
# Report final counts
|
||||||
local stage1_count=${#stage1_with_deps[@]}
|
local stage1_count=${#stage1_with_deps[@]}
|
||||||
local stage2_count=${#stage2_with_deps[@]}
|
local stage2_count=${#stage2_with_deps[@]}
|
||||||
|
local firmware_count=${#unique_firmware[@]}
|
||||||
|
|
||||||
log_info "Module configuration complete:"
|
log_info "Module configuration complete:"
|
||||||
log_info " Stage1 (critical + deps): ${stage1_count} modules"
|
log_info " Stage1 (critical + deps): ${stage1_count} modules"
|
||||||
log_info " Stage2 (extended + deps): ${stage2_count} modules"
|
log_info " Stage2 (extended + deps): ${stage2_count} modules"
|
||||||
|
log_info " Required firmware packages: ${firmware_count}"
|
||||||
log_info " Total unique modules: $((stage1_count + stage2_count))"
|
log_info " Total unique modules: $((stage1_count + stage2_count))"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -204,10 +270,6 @@ function initramfs_resolve_module_dependencies() {
|
|||||||
printf '%s\n' "${unique_modules[@]}"
|
printf '%s\n' "${unique_modules[@]}"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Export functions
|
|
||||||
export -f alpine_extract_miniroot alpine_setup_chroot alpine_cleanup_chroot
|
|
||||||
export -f alpine_install_packages alpine_install_firmware alpine_aggressive_cleanup
|
|
||||||
export -f alpine_configure_repos alpine_configure_system
|
|
||||||
|
|
||||||
# Create module loading scripts for zinit
|
# Create module loading scripts for zinit
|
||||||
function initramfs_create_module_scripts() {
|
function initramfs_create_module_scripts() {
|
||||||
@@ -292,22 +354,31 @@ function initramfs_strip_and_upx() {
|
|||||||
if file "$file" | grep -q "ELF.*executable"; then
|
if file "$file" | grep -q "ELF.*executable"; then
|
||||||
log_debug "Processing executable: $file"
|
log_debug "Processing executable: $file"
|
||||||
|
|
||||||
# Strip debug symbols
|
# Strip debug symbols (ignore already stripped files)
|
||||||
if strip "$file" 2>/dev/null; then
|
if strip "$file" 2>/dev/null || true; then
|
||||||
((stripped_count++))
|
if [[ $? -eq 0 ]]; then
|
||||||
log_debug "Stripped: $file"
|
((stripped_count++))
|
||||||
else
|
log_debug "Stripped: $file"
|
||||||
((failed_strip++))
|
else
|
||||||
log_debug "Failed to strip: $file"
|
((failed_strip++))
|
||||||
|
log_debug "Already stripped or failed: $file"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# UPX compress (best compression)
|
# UPX compress (best compression) - skip if already compressed or fails
|
||||||
if upx --best --force "$file" 2>/dev/null; then
|
if command_exists "upx"; then
|
||||||
((upx_count++))
|
if upx --best --force "$file" >/dev/null 2>&1 || true; then
|
||||||
log_debug "UPX compressed: $file"
|
if [[ $? -eq 0 ]]; then
|
||||||
|
((upx_count++))
|
||||||
|
log_debug "UPX compressed: $file"
|
||||||
|
else
|
||||||
|
((failed_upx++))
|
||||||
|
log_debug "UPX failed or already compressed: $file"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
|
log_debug "UPX not available, skipping compression for: $file"
|
||||||
((failed_upx++))
|
((failed_upx++))
|
||||||
log_debug "Failed to UPX: $file"
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done < <(find "$initramfs_dir" -type f -executable -print0)
|
done < <(find "$initramfs_dir" -type f -executable -print0)
|
||||||
@@ -323,12 +394,14 @@ function initramfs_strip_and_upx() {
|
|||||||
log_debug "Processing library: $file"
|
log_debug "Processing library: $file"
|
||||||
|
|
||||||
# Strip libraries (more conservative - keep function symbols)
|
# Strip libraries (more conservative - keep function symbols)
|
||||||
if strip --strip-unneeded "$file" 2>/dev/null; then
|
if strip --strip-unneeded "$file" 2>/dev/null || true; then
|
||||||
((lib_stripped++))
|
if [[ $? -eq 0 ]]; then
|
||||||
log_debug "Stripped library: $file"
|
((lib_stripped++))
|
||||||
else
|
log_debug "Stripped library: $file"
|
||||||
((lib_failed++))
|
else
|
||||||
log_debug "Failed to strip library: $file"
|
((lib_failed++))
|
||||||
|
log_debug "Library already stripped or failed: $file"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done < <(find "$initramfs_dir" -name "*.so*" -type f -print0)
|
done < <(find "$initramfs_dir" -name "*.so*" -type f -print0)
|
||||||
@@ -421,6 +494,7 @@ function initramfs_validate() {
|
|||||||
|
|
||||||
# Check essential files and directories
|
# Check essential files and directories
|
||||||
local essential_items=(
|
local essential_items=(
|
||||||
|
"init"
|
||||||
"sbin/init"
|
"sbin/init"
|
||||||
"sbin/zinit"
|
"sbin/zinit"
|
||||||
"bin/busybox"
|
"bin/busybox"
|
||||||
@@ -443,7 +517,15 @@ function initramfs_validate() {
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# Check that init is properly linked to zinit
|
# Check that initramfs /init script exists
|
||||||
|
if [[ -x "${initramfs_dir}/init" ]]; then
|
||||||
|
log_info "✓ Initramfs /init script found"
|
||||||
|
else
|
||||||
|
log_error "✗ Initramfs /init script missing"
|
||||||
|
((errors++))
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check that /sbin/init is properly linked to zinit
|
||||||
if [[ -L "${initramfs_dir}/sbin/init" ]]; then
|
if [[ -L "${initramfs_dir}/sbin/init" ]]; then
|
||||||
local link_target=$(readlink "${initramfs_dir}/sbin/init")
|
local link_target=$(readlink "${initramfs_dir}/sbin/init")
|
||||||
if [[ "$link_target" == "zinit" ]]; then
|
if [[ "$link_target" == "zinit" ]]; then
|
||||||
@@ -540,75 +622,7 @@ function initramfs_test_archive() {
|
|||||||
log_info "Archive integrity test passed"
|
log_info "Archive integrity test passed"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Export functions
|
# Export all functions at the end after they're all defined
|
||||||
export -f initramfs_setup_zinit initramfs_setup_modules initramfs_create_module_scripts
|
export -f initramfs_setup_zinit initramfs_setup_modules initramfs_resolve_module_dependencies
|
||||||
export -f initramfs_strip_and_upx initramfs_create_cpio
|
export -f initramfs_install_init_script initramfs_create_module_scripts initramfs_strip_and_upx
|
||||||
export -f initramfs_validate initramfs_test_archive
|
export -f initramfs_create_cpio initramfs_validate initramfs_test_archive
|
||||||
# Resolve module dependencies recursively using modinfo
|
|
||||||
function initramfs_resolve_module_dependencies() {
|
|
||||||
local modules=("$@")
|
|
||||||
local resolved_modules=()
|
|
||||||
local processed_modules=()
|
|
||||||
|
|
||||||
log_debug "Resolving dependencies for modules: ${modules[*]}"
|
|
||||||
|
|
||||||
# Function to recursively resolve a single module's dependencies
|
|
||||||
function resolve_single_module() {
|
|
||||||
local module="$1"
|
|
||||||
|
|
||||||
# Skip if already processed
|
|
||||||
if printf '%s\n' "${processed_modules[@]}" | grep -q "^${module}$"; then
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
processed_modules+=("$module")
|
|
||||||
|
|
||||||
# Get module dependencies using modinfo
|
|
||||||
local deps=()
|
|
||||||
if command_exists "modinfo"; then
|
|
||||||
# Try to get dependencies - modinfo may fail for built-in modules
|
|
||||||
local modinfo_output
|
|
||||||
if modinfo_output=$(modinfo "$module" 2>/dev/null); then
|
|
||||||
# Extract depends line and parse comma-separated dependencies
|
|
||||||
local depends_line=$(echo "$modinfo_output" | grep '^depends:' | head -1 | cut -d: -f2- | tr -d ' ')
|
|
||||||
if [[ -n "$depends_line" && "$depends_line" != "-" ]]; then
|
|
||||||
IFS=',' read -ra deps <<< "$depends_line"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
log_debug "modinfo failed for module: $module (may be built-in)"
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
log_warn "modinfo not available, skipping dependency resolution"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Recursively resolve dependencies first
|
|
||||||
for dep in "${deps[@]}"; do
|
|
||||||
if [[ -n "$dep" ]]; then
|
|
||||||
log_debug "Module $module depends on: $dep"
|
|
||||||
resolve_single_module "$dep"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Add current module to resolved list (after dependencies)
|
|
||||||
resolved_modules+=("$module")
|
|
||||||
}
|
|
||||||
|
|
||||||
# Process all requested modules
|
|
||||||
for module in "${modules[@]}"; do
|
|
||||||
resolve_single_module "$module"
|
|
||||||
done
|
|
||||||
|
|
||||||
# Remove duplicates while preserving order
|
|
||||||
local unique_modules=()
|
|
||||||
local seen_modules=()
|
|
||||||
|
|
||||||
for module in "${resolved_modules[@]}"; do
|
|
||||||
if ! printf '%s\n' "${seen_modules[@]}" | grep -q "^${module}$"; then
|
|
||||||
unique_modules+=("$module")
|
|
||||||
seen_modules+=("$module")
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
log_debug "Resolved ${#unique_modules[@]} unique modules with dependencies"
|
|
||||||
printf '%s\n' "${unique_modules[@]}"
|
|
||||||
}
|
|
||||||
@@ -118,13 +118,27 @@ function kernel_modify_config_for_initramfs() {
|
|||||||
|
|
||||||
log_info "Modifying kernel config for embedded initramfs"
|
log_info "Modifying kernel config for embedded initramfs"
|
||||||
|
|
||||||
# Use sed to update configuration
|
# Use sed to update configuration (execute directly to avoid quote issues)
|
||||||
safe_execute sed -i "s|^CONFIG_INITRAMFS_SOURCE=.*|CONFIG_INITRAMFS_SOURCE=\"${initramfs_path}\"|" .config
|
log_info "Setting INITRAMFS_SOURCE to: ${initramfs_path}"
|
||||||
|
if ! sed -i "s|^CONFIG_INITRAMFS_SOURCE=.*|CONFIG_INITRAMFS_SOURCE=\"${initramfs_path}\"|" .config; then
|
||||||
|
log_error "Failed to set INITRAMFS_SOURCE in kernel config"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Ensure XZ compression is enabled for initramfs
|
# Ensure XZ compression is enabled for initramfs
|
||||||
safe_execute sed -i 's/^# CONFIG_RD_XZ is not set/CONFIG_RD_XZ=y/' .config
|
log_info "Enabling XZ decompression support"
|
||||||
safe_execute sed -i 's/^CONFIG_INITRAMFS_COMPRESSION_NONE=y/# CONFIG_INITRAMFS_COMPRESSION_NONE is not set/' .config
|
if ! sed -i 's|^# CONFIG_RD_XZ is not set|CONFIG_RD_XZ=y|' .config; then
|
||||||
safe_execute sed -i 's/^# CONFIG_INITRAMFS_COMPRESSION_XZ is not set/CONFIG_INITRAMFS_COMPRESSION_XZ=y/' .config
|
log_warn "Could not enable CONFIG_RD_XZ (may already be set)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_info "Setting initramfs compression to XZ"
|
||||||
|
if ! sed -i 's|^CONFIG_INITRAMFS_COMPRESSION_NONE=y|# CONFIG_INITRAMFS_COMPRESSION_NONE is not set|' .config; then
|
||||||
|
log_warn "Could not disable INITRAMFS_COMPRESSION_NONE (may already be disabled)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! sed -i 's|^# CONFIG_INITRAMFS_COMPRESSION_XZ is not set|CONFIG_INITRAMFS_COMPRESSION_XZ=y|' .config; then
|
||||||
|
log_warn "Could not enable INITRAMFS_COMPRESSION_XZ (may already be set)"
|
||||||
|
fi
|
||||||
|
|
||||||
# Verify critical settings
|
# Verify critical settings
|
||||||
if ! grep -q "CONFIG_INITRAMFS_SOURCE=\"${initramfs_path}\"" .config; then
|
if ! grep -q "CONFIG_INITRAMFS_SOURCE=\"${initramfs_path}\"" .config; then
|
||||||
@@ -132,9 +146,11 @@ function kernel_modify_config_for_initramfs() {
|
|||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! grep -q "CONFIG_RD_XZ=y" .config; then
|
# Check if XZ support is available (either RD_XZ or built-in)
|
||||||
log_error "Failed to enable XZ decompression in kernel config"
|
if grep -q "CONFIG_RD_XZ=y" .config || grep -q "CONFIG_KERNEL_XZ=y" .config; then
|
||||||
return 1
|
log_info "✓ XZ decompression support confirmed"
|
||||||
|
else
|
||||||
|
log_warn "XZ decompression support not confirmed, kernel may not boot"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log_info "Kernel config updated for embedded initramfs"
|
log_info "Kernel config updated for embedded initramfs"
|
||||||
@@ -262,4 +278,4 @@ function kernel_cleanup() {
|
|||||||
|
|
||||||
# Export functions
|
# Export functions
|
||||||
export -f kernel_download_source kernel_apply_config kernel_modify_config_for_initramfs
|
export -f kernel_download_source kernel_apply_config kernel_modify_config_for_initramfs
|
||||||
export -f kernel_build_with_initramfs kernel_build_modules kernel_cleanup
|
export -f kernel_build_with_initramfs kernel_build_modules kernel_cleanup
|
||||||
|
|||||||
Reference in New Issue
Block a user