From a0a902e968ab8dcd6c6c8cc87f5c31fb27be7c12 Mon Sep 17 00:00:00 2001 From: techflashYT Date: Fri, 6 Sep 2024 21:44:37 -0700 Subject: [PATCH] scripts,Makefile: add creation of bootable disk images Add support for creating bootable media for use with USB or HDD boot. Also add support for running the generated media in QEMU. --- .gitignore | 2 ++ Makefile | 45 ++++++++++++++++++++++++++++++++++----------- genbootimg.sh | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 11 deletions(-) create mode 100755 genbootimg.sh diff --git a/.gitignore b/.gitignore index d01eea1d..f8f25d0d 100644 --- a/.gitignore +++ b/.gitignore @@ -3,10 +3,12 @@ builds host-builds host-pkgs iso +img jinx pkgs sources astral.iso +astral-bootable.img kernel-src/include/limine.h kernel-src/include/printf.h kernel-src/include/build.h diff --git a/Makefile b/Makefile index 5cac50f3..1a23f3d2 100644 --- a/Makefile +++ b/Makefile @@ -1,16 +1,20 @@ ISODIR=$(shell pwd)/iso +IMGDIR=$(shell pwd)/img ISO=astral.iso +IMG=astral-bootable.img DISKNAME=hdd.img LIMINEDIR=$(shell pwd)/host-pkgs/limine/usr/local/share/limine/ KERNEL=$(shell pwd)/builds/astral/astral -QEMUFLAGS=-M q35 -cdrom $(ISO) -m 4g -smp cpus=1 -no-shutdown -no-reboot -monitor stdio -debugcon file:/dev/stdout -serial file:/dev/stdout -netdev user,id=net0 -device virtio-net,netdev=net0 -object filter-dump,id=f1,netdev=net0,file=netdump.dat +QEMUFLAGS=-M q35 -m 4g -smp cpus=1 -no-shutdown -no-reboot -monitor stdio -debugcon file:/dev/stdout -serial file:/dev/stdout -netdev user,id=net0 -device virtio-net,netdev=net0 -object filter-dump,id=f1,netdev=net0,file=netdump.dat +QEMUISOFLAGS=-cdrom $(ISO) QEMUDISKFLAGS=-drive file=$(DISKNAME),if=none,id=nvme -device nvme,serial=deadc0ff,drive=nvme -boot order=dc +QEMUIMGFLAGS=-drive file=$(IMG),if=none,id=usb -device nec-usb-xhci,id=xhci -device usb-storage,bus=xhci.0,drive=usb,removable=on INITRD=$(shell pwd)/initrds/initrd DISTROTYPE=full MINIMALPACKAGES=mlibc bash coreutils init distro-files vim nano mount netd shadow sudo neofetch -.PHONY: all kernel clean clean-kernel iso initrd full minimal disk +.PHONY: all kernel clean clean-kernel iso img initrd full minimal disk all: jinx git submodule update --init --recursive @@ -19,9 +23,11 @@ all: jinx make build-$(DISTROTYPE) make $(ISO) @echo - @echo "|------------------------------------------------------------------------------------------|" - @echo "|To regenerate the initrd, run 'make initrd iso'. To generate a disk image, run 'make disk'|" - @echo "|------------------------------------------------------------------------------------------|" + @echo "|--------------------------------------------------------------|" + @echo "| To regenerate the initrd, run 'make initrd iso'. |" + @echo "| To generate a bootable USB/HDD image, run 'make initrd img'. |" + @echo "| To generate a disk image, run 'make disk'. |" + @echo "|--------------------------------------------------------------|" @echo jinx: @@ -29,6 +35,7 @@ jinx: chmod +x jinx iso: $(ISO) +img: $(IMG) $(ISO): limine.conf liminebg.bmp $(KERNEL) $(INITRD)-$(DISTROTYPE) mkdir -p $(ISODIR) @@ -36,6 +43,13 @@ $(ISO): limine.conf liminebg.bmp $(KERNEL) $(INITRD)-$(DISTROTYPE) cp $(KERNEL) liminebg.bmp limine.conf $(LIMINEDIR)/limine-bios.sys $(LIMINEDIR)/limine-bios-cd.bin $(LIMINEDIR)/limine-uefi-cd.bin $(ISODIR) xorriso -as mkisofs -b limine-bios-cd.bin -no-emul-boot -boot-load-size 4 -boot-info-table --efi-boot limine-uefi-cd.bin -efi-boot-part --efi-boot-image --protective-msdos-label $(ISODIR) -o $(ISO) +$(IMG): limine.conf liminebg.bmp $(KERNEL) $(INITRD)-$(DISTROTYPE) + mkdir -p $(IMGDIR)/EFI/BOOT + ln -f $(INITRD)-$(DISTROTYPE) $(IMGDIR)/initrd + cp $(KERNEL) liminebg.bmp limine.conf $(LIMINEDIR)/limine-bios.sys $(IMGDIR) + cp $(LIMINEDIR)/BOOT{IA32,X64}.EFI $(IMGDIR)/EFI/BOOT + ./genbootimg.sh 1G $(IMG) $(IMGDIR) + # ------ build targets ------ build-full: @@ -95,19 +109,28 @@ clean: # ------ run targets ------ run: - qemu-system-x86_64 $(QEMUFLAGS) + qemu-system-x86_64 $(QEMUFLAGS) $(QEMUISOFLAGS) run-gdb: - qemu-system-x86_64 $(QEMUFLAGS) -S -s + qemu-system-x86_64 $(QEMUFLAGS) $(QEMUISOFLAGS) -S -s run-kvm: - qemu-system-x86_64 $(QEMUFLAGS) -enable-kvm -cpu host + qemu-system-x86_64 $(QEMUFLAGS) $(QEMUISOFLAGS) -enable-kvm -cpu host run-disk: - qemu-system-x86_64 $(QEMUFLAGS) $(QEMUDISKFLAGS) + qemu-system-x86_64 $(QEMUFLAGS) $(QEMUISOFLAGS) $(QEMUDISKFLAGS) run-disk-gdb: - qemu-system-x86_64 $(QEMUFLAGS) $(QEMUDISKFLAGS) -S -s + qemu-system-x86_64 $(QEMUFLAGS) $(QEMUISOFLAGS) $(QEMUDISKFLAGS) -S -s run-disk-kvm: - qemu-system-x86_64 $(QEMUFLAGS) $(QEMUDISKFLAGS) -enable-kvm -cpu host + qemu-system-x86_64 $(QEMUFLAGS) $(QEMUISOFLAGS) $(QEMUDISKFLAGS) -enable-kvm -cpu host + +run-img: + qemu-system-x86_64 $(QEMUFLAGS) $(QEMUIMGFLAGS) + +run-img-gdb: + qemu-system-x86_64 $(QEMUFLAGS) $(QEMUIMGFLAGS) -S -s + +run-img-kvm: + qemu-system-x86_64 $(QEMUFLAGS) $(QEMUIMGFLAGS) -enable-kvm -cpu host diff --git a/genbootimg.sh b/genbootimg.sh new file mode 100755 index 00000000..ccff0c10 --- /dev/null +++ b/genbootimg.sh @@ -0,0 +1,44 @@ +#!/usr/bin/bash + +if [ $# != 3 ] +then + echo "usage: $0 size diskname" + exit 1 +fi + +if [ -z $1 ] +then + echo "please pass a non empty size" + exit 1 +fi + +if [ -z $2 ] +then + echo "please pass a non empty disk name" + exit 1 +fi + +if [ -z $3 ] +then + echo "please pass a non empty imgdir" + exit 1 +fi + + +# most of the below shamelessly stolen from +# https://github.com/limine-bootloader/limine-c-template/blob/trunk/GNUmakefile +# at commit 7310a9b098731cbd4242ed82f5c9b9c60ae14919 + +rm -f "$2" +truncate -s "$1" "$2" +sgdisk "$2" -n 1:2048 -t 1:ef00 +host-pkgs/limine/usr/local/bin/limine bios-install "$2" +mformat -i "$2@@1M" +mmd -i "$2@@1M" ::/EFI ::/EFI/BOOT ::/boot ::/boot/limine + +img="$PWD/$2" + +cd "$3" +#find . -type d -exec mmd -i "$img@@1M" ::{} \; +# FIXME ^^^ breaks, but there's no dirs yet, so it doesn't matter :P +find . -type f -exec mcopy -i "$img@@1M" {} ::{} \;