Dual Booting NixOS and Windows: Difference between revisions

Add method to boot Windows if it is installed on a different drive than NixOS
Nicdumz (talk | contribs)
systemd-boot: more elegant way to dual-boot windows in uefi mode (at least as of 24.11)
Line 123: Line 123:
===== systemd-boot =====
===== systemd-boot =====
As systemd-boot cannot directly load binaries from other ESPs<ref>https://github.com/systemd/systemd/issues/3252</ref>, let alone other disks, we have to employ [https://search.nixos.org/packages?channel=unstable&show=edk2-uefi-shell&from=0&size=50&sort=relevance&type=packages&query=edk2-uefi-shell edk2-uefi-shell] to implement a chainloading strategy<ref>https://wiki.archlinux.org/title/Systemd-boot#Boot_from_another_disk</ref>. The basic config looks like this:{{File|/etc/nixos/configuration.nix|nix|<nowiki>
As systemd-boot cannot directly load binaries from other ESPs<ref>https://github.com/systemd/systemd/issues/3252</ref>, let alone other disks, we have to employ [https://search.nixos.org/packages?channel=unstable&show=edk2-uefi-shell&from=0&size=50&sort=relevance&type=packages&query=edk2-uefi-shell edk2-uefi-shell] to implement a chainloading strategy<ref>https://wiki.archlinux.org/title/Systemd-boot#Boot_from_another_disk</ref>. The basic config looks like this:{{File|/etc/nixos/configuration.nix|nix|<nowiki>
{ config, ... }:
{ ... }:


{
{
   boot.loader = {
   boot.loader = {
    systemd-boot.enable = true;
     efi.canTouchEfiVariables = true;
     efi.canTouchEfiVariables = true;


    # Copy EDK2 Shell to boot partition
     systemd-boot = {
     systemd-boot.extraFiles."efi/shell.efi" = "${pkgs.edk2-uefi-shell}/shell.efi";
      enable = true;
    systemd-boot.extraEntries = {
 
      # Chainload Windows bootloader via EDK2 Shell
      windows = {
      "windows.conf" =
        "windows" =
        let
          let
          # To determine the name of the windows boot drive, boot into edk2 first, then run
            # To determine the name of the windows boot drive, boot into edk2 first, then run
          # `map -c` to get drive aliases, and try out running `FS1:`, then `ls EFI` to check
            # `map -c` to get drive aliases, and try out running `FS1:`, then `ls EFI` to check
          # which alias corresponds to which EFI partition.
            # which alias corresponds to which EFI partition.
          boot-drive = "FS1";
            boot-drive = "FS1";
        in
          in
        ''
          {
          title Windows Bootloader
            title = "Windows";
          efi /efi/shell.efi
            efiDeviceHandle = boot-drive;
          options -nointerrupt -nomap -noversion ${boot-drive}:EFI\Microsoft\Boot\Bootmgfw.efi
            sortKey = "y_windows";
          sort-key y_windows
          };
        '';
       };
       # Make EDK2 Shell available as a boot option
 
       "edk2-uefi-shell.conf" = ''
       edk2-uefi-shell.enable = true;
        title EDK2 UEFI Shell
      edk2-uefi-shell.sortKey = "z_edk2";
        efi /efi/shell.efi
        sort-key z_edk2
      '';
     };
     };
   };
   };