mirror of
https://github.com/dockur/windows.git
synced 2026-07-07 05:07:26 +01:00
feat: Add helper functions to installation code (#1801)
This commit is contained in:
+90
-98
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user