Dual Booting NixOS and Windows: Difference between revisions

From NixOS Wiki
→‎Autodetection with os-prober: add note about systemd-boot
Sdht0 (talk | contribs)
Add proper sections
Line 1: Line 1:
= Bootloader =
This section explains various methods to have the bootloader prompt whether to boot windows or NixOS.


This section explains various methods to have the bootloader prompt whether to boot windows or NixOS.
== Autodetection ==


== Autodetection with systemd-boot ==
=== systemd-boot ===


If <code>\EFI\Microsoft\Boot\bootmgfw.efi</code> is detected on the EFI System Partition (ESP), it will be loaded by systemd-boot automatically.
If <code>\EFI\Microsoft\Boot\bootmgfw.efi</code> is detected on the EFI System Partition (ESP), it will be loaded by systemd-boot automatically.
Therefore, on EFI systems, it may be simplest to resize the existing ESP to at least 500 megabytes, and share that ESP for NixOS.
Therefore, on EFI systems, it may be simplest to resize the existing ESP to at least 500 megabytes, and share that ESP for NixOS.


== Autodetection with os-prober ==
=== os-prober ===


<code>os-prober</code> is a tool to autodetect which other systems are present on the machine. Grub can be
<code>os-prober</code> is a tool to autodetect which other systems are present on the machine. Grub can be
Line 23: Line 23:
}</nowiki>}}
}</nowiki>}}


== Manual bootloader configuration ==
== Manual configuration ==
In case <code>os-prober</code> does not detect your windows partition you can configure your bootloader manually to find it.
In case <code>os-prober</code> does not detect your windows partition you can configure your bootloader manually to find it.


Line 30: Line 30:
All MBR bootloaders will need at least some configuration to chainload Windows.
All MBR bootloaders will need at least some configuration to chainload Windows.


==== Grub ====
==== Grub ====


Here is an example config:
Here is an example config:
Line 47: Line 47:
Source: https://www.reddit.com/r/NixOS/comments/31lx3i/windows_and_nixos_dual_boot/
Source: https://www.reddit.com/r/NixOS/comments/31lx3i/windows_and_nixos_dual_boot/


=== EFI ===
=== UEFI ===


After setting up a 256mb EFI Partition dualboot should work out of the box (at least for windows10)
After setting up a 256mb EFI Partition dualboot should work out of the box (at least for windows10)
Line 119: Line 119:
}</nowiki>}}
}</nowiki>}}


= System time =
== System time ==


System clock might be incorrect after booting Windows and going back to the NixOS. It can be fixed by either setting RTC time standard to UTC on Windows, or setting it to localtime on NixOS.
System clock might be incorrect after booting Windows and going back to the NixOS. It can be fixed by either setting RTC time standard to UTC on Windows, or setting it to localtime on NixOS.
Line 132: Line 132:
}</nowiki>}}
}</nowiki>}}


Sources:
See [https://wiki.archlinux.org/title/System_time#Time_standard Arch Linux wiki#System time].
* [https://wiki.archlinux.org/title/System_time#Time_standard Arch Wiki  - System time - Time standard]
 
* [https://wiki.archlinux.org/index.php/GRUB#Windows_installed_in_UEFI-GPT_Mode_menu_entry Arch Wiki GRUB article]
== See also ==
* [https://wiki.archlinux.org/index.php/GRUB#Windows_installed_in_UEFI-GPT_Mode_menu_entry Arch Linux wiki#GRUB]
* [https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/system/boot/loader/grub/install-grub.pl NixOS GRUB installer] (check the code block beginning with <nowiki># install EFI GRUB</nowiki>)
* [https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/system/boot/loader/grub/install-grub.pl NixOS GRUB installer] (check the code block beginning with <nowiki># install EFI GRUB</nowiki>)


[[Category:Cookbook]]
[[Category:Cookbook]][[Category:NixOS]]

Revision as of 05:11, 8 April 2024

This section explains various methods to have the bootloader prompt whether to boot windows or NixOS.

Autodetection

systemd-boot

If \EFI\Microsoft\Boot\bootmgfw.efi is detected on the EFI System Partition (ESP), it will be loaded by systemd-boot automatically. Therefore, on EFI systems, it may be simplest to resize the existing ESP to at least 500 megabytes, and share that ESP for NixOS.

os-prober

os-prober is a tool to autodetect which other systems are present on the machine. Grub can be told to use os-prober to add a menu-entry for each of them.

/etc/nixos/configuration.nix
{ config, pkgs, ... }: {
  # ...
  boot.loader.grub.enable = true;
  boot.loader.grub.device = "nodev";
  boot.loader.grub.useOSProber = true;
  # ...

}

Manual configuration

In case os-prober does not detect your windows partition you can configure your bootloader manually to find it.

MBR

All MBR bootloaders will need at least some configuration to chainload Windows.

Grub

Here is an example config:

/etc/nixos/configuration.nix
{ config, pkgs, ... }: {
  # ...
  boot.loader.grub.enable = true;
  boot.loader.grub.device = "/dev/sda";
  boot.loader.grub.extraEntries = ''
    menuentry "Windows 7" {
      chainloader (hd0,1)+1
    }
  '';
}

Source: https://www.reddit.com/r/NixOS/comments/31lx3i/windows_and_nixos_dual_boot/

UEFI

After setting up a 256mb EFI Partition dualboot should work out of the box (at least for windows10)

Source: https://zimbatm.com/journal/2016/09/09/nixos-window-dual-boot/ (Archive.org Mirror)

Here is another article that documents dual booting NixOS and Windows on a Lenovo ThinkPad X1 Carbon (6th Gen): https://github.com/andywhite37/nixos/blob/master/DUAL_BOOT_WINDOWS_GUIDE.md

Grub

systemd-boot can not load EFI binaries from other partitions, and a pre-existing EFI partition from a Windows install may be smaller than we would like our /boot partition to be. If we still want Windows and NixOS to use the same EFI partition, we can use GRUB instead.

Here we assume:

  • the EFI partition has been mounted on /boot/efi
  • $FS_UUID is the UUID of the EFI partition
  • the boot.loader.systemd-boot.enable = true; line added to configuration.nix by nixos-generate-config has been removed
/etc/nixos/configuration.nix
{ config, ... }:

{
  boot.loader = {
    efi = {
      canTouchEfiVariables = true;
      # assuming /boot is the mount point of the  EFI partition in NixOS (as the installation section recommends).
      efiSysMountPoint = "/boot";
    };
    grub = {
      # despite what the configuration.nix manpage seems to indicate,
      # as of release 17.09, setting device to "nodev" will still call
      # `grub-install` if efiSupport is true
      # (the devices list is not used by the EFI grub install,
      # but must be set to some value in order to pass an assert in grub.nix)
      devices = [ "nodev" ];
      efiSupport = true;
      enable = true;
      # set $FS_UUID to the UUID of the EFI partition
      extraEntries = ''
        menuentry "Windows" {
          insmod part_gpt
          insmod fat
          insmod search_fs_uuid
          insmod chain
          search --fs-uuid --set=root $FS_UUID
          chainloader /EFI/Microsoft/Boot/bootmgfw.efi
        }
      '';
      version = 2;
    };
  };
}

EFI with multiple disks

When Windows is installed on another disk with a separate EFI partition, the following might work:

/etc/nixos/configuration.nix
{ config, ... }:

{
  boot.loader = {
    efi.canTouchEfiVariables = true;
    grub = {
      enable = true;
      devices = [ "nodev" ];
      efiSupport = true;
      useOSProber = true;
    };
  };
}

System time

System clock might be incorrect after booting Windows and going back to the NixOS. It can be fixed by either setting RTC time standard to UTC on Windows, or setting it to localtime on NixOS.

Setting RTC time standard to localtime, compatible with Windows in its default configuration:

/etc/nixos/configuration.nix
{ config, pkgs, ... }: {
  # ...
  time.hardwareClockInLocalTime = true;
  # ...
}

See Arch Linux wiki#System time.

See also