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.
This commit is contained in:
techflashYT
2024-09-06 21:44:37 -07:00
parent d418579a94
commit a0a902e968
3 changed files with 80 additions and 11 deletions
+2
View File
@@ -3,10 +3,12 @@ builds
host-builds host-builds
host-pkgs host-pkgs
iso iso
img
jinx jinx
pkgs pkgs
sources sources
astral.iso astral.iso
astral-bootable.img
kernel-src/include/limine.h kernel-src/include/limine.h
kernel-src/include/printf.h kernel-src/include/printf.h
kernel-src/include/build.h kernel-src/include/build.h
+34 -11
View File
@@ -1,16 +1,20 @@
ISODIR=$(shell pwd)/iso ISODIR=$(shell pwd)/iso
IMGDIR=$(shell pwd)/img
ISO=astral.iso ISO=astral.iso
IMG=astral-bootable.img
DISKNAME=hdd.img DISKNAME=hdd.img
LIMINEDIR=$(shell pwd)/host-pkgs/limine/usr/local/share/limine/ LIMINEDIR=$(shell pwd)/host-pkgs/limine/usr/local/share/limine/
KERNEL=$(shell pwd)/builds/astral/astral 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 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 INITRD=$(shell pwd)/initrds/initrd
DISTROTYPE=full DISTROTYPE=full
MINIMALPACKAGES=mlibc bash coreutils init distro-files vim nano mount netd shadow sudo neofetch 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 all: jinx
git submodule update --init --recursive git submodule update --init --recursive
@@ -19,9 +23,11 @@ all: jinx
make build-$(DISTROTYPE) make build-$(DISTROTYPE)
make $(ISO) make $(ISO)
@echo @echo
@echo "|------------------------------------------------------------------------------------------|" @echo "|--------------------------------------------------------------|"
@echo "|To regenerate the initrd, run 'make initrd iso'. To generate a disk image, run 'make disk'|" @echo "| To regenerate the initrd, run 'make initrd iso'. |"
@echo "|------------------------------------------------------------------------------------------|" @echo "| To generate a bootable USB/HDD image, run 'make initrd img'. |"
@echo "| To generate a disk image, run 'make disk'. |"
@echo "|--------------------------------------------------------------|"
@echo @echo
jinx: jinx:
@@ -29,6 +35,7 @@ jinx:
chmod +x jinx chmod +x jinx
iso: $(ISO) iso: $(ISO)
img: $(IMG)
$(ISO): limine.conf liminebg.bmp $(KERNEL) $(INITRD)-$(DISTROTYPE) $(ISO): limine.conf liminebg.bmp $(KERNEL) $(INITRD)-$(DISTROTYPE)
mkdir -p $(ISODIR) 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) 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) 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 targets ------
build-full: build-full:
@@ -95,19 +109,28 @@ clean:
# ------ run targets ------ # ------ run targets ------
run: run:
qemu-system-x86_64 $(QEMUFLAGS) qemu-system-x86_64 $(QEMUFLAGS) $(QEMUISOFLAGS)
run-gdb: run-gdb:
qemu-system-x86_64 $(QEMUFLAGS) -S -s qemu-system-x86_64 $(QEMUFLAGS) $(QEMUISOFLAGS) -S -s
run-kvm: run-kvm:
qemu-system-x86_64 $(QEMUFLAGS) -enable-kvm -cpu host qemu-system-x86_64 $(QEMUFLAGS) $(QEMUISOFLAGS) -enable-kvm -cpu host
run-disk: run-disk:
qemu-system-x86_64 $(QEMUFLAGS) $(QEMUDISKFLAGS) qemu-system-x86_64 $(QEMUFLAGS) $(QEMUISOFLAGS) $(QEMUDISKFLAGS)
run-disk-gdb: run-disk-gdb:
qemu-system-x86_64 $(QEMUFLAGS) $(QEMUDISKFLAGS) -S -s qemu-system-x86_64 $(QEMUFLAGS) $(QEMUISOFLAGS) $(QEMUDISKFLAGS) -S -s
run-disk-kvm: 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
Executable
+44
View File
@@ -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" {} ::{} \;