Difference between revisions of "Dual Booting NixOS and Windows"

From NixOS Wiki
Jump to: navigation, search
m (→‎EFI + Grub: Fixes comment, the previous statement wasn't false, but may have been surprising when compared to the installation section of the manual)
(mention os-prober)
Line 1: Line 1:
== MBR ==
+
This article explains various methods to have the bootloader prompt whether to boot windows or NixOS.
 +
 
 +
== Autodetection with os-prober ==
 +
 
 +
<code>os-prober</code> 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.
 +
 
 +
{{File|/etc/nixos/configuration.nix|nix|<nowiki>
 +
{ config, pkgs, ... }: {
 +
  # ...
 +
  boot.loader.grub.enable = true;
 +
  boot.loader.grub.version = 2;
 +
  boot.loader.grub.device = "/dev/sda";
 +
  boot.loader.grub.useOSProber = true;
 +
  # ...
 +
 
 +
}</nowiki>}}
 +
 
 +
== Manual bootloader configuration ==
 +
In case <code>os-prober</code> 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.
 
All MBR bootloaders will need at least some configuration to chainload Windows.
  
=== MBR + Grub ===
+
==== Grub ====
  
When using MBR on your disk then you can configure grub chain-loading:
+
Here is an example config:
  
<syntaxhighlight lang="nix">{
+
{{File|/etc/nixos/configuration.nix|nix|<nowiki>
 +
{ config, pkgs, ... }: {
 +
  # ...
 
   boot.loader.grub.enable = true;
 
   boot.loader.grub.enable = true;
 
   boot.loader.grub.version = 2;
 
   boot.loader.grub.version = 2;
Line 16: Line 39:
 
     }
 
     }
 
   '';
 
   '';
}</syntaxhighlight>
+
}</nowiki>}}
 
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 ==
+
=== EFI ===
  
 
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 25: Line 48:
 
Source: https://zimbatm.com/journal/2016/09/09/nixos-window-dual-boot/
 
Source: https://zimbatm.com/journal/2016/09/09/nixos-window-dual-boot/
  
=== EFI + Grub ===
+
==== Grub ====
  
 
<nowiki>systemd-boot</nowiki> can not load EFI binaries from other partitions,
 
<nowiki>systemd-boot</nowiki> can not load EFI binaries from other partitions,
Line 32: Line 55:
 
Here we assume:
 
Here we assume:
 
* the EFI partition has been mounted on <nowiki>/boot/efi</nowiki>
 
* the EFI partition has been mounted on <nowiki>/boot/efi</nowiki>
* <nowiki>$FS_UUID</nowiki> is the UUID of the EFI partition
+
* <code>$FS_UUID</code> is the UUID of the EFI partition
* the <nowiki>boot.loader.systemd-boot.enable = true;</nowiki> line added to configuration.nix by <nowiki>nixos-generate-config</nowiki> has been removed
+
* the <code>boot.loader.systemd-boot.enable = true;</code> line added to configuration.nix by <code>nixos-generate-config</code> has been removed
  
<syntaxhighlight lang="nix">
+
{{File|/etc/nixos/configuration.nix|nix|<nowiki>
 
{ config, ... }:
 
{ config, ... }:
  
Line 68: Line 91:
 
     };
 
     };
 
   };
 
   };
}</syntaxhighlight>
+
}</nowiki>}}
  
 
Sources:
 
Sources:
 
* [https://wiki.archlinux.org/index.php/GRUB#Windows_installed_in_UEFI-GPT_Mode_menu_entry Arch Wiki GRUB article]
 
* [https://wiki.archlinux.org/index.php/GRUB#Windows_installed_in_UEFI-GPT_Mode_menu_entry Arch Wiki GRUB article]
 
* [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>)

Revision as of 14:24, 31 May 2018

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

Autodetection with 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.

Breeze-text-x-plain.png
/etc/nixos/configuration.nix
{ config, pkgs, ... }: {
  # ...
  boot.loader.grub.enable = true;
  boot.loader.grub.version = 2;
  boot.loader.grub.device = "/dev/sda";
  boot.loader.grub.useOSProber = true;
  # ...

}


Manual bootloader 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:

Breeze-text-x-plain.png
/etc/nixos/configuration.nix
{ config, pkgs, ... }: {
  # ...
  boot.loader.grub.enable = true;
  boot.loader.grub.version = 2;
  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/

EFI

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/

Grub

systemd-boot can not load EFI binaries from other partitions, and a pre-exisitng 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
Breeze-text-x-plain.png
/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--uid --set=root $FS_UUID
          chainloader /EFI/Microsoft/Boot/bootmgfw.efi
        }
      '';
      version = 2;
    };
  };
}


Sources: