diff --git a/nixos/modules/virtualisation/xen-boot-builder.sh b/nixos/modules/virtualisation/xen-boot-builder.sh index 3fe689297864..95e363850359 100755 --- a/nixos/modules/virtualisation/xen-boot-builder.sh +++ b/nixos/modules/virtualisation/xen-boot-builder.sh @@ -45,28 +45,9 @@ for gen in "${gens[@]}"; do bootspecFile="$(sed -nr 's/^options init=(.*)\/init.*$/\1/p' "$gen")/boot.json" [ "$1" = "debug" ] && echo -e "\e[1;34mxenBootBuilder:\e[0m processing bootspec file $bootspecFile" - # We do nothing if the Bootspec for the current $gen does not contain the Xen - # extension, which is added as a configuration attribute below. - # We determine this by checking for the v1 or v2 bootspec extension, - # and setting the appropriate attributes based on version - xenSpecVer="" - xenParamVar="" - xenEfiPath="" - if grep -sq '"org.xenproject.bootspec.v1"' "$bootspecFile"; then - xenSpecVer="v1" - xenParamVar="xenParams" - xenEfiPath="xen" - fi - # We prefer the v2 extension, so if both are present somehow, - # we will use the v2 attributes + # Check for a valid Xen v2 spec being detected if grep -sq '"org.xenproject.bootspec.v2"' "$bootspecFile"; then - xenSpecVer="v2" - xenParamVar="params" - xenEfiPath="efiPath" - fi - # Check for a valid Xen spec being detected - if [ -n "$xenSpecVer" ]; then - [ "$1" = "debug" ] && echo -e " \e[1;32msuccess:\e[0m found $xenSpecVer Xen entries in $gen." + [ "$1" = "debug" ] && echo -e " \e[1;32msuccess:\e[0m found v2 Xen entries in $gen." # TODO: Support DeviceTree booting. Xen has some special handling for DeviceTree # attributes, which will need to be translated in a boot script similar to this @@ -82,7 +63,7 @@ for gen in "${gens[@]}"; do # the corresponding nixos generation, substituting `nixos` with `xen`: # `xen-$profile-generation-$number-specialisation-$specialisation.{cfg,conf}` xenGen=$(echo "$gen" | sed 's_/loader/entries/nixos_/loader/entries/xen_g;s_^.*/xen_xen_g;s_.conf$__g') - bootParams=$(jq -re ".\"org.xenproject.bootspec.$xenSpecVer\".$xenParamVar | join(\" \")" "$bootspecFile") + bootParams=$(jq -re ".\"org.xenproject.bootspec.v2\".params | join(\" \")" "$bootspecFile") kernel=$(jq -re '."org.nixos.bootspec.v1".kernel | sub("^/nix/store/"; "") | sub("/bzImage"; "-bzImage.efi")' "$bootspecFile") kernelParams=$(jq -re '."org.nixos.bootspec.v1".kernelParams | join(" ")' "$bootspecFile") initrd=$(jq -re '."org.nixos.bootspec.v1".initrd | sub("^/nix/store/"; "") | sub("/initrd"; "-initrd.efi")' "$bootspecFile") @@ -109,7 +90,7 @@ EOF # Create Xen UKI for $generation. Most of this is lifted from # https://xenbits.xenproject.org/docs/unstable/misc/efi.html. [ "$1" = "debug" ] && echo -e "\e[1;34mxenBootBuilder:\e[0m making Xen UKI..." - xenEfi=$(jq -re ".\"org.xenproject.bootspec.$xenSpecVer\".$xenEfiPath" "$bootspecFile") + xenEfi=$(jq -re ".\"org.xenproject.bootspec.v2\".efiPath" "$bootspecFile") finalSection=$(objdump --header --wide "$xenEfi" | tail -n +6 | sort --key="4,4" | tail -n 1 | grep -Eo '\.[a-z]*') padding=$(objdump --header --section="$finalSection" "$xenEfi" | awk -v section="$finalSection" '$0 ~ section { printf("0x%016x\n", and(strtonum("0x"$3) + strtonum("0x"$4) + 0xfff, compl(0xfff)))};') [ "$1" = "debug" ] && echo " - padding: $padding" @@ -132,13 +113,16 @@ sort-key $sortKey EOF [ "$1" = "debug" ] && echo -e "done." - # Sometimes, garbage collection weirdness causes a generation to still exist in - # the loader entries, but its Bootspec file was deleted. We consider such a - # generation to be invalid, but we don't write extra code to handle this - # situation, as supressing grep's error messages above is quite enough, and the - # error message below is still technically correct, as no Xen can be found in - # something that does not exist. + # Since NixOS 26.05, org.xenproject.bootspec.v1 is unsupported. + elif grep -sq '"org.xenproject.bootspec.v1"' "$bootspecFile"; then + [ "$1" = "debug" ] && echo -e "\n\e[1;33mwarning:\e[0m $gen has a \e[1;34morg.xenproject.bootspec.v1\e[0m Bootspec entry. This boot builder only supports v2 entries, so this generation will be ignored, and will \e[1;31mfail to boot\e[0m." else + # Sometimes, garbage collection weirdness causes a generation to still exist in + # the loader entries, but its Bootspec file was deleted. We consider such a + # generation to be invalid, but we don't write extra code to handle this + # situation, as supressing grep's error messages above is quite enough, and the + # error message below is still technically correct, as no Xen can be found in + # something that does not exist. [ "$1" = "debug" ] && echo -e " \e[1;33mwarning:\e[0m \e[1;31mno Xen found\e[0m in $gen." fi done @@ -153,7 +137,7 @@ mapfile -t postGenerations < <(find "$efiMountPoint"/loader/entries -type f -nam if ((${#postGenerations[@]} == 0)); then case "$1" in "default" | "info") echo "none found." && echo -e "If you believe this is an error, set the \e[1;34mvirtualisation.xen.boot.builderVerbosity\e[0m option to \e[1;34m\"debug\"\e[0m and rebuild to print debug logs." ;; - "debug") echo -e "\e[1;34mxenBootBuilder:\e[0m wrote \e[1;31mno generations\e[0m. Most likely, there were no generations with a valid \e[1;34morg.xenproject.bootspec.v1\e[0m or \e[1;34morg.xenproject.bootspec.v2\e[0m entry." ;; + "debug") echo -e "\e[1;34mxenBootBuilder:\e[0m wrote \e[1;31mno generations\e[0m. Most likely, there were no generations with a valid \e[1;34morg.xenproject.bootspec.v2\e[0m entry." ;; esac # If the script is successful, change the default boot, say "done.", write a diff --git a/nixos/modules/virtualisation/xen-dom0.nix b/nixos/modules/virtualisation/xen-dom0.nix index 92e40f77b82a..11fd5d705760 100644 --- a/nixos/modules/virtualisation/xen-dom0.nix +++ b/nixos/modules/virtualisation/xen-dom0.nix @@ -741,22 +741,14 @@ in # Xen Bootspec extension. This extension allows NixOS bootloaders to # fetch the dom0 kernel paths and access the `cfg.boot.params` option. - bootspec.extensions = { - # Bootspec extension v1 is deprecated, and will be removed in 26.05 - # It is present for backwards compatibility - "org.xenproject.bootspec.v1" = { - xen = cfg.boot.efi.path; - xenParams = cfg.boot.params; - }; - # Bootspec extension v2 includes more detail, - # including supporting multiboot, and is the current supported - # bootspec extension - "org.xenproject.bootspec.v2" = { - efiPath = cfg.boot.efi.path; - multibootPath = cfg.boot.bios.path; - version = cfg.package.version; - params = cfg.boot.params; - }; + # Bootspec extension v2 includes more detail, + # including supporting multiboot, and is the current supported + # bootspec extension + bootspec.extensions."org.xenproject.bootspec.v2" = { + efiPath = cfg.boot.efi.path; + multibootPath = cfg.boot.bios.path; + version = cfg.package.version; + params = cfg.boot.params; }; # See the `xenBootBuilder` script in the main `let...in` statement of this file.