universalisos/guests/linux-aarch64/initramfs/build.sh
Fábio Coutada 5ab1b438b4 guests: add linux-aarch64 guest images and scripts
- initramfs.img, rootfs.img for AArch64 Linux guest
- mkdisk.py for disk image creation
- initramfs and rootfs directories
2026-07-15 15:32:04 +01:00

62 lines
1.7 KiB
Bash

#!/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'
# <filesystem> <mount point> <type> <options> <dump> <pass>
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"