feat: Add helper functions to installation code (#1801)

This commit is contained in:
Kroese
2026-07-05 20:39:46 +02:00
committed by GitHub
parent e6b0e530ba
commit d443ca377d
+90 -98
View File
@@ -199,6 +199,67 @@ writeFile() {
return 0 return 0
} }
writeState() {
local name="$1"
local value="$2"
local file="$STORAGE/windows.$name"
[ -z "$value" ] && return 0
writeFile "$value" "$file"
return 0
}
readState() {
local file="$1"
local value
[ -s "$file" ] && [ -f "$file" ] || return 1
value=$(<"$file")
value="${value//[![:print:]]/}"
echo "$value"
return 0
}
restoreState() {
local var="$1"
local file="$2"
local force="${3:-N}"
local value
if ! enabled "$force"; then
[ -z "${!var:-}" ] || return 0
fi
value=$(readState "$file") || return 0
printf -v "$var" '%s' "$value"
return 0
}
checkFreeSpace() {
local dir="$1"
local size="$2"
local size_gb space space_gb
size_gb=$(formatBytes "$size")
space=$(df --output=avail -B 1 "$dir" | tail -n 1)
space_gb=$(formatBytes "$space")
if (( size > space )); then
error "Not enough free space in $STORAGE, have $space_gb available but need at least $size_gb."
return 1
fi
return 0
}
finishInstall() { finishInstall() {
local iso="$1" local iso="$1"
@@ -228,61 +289,51 @@ finishInstall() {
if [[ "$iso" == "$STORAGE/"* ]]; then if [[ "$iso" == "$STORAGE/"* ]]; then
if [[ "$aborted" != [Yy1]* ]] || [ -z "$CUSTOM" ]; then if [[ "$aborted" != [Yy1]* ]] || [ -z "$CUSTOM" ]; then
base=$(basename "$iso") base=$(basename "$iso")
file="$STORAGE/windows.base" writeState "base" "$base"
writeFile "$base" "$file"
fi fi
fi fi
if [[ "${PLATFORM,,}" == "x64" ]]; then if [[ "${PLATFORM,,}" == "x64" ]]; then
if [[ "${BOOT_MODE,,}" == "windows_legacy" ]]; then if [[ "${BOOT_MODE,,}" == "windows_legacy" ]]; then
file="$STORAGE/windows.mode" writeState "mode" "$BOOT_MODE"
writeFile "$BOOT_MODE" "$file"
if [[ "${MACHINE,,}" != "q35" ]]; then if [[ "${MACHINE,,}" != "q35" ]]; then
file="$STORAGE/windows.old" writeState "old" "$MACHINE"
writeFile "$MACHINE" "$file"
fi fi
else else
# Enable secure boot + TPM on manual installs as Win11 requires # Enable secure boot + TPM on manual installs as Win11 requires
if enabled "$MANUAL" || [[ "$aborted" == [Yy1]* ]]; then if enabled "$MANUAL" || [[ "$aborted" == [Yy1]* ]]; then
if [[ "${DETECTED,,}" == "win11"* ]]; then if [[ "${DETECTED,,}" == "win11"* ]]; then
BOOT_MODE="windows_secure" BOOT_MODE="windows_secure"
file="$STORAGE/windows.mode" writeState "mode" "$BOOT_MODE"
writeFile "$BOOT_MODE" "$file"
fi fi
fi fi
# Enable secure boot on multi-socket systems to workaround freeze # Enable secure boot on multi-socket systems to workaround freeze
if [ -n "$SOCKETS" ] && [[ "$SOCKETS" != "1" ]]; then if [ -n "$SOCKETS" ] && [[ "$SOCKETS" != "1" ]]; then
BOOT_MODE="windows_secure" BOOT_MODE="windows_secure"
file="$STORAGE/windows.mode" writeState "mode" "$BOOT_MODE"
writeFile "$BOOT_MODE" "$file"
fi fi
fi fi
fi fi
if [ -n "${ARGS:-}" ]; then if [ -n "${ARGS:-}" ]; then
ARGUMENTS="$ARGS ${ARGUMENTS:-}" ARGUMENTS="$ARGS ${ARGUMENTS:-}"
file="$STORAGE/windows.args" writeState "args" "$ARGS"
writeFile "$ARGS" "$file"
fi fi
if [ -n "${VGA:-}" ] && [[ "${VGA:-}" != "virtio"* ]]; then if [ -n "${VGA:-}" ] && [[ "${VGA:-}" != "virtio"* ]]; then
file="$STORAGE/windows.vga" writeState "vga" "$VGA"
writeFile "$VGA" "$file"
fi fi
if [ -n "${USB:-}" ] && [[ "${USB:-}" != "qemu-xhci"* ]]; then if [ -n "${USB:-}" ] && [[ "${USB:-}" != "qemu-xhci"* ]]; then
file="$STORAGE/windows.usb" writeState "usb" "$USB"
writeFile "$USB" "$file"
fi fi
if [ -n "${DISK_TYPE:-}" ] && [[ "${DISK_TYPE:-}" != "scsi" ]]; then if [ -n "${DISK_TYPE:-}" ] && [[ "${DISK_TYPE:-}" != "scsi" ]]; then
file="$STORAGE/windows.type" writeState "type" "$DISK_TYPE"
writeFile "$DISK_TYPE" "$file"
fi fi
if [ -n "${ADAPTER:-}" ] && [[ "${ADAPTER:-}" != "virtio-net-pci" ]]; then if [ -n "${ADAPTER:-}" ] && [[ "${ADAPTER:-}" != "virtio-net-pci" ]]; then
file="$STORAGE/windows.net" writeState "net" "$ADAPTER"
writeFile "$ADAPTER" "$file"
fi fi
rm -rf "$TMP" rm -rf "$TMP"
@@ -376,7 +427,7 @@ extractESD() {
local dir="$2" local dir="$2"
local version="$3" local version="$3"
local desc="$4" local desc="$4"
local size size_gb sizes space space_gb local size sizes
local retVal total total1 total2 total3 total4 local retVal total total1 total2 total3 total4
local imageIndex links links1 links2 links3 links4 local imageIndex links links1 links2 links3 links4
@@ -394,13 +445,7 @@ extractESD() {
fi fi
size=9606127360 size=9606127360
size_gb=$(formatBytes "$size") checkFreeSpace "$dir" "$size" || return 1
space=$(df --output=avail -B 1 "$dir" | tail -n 1)
space_gb=$(formatBytes "$space")
if (( size > space )); then
error "Not enough free space in $STORAGE, have $space_gb available but need at least $size_gb." && return 1
fi
local esdImageCount local esdImageCount
esdImageCount=$(wimlib-imagex info "$iso" | awk '/Image Count:/ {print $3}') esdImageCount=$(wimlib-imagex info "$iso" | awk '/Image Count:/ {print $3}')
@@ -510,7 +555,7 @@ extractImage() {
local dir="$2" local dir="$2"
local version="$3" local version="$3"
local desc="local ISO" local desc="local ISO"
local file size size_gb space space_gb local file size
if [ -z "$CUSTOM" ]; then if [ -z "$CUSTOM" ]; then
desc="downloaded ISO" desc="downloaded ISO"
@@ -534,17 +579,12 @@ extractImage() {
fi fi
size=$(stat -c%s "$iso") size=$(stat -c%s "$iso")
size_gb=$(formatBytes "$size")
space=$(df --output=avail -B 1 "$dir" | tail -n 1)
space_gb=$(formatBytes "$space")
if (( size < 100000000 )); then if (( size < 100000000 )); then
error "Invalid ISO file: Size is smaller than 100 MB" && return 1 error "Invalid ISO file: Size is smaller than 100 MB" && return 1
fi fi
if (( size > space )); then checkFreeSpace "$dir" "$size" || return 1
error "Not enough free space in $STORAGE, have $space_gb available but need at least $size_gb." && return 1
fi
rm -rf "$dir" rm -rf "$dir"
/run/progress.sh "$dir" "$size" "$msg ([P])..." & /run/progress.sh "$dir" "$size" "$msg ([P])..." &
@@ -996,22 +1036,12 @@ addDrivers() {
wimlib-imagex update "$file" "$index" --command "delete --force --recursive /$target" >/dev/null || true wimlib-imagex update "$file" "$index" --command "delete --force --recursive /$target" >/dev/null || true
addDriver "$version" "$drivers" "$target" "qxl" || return 1 local driver
addDriver "$version" "$drivers" "$target" "viofs" || return 1 local driver_list=( qxl viofs sriov smbus qxldod viorng viostor viomem NetKVM Balloon vioscsi pvpanic vioinput viogpudo vioserial qemupciserial )
addDriver "$version" "$drivers" "$target" "sriov" || return 1
addDriver "$version" "$drivers" "$target" "smbus" || return 1 for driver in "${driver_list[@]}"; do
addDriver "$version" "$drivers" "$target" "qxldod" || return 1 addDriver "$version" "$drivers" "$target" "$driver" || return 1
addDriver "$version" "$drivers" "$target" "viorng" || return 1 done
addDriver "$version" "$drivers" "$target" "viostor" || return 1
addDriver "$version" "$drivers" "$target" "viomem" || return 1
addDriver "$version" "$drivers" "$target" "NetKVM" || return 1
addDriver "$version" "$drivers" "$target" "Balloon" || return 1
addDriver "$version" "$drivers" "$target" "vioscsi" || return 1
addDriver "$version" "$drivers" "$target" "pvpanic" || return 1
addDriver "$version" "$drivers" "$target" "vioinput" || return 1
addDriver "$version" "$drivers" "$target" "viogpudo" || return 1
addDriver "$version" "$drivers" "$target" "vioserial" || return 1
addDriver "$version" "$drivers" "$target" "qemupciserial" || return 1
local dst="$src/\$OEM\$/\$\$/Drivers" local dst="$src/\$OEM\$/\$\$/Drivers"
mkdir -p "$dst" || return 1 mkdir -p "$dst" || return 1
@@ -1157,7 +1187,7 @@ buildImage() {
local failed="" local failed=""
local cat="BOOT.CAT" local cat="BOOT.CAT"
local log="/run/shm/iso.log" local log="/run/shm/iso.log"
local base size size_gb space space_gb desc local base size desc
if [ -f "$BOOT" ]; then if [ -f "$BOOT" ]; then
error "File $BOOT does already exist?!" && return 1 error "File $BOOT does already exist?!" && return 1
@@ -1179,13 +1209,7 @@ buildImage() {
fi fi
size=$(du -b --max-depth=0 "$dir" | cut -f1) size=$(du -b --max-depth=0 "$dir" | cut -f1)
size_gb=$(formatBytes "$size") checkFreeSpace "$TMP" "$size" || return 1
space=$(df --output=avail -B 1 "$TMP" | tail -n 1)
space_gb=$(formatBytes "$space")
if (( size > space )); then
error "Not enough free space in $STORAGE, have $space_gb available but need at least $size_gb." && return 1
fi
/run/progress.sh "$out" "$size" "$msg ([P])..." & /run/progress.sh "$out" "$size" "$msg ([P])..." &
@@ -1230,50 +1254,18 @@ buildImage() {
bootWindows() { bootWindows() {
if [ -f "$STORAGE/windows.args" ]; then if ARGS=$(readState "$STORAGE/windows.args"); then
ARGS=$(<"$STORAGE/windows.args")
ARGS="${ARGS//[![:print:]]/}"
ARGUMENTS="$ARGS ${ARGUMENTS:-}" ARGUMENTS="$ARGS ${ARGUMENTS:-}"
fi fi
if [ -s "$STORAGE/windows.vga" ] && [ -f "$STORAGE/windows.vga" ]; then restoreState "VGA" "$STORAGE/windows.vga"
if [ -z "${VGA:-}" ]; then restoreState "USB" "$STORAGE/windows.usb"
VGA=$(<"$STORAGE/windows.vga") restoreState "ADAPTER" "$STORAGE/windows.net"
VGA="${VGA//[![:print:]]/}" restoreState "DISK_TYPE" "$STORAGE/windows.type"
fi restoreState "BOOT_MODE" "$STORAGE/windows.mode" "Y"
fi
if [ -s "$STORAGE/windows.usb" ] && [ -f "$STORAGE/windows.usb" ]; then
if [ -z "${USB:-}" ]; then
USB=$(<"$STORAGE/windows.usb")
USB="${USB//[![:print:]]/}"
fi
fi
if [ -s "$STORAGE/windows.net" ] && [ -f "$STORAGE/windows.net" ]; then
if [ -z "${ADAPTER:-}" ]; then
ADAPTER=$(<"$STORAGE/windows.net")
ADAPTER="${ADAPTER//[![:print:]]/}"
fi
fi
if [ -s "$STORAGE/windows.type" ] && [ -f "$STORAGE/windows.type" ]; then
if [ -z "${DISK_TYPE:-}" ]; then
DISK_TYPE=$(<"$STORAGE/windows.type")
DISK_TYPE="${DISK_TYPE//[![:print:]]/}"
fi
fi
if [ -s "$STORAGE/windows.mode" ] && [ -f "$STORAGE/windows.mode" ]; then
BOOT_MODE=$(<"$STORAGE/windows.mode")
BOOT_MODE="${BOOT_MODE//[![:print:]]/}"
fi
if [ -s "$STORAGE/windows.old" ] && [ -f "$STORAGE/windows.old" ]; then
if [[ "${PLATFORM,,}" == "x64" ]]; then if [[ "${PLATFORM,,}" == "x64" ]]; then
MACHINE=$(<"$STORAGE/windows.old") restoreState "MACHINE" "$STORAGE/windows.old" "Y"
MACHINE="${MACHINE//[![:print:]]/}"
fi
fi fi
return 0 return 0