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-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
+34 -11
View File
@@ -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
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" {} ::{} \;