From 0ace22d6f88692883584119c64ff010f4cee6738 Mon Sep 17 00:00:00 2001 From: salmonik Date: Fri, 31 Jul 2026 03:22:20 +0200 Subject: fix(rsdos): organizational changes --- scripts/build-image.sh | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100755 scripts/build-image.sh (limited to 'scripts/build-image.sh') diff --git a/scripts/build-image.sh b/scripts/build-image.sh new file mode 100755 index 0000000..02672ad --- /dev/null +++ b/scripts/build-image.sh @@ -0,0 +1,99 @@ +#!/usr/bin/env bash +# +# scripts/build-image.sh — assemble a bootable rs-dos disk image (UEFI/GPT) +# +# Layout: +# Partition 1: ESP (FAT32) — rsboot bootloader + kernel +# +# Output: +# rs-dos.img (or custom path) — bootable raw disk image for UEFI +# +# Usage: +# ./scripts/build-image.sh [output.img] +# +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +PROJECT_DIR="$(dirname "$SCRIPT_DIR")" + +cd "$PROJECT_DIR" + +BUILD_DIR="$PROJECT_DIR/build" +ESP_DIR="$PROJECT_DIR/esp" + +IMAGE="${1:-$PROJECT_DIR/rs-dos.img}" +TARGET=x86_64-unknown-uefi +PROFILE=debug +OUT_DIR="target/${TARGET}/${PROFILE}" + +BOOTLOADER="$BUILD_DIR/bootloader/BOOTX64.EFI" +KERNEL="$OUT_DIR/rsdos.efi" +BZIMAGE="$ESP_DIR/bzImage" +INITRD="$ESP_DIR/initramfs.cpio.gz" +BOOT_EFI="$ESP_DIR/EFI/BOOT/BOOTX64.EFI" + +ESP_START=2048 # 1 MiB offset (standard alignment) +ESP_SIZE_MB=64 + +IMAGE_SIZE_MB=$((ESP_SIZE_MB + 2)) # ESP + GPT gap + backup + +# ---- checks ---- +for cmd in sfdisk mkfs.vfat mcopy truncate dd; do + if ! command -v "$cmd" &>/dev/null; then + echo "Error: $cmd not found" + exit 1 + fi +done + +# ---- build kernel ---- +echo "[1/4] Building kernel..." +cargo build --package rsdos --target x86_64-unknown-uefi ${CARGO_FLAGS:-} + +# ---- build bootloader ---- +echo "[2/4] Building bootloader..." +if [ ! -f "$BOOTLOADER" ]; then + "$SCRIPT_DIR/build-bootloader.sh" +fi + +# ---- assemble ESP ---- +echo "[3/4] Assembling ESP..." +mkdir -p "$ESP_DIR/EFI/BOOT" +cp "$KERNEL" "$BZIMAGE" +cp "$BOOTLOADER" "$BOOT_EFI" +if [ ! -f "$INITRD" ]; then + printf '' | gzip >"$INITRD" +fi + +# ---- create disk image ---- +echo "[4/4] Writing disk image..." +rm -f "$IMAGE" +truncate -s "${IMAGE_SIZE_MB}M" "$IMAGE" + +# GPT partition table: single EFI System partition +sfdisk --quiet "$IMAGE" </dev/null 2>&1 + +# Copy files into FAT +mmd -i "$ESP_IMG" ::/EFI 2>/dev/null || true +mmd -i "$ESP_IMG" ::/EFI/BOOT 2>/dev/null || true +mcopy -i "$ESP_IMG" "$BOOT_EFI" ::/EFI/BOOT/BOOTX64.EFI +mcopy -i "$ESP_IMG" "$BZIMAGE" ::/bzImage 2>/dev/null || true +mcopy -i "$ESP_IMG" "$INITRD" ::/initramfs.cpio.gz 2>/dev/null || true + +# Inject FAT into image at partition offset +dd if="$ESP_IMG" of="$IMAGE" bs=512 seek="$ESP_START" conv=notrunc 2>/dev/null +rm -f "$ESP_IMG" + +echo "" +echo "=== Done: $IMAGE ===" +ls -lh "$IMAGE" +echo "" +echo "Boot with: ./scripts/boot-image.sh" +echo "USB: sudo dd if=$IMAGE of=/dev/sdX bs=4M status=progress" -- cgit v1.2.3