142 lines
6.5 KiB
Bash
142 lines
6.5 KiB
Bash
#!/bin/bash
|
|
|
|
# ==============================================================================
|
|
# SCRIPT: setup_host_build_env.sh
|
|
# PURPOSE: Prepares a Void Linux host environment for cross-architecture ISO builds.
|
|
#
|
|
# This script automates several setup steps required on the host machine
|
|
# when building ISO images for architectures different from the host (e.g.,
|
|
# building aarch64 or i686 ISOs on an x86_64 host).
|
|
#
|
|
# What this script does:
|
|
# 1. Updates the host's package list.
|
|
# 2. Installs necessary 32-bit libraries (like lzo, libgcc, readline) on the
|
|
# x86_64 host. These are required if you execute 32-bit tools (like mksquashfs
|
|
# or xorriso from bootstrap environments) directly on the host system.
|
|
# NOTE: If you configure your build script to run these tools *inside*
|
|
# the target chroot environment using 'chroot' or 'xbps-uchroot', these
|
|
# 32-bit host libraries might not be strictly necessary for *that specific*
|
|
# reason, but are often needed by other host tools.
|
|
# 3. Installs QEMU user mode emulators, including the one for aarch64.
|
|
# 4. Ensures the 'binfmt_misc' kernel module is loaded and its filesystem is
|
|
# mounted. This kernel feature allows executing binaries for foreign
|
|
# architectures using emulators like QEMU.
|
|
# 5. Registers the installed QEMU user emulators with the kernel's binfmt_misc
|
|
# interface, enabling the execution of foreign binaries (like aarch64
|
|
# executables) via QEMU emulation when run in a chroot or similar environment.
|
|
#
|
|
# PREREQUISITES:
|
|
# - A Void Linux host system.
|
|
# - An active internet connection to download packages.
|
|
# - sudo privileges to install packages and configure system settings.
|
|
#
|
|
# USAGE:
|
|
# 1. Save this code to a file (e.g., setup_host_build_env.sh).
|
|
# 2. Make the file executable: chmod +x setup_host_build_env.sh
|
|
# 3. Run the script with sudo: sudo ./setup_host_build_env.sh
|
|
#
|
|
# IMPORTANT NOTE:
|
|
# This script ONLY sets up the HOST environment. It DOES NOT modify your
|
|
# iso_builder.py script. You STILL NEED to modify your iso_builder.py script
|
|
# to:
|
|
# - Execute cross-architecture commands (like xbps-install for bootstrap,
|
|
# mksquashfs, xorriso) *inside* the target rootfs or bootstrap environment
|
|
# using 'sudo chroot /path/to/target/rootfs <command>' or 'xbps-uchroot'.
|
|
# - Ensure the correct repository URLs for the target architecture are used
|
|
# in your xbps-install commands within the script.
|
|
# ==============================================================================
|
|
|
|
# Exit immediately if a command exits with a non-zero status.
|
|
set -e
|
|
|
|
# Check if running as root
|
|
if [ "$EUID" -ne 0 ]; then
|
|
echo "Error: Please run this script with sudo."
|
|
exit 1
|
|
fi
|
|
|
|
echo "=> Updating host package list..."
|
|
xbps-install -S -y
|
|
|
|
# Install 32-bit libraries needed for i686 tools executed on the host
|
|
# These might be needed if you don't run mksquashfs/xorriso etc. in a chroot/uchroot
|
|
echo "=> Installing 32-bit libraries for i686 execution on the host (if needed)..."
|
|
xbps-install -y lzo-32bit libgcc-32bit readline8-32bit || {
|
|
echo "Warning: Failed to install one or more 32-bit packages. Continuing."
|
|
# Don't exit here, as QEMU packages are still required for aarch64 etc.
|
|
}
|
|
|
|
# Install QEMU user mode emulators
|
|
echo "=> Installing QEMU user mode emulators (including aarch64)..."
|
|
# Install the qemu-user-static dummy package, which depends on architecture-specific ones.
|
|
# Explicitly installing qemu-user-aarch64 for clarity, though dependency might cover it.
|
|
xbps-install -y qemu-user-static qemu-user-aarch64
|
|
|
|
# Ensure binfmt_misc kernel module is loaded and filesystem is mounted
|
|
echo "=> Verifying and ensuring binfmt_misc is active in the kernel..."
|
|
|
|
# Load module if not loaded
|
|
if ! lsmod | grep -q binfmt_misc; then
|
|
echo "Loading binfmt_misc kernel module..."
|
|
modprobe binfmt_misc
|
|
# Give a little time for the /proc filesystem to update
|
|
sleep 1
|
|
fi
|
|
|
|
# Mount filesystem if not mounted
|
|
if ! mountpoint -q /proc/sys/fs/binfmt_misc; then
|
|
echo "Mounting binfmt_misc filesystem at /proc/sys/fs/binfmt_misc..."
|
|
mount -t binfmt_misc none /proc/sys/fs/binfmt_misc
|
|
# Give a little time for the filesystem to be mounted
|
|
sleep 1
|
|
fi
|
|
|
|
# Verify that the directory is accessible after attempting to load/mount
|
|
if [ ! -d "/proc/sys/fs/binfmt_misc" ]; then
|
|
echo "FATAL ERROR: The directory /proc/sys/fs/binfmt_misc does not exist or is not accessible."
|
|
echo "binfmt_misc setup failed. Cannot proceed with emulation."
|
|
exit 1
|
|
fi
|
|
|
|
# Register QEMU user binfmts from installed configuration files
|
|
echo "=> Registering QEMU user emulators with the kernel (binfmt_misc)..."
|
|
# Iterate over all qemu-* configuration files found in the standard location
|
|
for binfmt_file in /usr/share/binfmts/qemu-*; do
|
|
if [ -f "$binfmt_file" ]; then
|
|
# Extract the binfmt name (e.g., qemu-aarch64)
|
|
binfmt_name=$(basename "$binfmt_file")
|
|
# Expected path in /proc where it would be registered
|
|
proc_binfmt_path="/proc/sys/fs/binfmt_misc/$binfmt_name"
|
|
|
|
# Check if it's already registered (the file exists in /proc)
|
|
if [ -f "$proc_binfmt_path" ]; then
|
|
echo "$binfmt_name is already registered."
|
|
else
|
|
echo "Registering $binfmt_name..."
|
|
# Copy the configuration file from /usr/share to /proc to register it.
|
|
# We use tee with sudo to ensure the write operation is done as root.
|
|
# The > /dev/null prevents tee from printing the content to stdout.
|
|
if sudo cp "$binfmt_file" /proc/sys/fs/binfmt_misc/; then
|
|
echo "$binfmt_name registered successfully."
|
|
else
|
|
echo "Warning: Failed to register $binfmt_name. This may impact builds for this architecture."
|
|
fi
|
|
fi
|
|
fi
|
|
done
|
|
|
|
# Verify specifically if the aarch64 registration was successful
|
|
echo "=> Verifying if qemu-aarch64 emulation is active..."
|
|
if [ -f "/proc/sys/fs/binfmt_misc/qemu-aarch64" ]; then
|
|
echo "qemu-aarch64 emulation is active and registered."
|
|
else
|
|
echo "ERROR: qemu-aarch64 emulation registration failed!"
|
|
echo "aarch64 builds will likely fail with 'Executable format error'."
|
|
# Do not exit here, as other registrations might have worked
|
|
fi
|
|
|
|
echo "=> Host environment setup complete."
|
|
echo "You can now try running your iso_builder.py script for aarch64 (or another architecture)."
|
|
echo "Remember to modify your iso_builder.py script to:"
|
|
echo "1. Execute the initial bootstrap 'xbps-install' command *inside* the chroot for the target rootfs."
|
|
echo "2. Use ONLY the repository URLs relevant for the target architecture in that 'xbps-install' command." |