#!/bin/bash # Build a minimal initramfs for UniversalisOS Linux guest. # Cross-compiles init.c for AArch64 and creates a cpio archive. set -e SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" OUTPUT_DIR="$SCRIPT_DIR/.." INITRAMFS_DIR="$SCRIPT_DIR/rootfs" # Cross-compiler CROSS=aarch64-linux-gnu CC=${CROSS}-gcc OBJCOPY=${CROSS}-objcopy STRIP=${CROSS}-strip echo "=== Building minimal initramfs ===" # Create rootfs directory structure rm -rf "$INITRAMFS_DIR" mkdir -p "$INITRAMFS_DIR"/{bin,dev,proc,sys,etc,sbin} # Compile init.c as static binary echo "Compiling init.c..." ${CC} -static -O2 -o "$INITRAMFS_DIR/init" "$SCRIPT_DIR/init.c" ${STRIP} "$INITRAMFS_DIR/init" echo "init binary: $(file "$INITRAMFS_DIR/init")" # Create a minimal /etc/init.d/rcS cat > "$INITRAMFS_DIR/etc/init.d/rcS" << 'EOF' #!/bin/sh echo "Running rcS..." mount -t proc proc /proc mount -t sysfs sysfs /sys mount -t tmpfs tmpfs /dev exec /init EOF chmod +x "$INITRAMFS_DIR/etc/init.d/rcS" # Create a minimal /etc/fstab cat > "$INITRAMFS_DIR/etc/fstab" << 'EOF' # proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /dev tmpfs defaults 0 0 EOF # Create cpio archive echo "Creating cpio archive..." cd "$INITRAMFS_DIR" find . -print0 | cpio --null -o --format=newc > "$OUTPUT_DIR/initramfs.cpio" cd "$SCRIPT_DIR" # Create gzip-compressed version echo "Compressing..." gzip -9 -f "$OUTPUT_DIR/initramfs.cpio" mv "$OUTPUT_DIR/initramfs.cpio.gz" "$OUTPUT_DIR/initramfs.img" echo "=== Initramfs built ===" echo "Output: $OUTPUT_DIR/initramfs.img" echo "Size: $(du -h "$OUTPUT_DIR/initramfs.img" | cut -f1)" ls -la "$OUTPUT_DIR/initramfs.img"