ix init script duplication and CPIO creation issues

- Remove duplicate /sbin/init copying from initramfs_setup_zinit()
- Only /init should be config/init (initramfs setup script)
- No /sbin/init needed - config/init calls 'switch_root /mnt/root /sbin/zinit init'
- Remove unsupported cpio --owner option that broke CPIO creation
- Fix validation to not expect /sbin/init file
- Correct boot flow: /init → switch_root → /sbin/zinit init
- Remove strip and UPX compression from zinit binary copying
- UPX compression was corrupting the zinit binary causing segfaults after switch_root
- Keep zinit unmodified as it's
This commit is contained in:
2025-09-05 11:43:25 +02:00
parent 38dee2de74
commit 8c3868b242
102 changed files with 589 additions and 375 deletions

View File

@@ -27,18 +27,9 @@ function initramfs_setup_zinit() {
return 1
fi
# Copy config/init as /sbin/init (not a symlink to zinit)
log_info "Installing config/init as /sbin/init"
safe_execute rm -f "${initramfs_dir}/sbin/init"
local config_init="${PROJECT_ROOT}/config/init"
if [[ -f "$config_init" ]]; then
safe_execute cp "$config_init" "${initramfs_dir}/sbin/init"
safe_execute chmod 755 "${initramfs_dir}/sbin/init"
log_info "✓ Installed config/init as /sbin/init"
else
log_error "config/init not found: $config_init"
return 1
fi
# Note: /sbin/init is not needed - config/init calls "switch_root /mnt/root /sbin/zinit init"
# So after switch_root, /sbin/zinit is the init system (not /sbin/init)
log_info "zinit will be called directly via '/sbin/zinit init' after switch_root"
# Copy zinit configuration (all YAML and scripts)
log_info "Installing zinit configuration"
@@ -117,29 +108,16 @@ function initramfs_copy_components() {
local copied_count=0
local missing_count=0
# Copy zinit to /sbin
# Copy zinit to /sbin (NO stripping/UPX - critical init system)
local zinit_binary="${components_dir}/zinit/target/x86_64-unknown-linux-musl/release/zinit"
if [[ -f "$zinit_binary" ]]; then
safe_mkdir "${initramfs_dir}/sbin"
safe_execute cp "$zinit_binary" "${initramfs_dir}/sbin/zinit"
safe_execute chmod +x "${initramfs_dir}/sbin/zinit"
# Strip and UPX compress zinit
local original_size=$(get_file_size "${initramfs_dir}/sbin/zinit")
if strip "${initramfs_dir}/sbin/zinit" 2>/dev/null || true; then
log_debug "Stripped zinit"
else
log_debug "zinit already stripped or strip failed"
fi
if command_exists "upx" && upx --best --force "${initramfs_dir}/sbin/zinit" >/dev/null 2>&1 || true; then
log_debug "UPX compressed zinit"
else
log_debug "UPX failed or already compressed"
fi
local final_size=$(get_file_size "${initramfs_dir}/sbin/zinit")
log_info "✓ Copied zinit ${original_size}${final_size} to /sbin/zinit"
# Keep zinit unmodified to prevent segfaults after switch_root
local size=$(get_file_size "${initramfs_dir}/sbin/zinit")
log_info "✓ Copied zinit (${size}) to /sbin/zinit (no optimization - critical binary)"
((copied_count++))
else
log_error "✗ zinit binary not found: ${zinit_binary}"
@@ -669,7 +647,6 @@ function initramfs_validate() {
# Check essential files and directories
local essential_items=(
"init"
"sbin/init"
"sbin/zinit"
"bin/busybox"
"etc/zinit"
@@ -699,12 +676,11 @@ function initramfs_validate() {
((errors++))
fi
# Check that /sbin/init is a script
if [[ -f "${initramfs_dir}/sbin/init" && -x "${initramfs_dir}/sbin/init" ]]; then
log_info " /sbin/init script found"
# Check that /sbin/init does NOT exist (zinit called directly)
if [[ -e "${initramfs_dir}/sbin/init" ]]; then
log_warn " /sbin/init exists but should not (zinit called directly)"
else
log_error " /sbin/init is missing or not executable"
((errors++))
log_info " /sbin/init correctly absent (zinit called directly)"
fi
# Check zinit configuration