#!/usr/bin/env bash EXTRA_KERNEL_CMDLINE="" SCRIPT=$(realpath ${BASH_SOURCE}) BUILD_ROOT=$(realpath $(dirname ${SCRIPT})/../build) SYSROOT=${BUILD_ROOT}/tmp-glibc/work/x86_64-linux/qemu-helper-native/1.0/recipe-sysroot-native QEMU=qemu-system-x86_64 ENABLE_KVM="--enable-kvm -cpu host" if [[ ! -c "/dev/kvm" ]]; then printf "Disabling KVM because /dev/kvm is not available\n" ENABLE_KVM="" fi EFI_BIOS="-bios /usr/share/qemu/OVMF.fd" if [[ -f "/usr/share/qemu/OVMF.fd" ]]; then printf "Using EFI boot because OVMF.fd found in /usr/share/qemu/\n" elif [[ -f "/usr/share/edk2-ovmf/x64/OVMF.fd" ]]; then # fedora and arch printf "Using EFI boot because OVMF.fd found in /usr/share/edk2-ovmf/x64/\n" EFI_BIOS="-bios /usr/share/edk2-ovmf/x64/OVMF.fd" else printf "Disabling EFI boot because OVMF.fd not found\n" fi usage() { cat <<-EOF USAGE: qemu-boot [options] installer Boot build/images/citadel-installer.img qemu-boot [options] kernel Boot build/images/bzImage OPTIONS --no-efi Do not use OVMF UEFI bios --memory size Set custom guest RAM size --debug Boot installer with console and journald dumped to terminal To exit kernel boot type 'ctrl-a x' (See escape sequences in qemu-system man page) EOF exit 0 } BOOT_TARGET="" MEMORY_ARG="-m 8G" DEBUG_MODE=0 while [[ $# -gt 0 ]]; do key=${1} case $key in --no-efi) EFI_BIOS="" shift ;; --debug) DEBUG_MODE=1 shift ;; --memory) MEMORY_ARG="-m ${2}" shift shift ;; kernel) BOOT_TARGET="kernel" shift ;; installer) BOOT_TARGET="installer" shift ;; boot-to-install) BOOT_TARGET="boot-to-install" shift ;; boot-installed) BOOT_TARGET="boot-installed" shift ;; --help) usage ;; *) printf "Unknown option ${key}\n" usage ;; esac done COMMON_INSTALLER_ARGS="\ ${ENABLE_KVM} \ ${MEMORY_ARG} \ ${EFI_BIOS} \ -device virtio-vga-gl \ -display sdl,gl=on \ -vga none \ -usb -device usb-tablet,id=input0 \ -nic user,model=virtio-net-pci \ -smp 2" boot_installer() { if [[ ${DEBUG_MODE} -eq 1 ]]; then ${QEMU} ${COMMON_INSTALLER_ARGS} \ -serial stdio \ -kernel ${BUILD_ROOT}/images/bzImage \ -drive format=raw,file=${BUILD_ROOT}/images/citadel-installer.img \ -append "console=ttyS0 earlyprintk=ttyS0 root=/dev/mapper/rootfs citadel.verbose citadel.install fstab=no luks=no systemd.journald.forward_to_console=1 ${EXTRA_KERNEL_CMDLINE}" else ${QEMU} ${COMMON_INSTALLER_ARGS} -drive format=raw,file=${BUILD_ROOT}/images/citadel-installer.img fi } # qemu-img create -f qcow2 qemu_disk/citadel_disk.qcow2 -o size=50G,preallocation=metadata # mount -t 9p -o trans=virtio,version=9p2000.L shared /mnt/my9p boot_to_install() { if [ ! -f qemu_disk/citadel_disk.qcow2 ]; then mkdir qemu_disk qemu-img create -f qcow2 qemu_disk/citadel_disk.qcow2 -o size=50G,preallocation=metadata fi CITADEL_QEMU_ARGS+=" ${COMMON_INSTALLER_ARGS} -drive format=raw,file=${BUILD_ROOT}/images/citadel-installer.img -drive format=qcow2,file=${BUILD_ROOT}/../qemu_disk/citadel_disk.qcow2" echo "${QEMU} ${CITADEL_QEMU_ARGS}" ${QEMU} ${CITADEL_QEMU_ARGS} } boot_installed() { if [ ! -f qemu_disk/citadel_disk.qcow2 ]; then printf "The qemu disk is not found on the drive. Please run boot-to-install\n" fi CITADEL_QEMU_ARGS+=" ${COMMON_INSTALLER_ARGS} -drive format=qcow2,file=${BUILD_ROOT}/../qemu_disk/citadel_disk.qcow2" echo "${QEMU} ${CITADEL_QEMU_ARGS}" ${QEMU} ${CITADEL_QEMU_ARGS} } boot_kernel() { EXTRA_OPTIONS="" KERNEL_IMAGE="bzImage" if [[ ${DEBUG_MODE} -eq 1 ]]; then EXTRA_OPTIONS="-s -S" KERNEL_IMAGE="bzImage-intel-corei7-64.bin" fi ${QEMU} \ ${ENABLE_KVM} \ ${MEMORY_ARG} \ ${EXTRA_OPTIONS} \ -nographic \ -no-reboot \ -smp 2 \ -append "rd.emergency console=ttyS0 earlyprintk=ttyS0 ${EXTRA_KERNEL_CMDLINE}" \ -kernel ${BUILD_ROOT}/images/${KERNEL_IMAGE} } if [[ ${BOOT_TARGET} = "kernel" ]]; then boot_kernel elif [[ ${BOOT_TARGET} = "installer" ]]; then boot_installer elif [[ ${BOOT_TARGET} = "boot-to-install" ]]; then boot_to_install elif [[ ${BOOT_TARGET} = "boot-installed" ]]; then boot_installed else usage fi