From c19dbe21e4c2a4f4fb06ff414e38d83e442bbccd Mon Sep 17 00:00:00 2001 From: Kroese Date: Wed, 22 May 2024 20:38:10 +0200 Subject: [PATCH] feat: Automaticly enable UEFI based on ISO (#523) --- Dockerfile | 1 + readme.md | 34 +++++++++------------------------- src/boot.sh | 6 ------ src/install.sh | 43 +++++++++++++++++++++---------------------- src/network.sh | 6 +++--- src/proc.sh | 6 ++++++ 6 files changed, 40 insertions(+), 56 deletions(-) diff --git a/Dockerfile b/Dockerfile index 06d6e10..22983e4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -22,6 +22,7 @@ RUN set -eu && \ dnsmasq \ net-tools \ qemu-utils \ + genisoimage \ ca-certificates \ netcat-openbsd \ qemu-system-x86 && \ diff --git a/readme.md b/readme.md index df216d2..7a88663 100644 --- a/readme.md +++ b/readme.md @@ -99,42 +99,26 @@ kubectl apply -f kubernetes.yml Replace the example path `/home/user/example.iso` with the filename of the desired ISO file, the value of `BOOT` will be ignored in this case. -* ### How do I boot without SCSI support? - - By default, the machine makes use of `virtio-scsi` disks for performance reasons, and even though most Linux kernels include drivers for them, there are other operating systems that do not. - - If your ISO fails to boot because of this, you can add this to your compose file: - - ```yaml - environment: - DISK_TYPE: "blk" - ``` - - This will use `virtio-blk` devices instead. If it still fails to boot, you can set the value to `ide` to use IDE disks which every OS will support, at the cost of performance. - -* ### How do I boot with UEFI? - - To enable UEFI booting, add the following line to your compose file: - - ```yaml - environment: - BOOT_MODE: "uefi" - ``` - * ### How do I boot ARM images? You can use [qemu-arm](https://github.com/qemus/qemu-arm/) to run ARM64-based images. * ### How do I boot Windows? - To enable Windows booting, add the following line to your compose file: + Use [dockur/windows](https://github.com/dockur/windows) instead, as it includes all the drivers required during installation, amongst many other features. + +* ### How do I boot without SCSI drivers? + + By default, the machine makes use of `virtio-scsi` disks for performance reasons, and even though most Linux kernels include the necessary driver for this device, for some other operating systems that may not always be the case. + + If your ISO fails to boot because of this, you can modify your compose file to use `virtio-blk` instead: ```yaml environment: - BOOT_MODE: "windows" + DISK_TYPE: "blk" ``` - But you might want to give [dockur/windows](https://github.com/dockur/windows) a try instead, as it includes all the drivers required during installation amongst many other features. + If it still fails to boot, you can set the value to `ide` to emulate a IDE drive, which is slow but compatible with almost every system. * ### How do I verify if my system supports KVM? diff --git a/src/boot.sh b/src/boot.sh index 2f80810..b49ef79 100644 --- a/src/boot.sh +++ b/src/boot.sh @@ -16,12 +16,6 @@ if [[ "${BOOT_MODE,,}" == "windows"* ]]; then BOOT_OPTS="$BOOT_OPTS -global ICH9-LPC.disable_s3=1" BOOT_OPTS="$BOOT_OPTS -global ICH9-LPC.disable_s4=1" - if [ -e /sys/module/kvm/parameters/ignore_msrs ]; then - if [ "$(cat /sys/module/kvm/parameters/ignore_msrs)" == "N" ]; then - echo 1 | tee /sys/module/kvm/parameters/ignore_msrs > /dev/null 2>&1 || true - fi - fi - fi case "${BOOT_MODE,,}" in diff --git a/src/install.sh b/src/install.sh index 24e1221..c8ac3fb 100644 --- a/src/install.sh +++ b/src/install.sh @@ -1,41 +1,39 @@ #!/usr/bin/env bash set -Eeuo pipefail -file=$(find / -maxdepth 1 -type f -iname boot.iso | head -n 1) -[ ! -s "$file" ] && file=$(find "$STORAGE" -maxdepth 1 -type f -iname boot.iso | head -n 1) +detect () { + local dir="" + local file="$1" + [ ! -f "$file" ] && return 1 + [ ! -s "$file" ] && return 1 -if [ ! -s "$file" ] && [[ "${BOOT,,}" != "http"* ]]; then - base=$(basename "$BOOT") - file="$STORAGE/$base" -fi + dir=$(isoinfo -f -i "$file") + + # Automaticly detect UEFI-compatible ISO's + if echo "${dir^^}" | grep -q "^/EFI"; then + [ -z "${BOOT_MODE:-}" ] && BOOT_MODE="uefi" + fi -if [ -f "$file" ] && [ -s "$file" ]; then BOOT="$file" return 0 -fi +} -if [ -z "$BOOT" ]; then +file=$(find / -maxdepth 1 -type f -iname boot.iso | head -n 1) +[ ! -s "$file" ] && file=$(find "$STORAGE" -maxdepth 1 -type f -iname boot.iso | head -n 1) +detect "$file" && return 0 + +if [ -z "$BOOT" ] || [[ "$BOOT" == *"example.com/image.iso" ]]; then hasDisk && return 0 error "No boot disk specified, set BOOT= to the URL of an ISO file." && exit 64 fi base=$(basename "$BOOT") -file="$STORAGE/$base" - -if [ -f "$file" ] && [ -s "$file" ]; then - BOOT="$file" - return 0 -fi +detect "$STORAGE/$base" && return 0 base=$(basename "${BOOT%%\?*}") : "${base//+/ }"; printf -v base '%b' "${_//%/\\x}" base=$(echo "$base" | sed -e 's/[^A-Za-z0-9._-]/_/g') -file="$STORAGE/$base" - -if [ -f "$file" ] && [ -s "$file" ]; then - BOOT="$file" - return 0 -fi +detect "$STORAGE/$base" && return 0 TMP="$STORAGE/${base%.*}.tmp" rm -f "$TMP" @@ -67,6 +65,7 @@ if ((size<100000)); then error "Invalid ISO file: Size is smaller than 100 KB" && exit 62 fi -mv -f "$TMP" "$file" +mv -f "$TMP" "$STORAGE/$base" +! detect "$STORAGE/$base" && exit 63 return 0 diff --git a/src/network.sh b/src/network.sh index ceb688b..170ee13 100644 --- a/src/network.sh +++ b/src/network.sh @@ -328,8 +328,8 @@ if [[ "$DHCP" == [Yy1]* ]]; then ! checkOS && [[ "$DEBUG" != [Yy1]* ]] && exit 19 - if [[ "$GATEWAY" == "172."* ]]; then - warn "your gateway IP starts with 172.* which is often a sign that you are not on a macvlan network (required for DHCP)!" + if [[ "$IP" == "172."* ]]; then + warn "container IP starts with 172.* which is often a sign that you are not on a macvlan network (required for DHCP)!" fi # Configuration for DHCP IP @@ -337,7 +337,7 @@ if [[ "$DHCP" == [Yy1]* ]]; then else - if [[ "$GATEWAY" != "172."* ]] && [[ "$GATEWAY" != "10.8"* ]] && [[ "$GATEWAY" != "10.9"* ]]; then + if [[ "$IP" != "172."* ]] && [[ "$IP" != "10.8"* ]] && [[ "$IP" != "10.9"* ]]; then ! checkOS && [[ "$DEBUG" != [Yy1]* ]] && exit 19 fi diff --git a/src/proc.sh b/src/proc.sh index 7e14d57..22d5b10 100644 --- a/src/proc.sh +++ b/src/proc.sh @@ -60,6 +60,12 @@ if [[ "$KVM" != [Nn]* ]]; then CPU_FEATURES="$CPU_FEATURES,migratable=no" fi + if [ -e /sys/module/kvm/parameters/ignore_msrs ]; then + if [ "$(cat /sys/module/kvm/parameters/ignore_msrs)" == "N" ]; then + echo 1 | tee /sys/module/kvm/parameters/ignore_msrs > /dev/null 2>&1 || true + fi + fi + if [[ "$HV" != [Nn]* ]] && [[ "${BOOT_MODE,,}" == "windows"* ]]; then HV_FEATURES="+hypervisor,hv_passthrough"