Dual-boot Windows and NixOS
PrefaceThis guide was originally written in 2018. Please be aware that some information may be outdated.
Learning about computers
I always presumed there was a BIOS that did stuff that triggered OS software to run. Turns out things are much more complicated than that.
New technology obsoletes others. After a strong dominance, BIOS is now being deprecated, and being replaced by UEFI. In most modern motherboards, you should already have UEFI installed.
Speaking of new technology, MBR, short for Master Boot Record is also being deprecated in favor of GPT, or GUID Partition Table. Reason? MBR didn’t think consumer-grade 4TB hard drives were possible then.
Installing windows
Installing windows using UEFI should be pretty easy by following window’s own instructions. The entire installation process should take roughly half an hour if you skip updates.
Installing nixos
Installing nixos is slightly more complicated. First, you should download nixos through their official page. Now using that loader, make sure it is booted in UEFI mode by going into your UEFI BIOS and specifically triggering it.
A rather simple screen should pop up with a whole bunch of output. Wait for the command line to appear.
Understanding linux file systems
In short, disks are ordered alphabetically and prefixed with /dev/sd
. So your first disk will be /dev/sda
and second /dev/sdb
and so on.
Partitions are then ordered numerically, so the first partition in the first disk will be dev/sda1
.
Partitioning NixOS
We will be creating two partitions, a file system, and a swap partition. A swap partition is used for increasing your amount of virtual RAM. Although I have 8Gb RAM sticks, machine learning can be quite taxing, and hence I will be partitioning 8Gb here, 4Gb should be sufficient for most workloads.
Run the following using gdisk
:
Command: o ↵ This option deletes all partitions and creates a new protective MBR. Proceed? (Y/N): y ↵ Command: n ↵ Partition Number: ↵ First sector: ↵ Last sector: 4G ↵ Hex Code: 8200 ↵ Command: n ↵ Partition Number: ↵ First sector: ↵ Last sector: ↵ Hex Code: ↵ Command: w ↵ Do you want to proceed? (Y/N): Y ↵
You can check if everything went smoothly via fdisk --list
.
Now we need to set them to the correct type of partitions with the following
mkfs.ext4 -L nixos /dev/sdb2 mkswap -L swap /dev/sdb1
Drive IDsRemember to adjust the drive IDs as necessary to match your system configuration.
Mounting
Mount NixOS on the partition we just labeled as nixos with:
mount /dev/disk/by-label/nixos /mnt
Remember the boot drive windows installed for you? If you don’t, just run fdisk --list
again and find the one with the type EFI system.
mkdir /mnt/boot mount /dev/sda2 /mnt/boot
NixOS config
The great thing about NixOS is everything from the kernel to the desktop environment is config driven. Generate and modify the config via:
nixos-generate-config --root /mnt nano /mnt/etc/nixos/configuration.nix # Or use your favorite editor
You should double-check if the following are present, absence of them means you installed in BIOS mode instead of UEFI!
boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true;
You should also add the following line if your EFI partition isn’t /dev/sda1
:
boot.loader.efi.efibootmgr.efiDisk = "/dev/sda"; boot.loader.efi.efibootmgr.efiPartition = "2";
Things you should enable are definitely the services.xserver
sets, as those are desktop environment related settings. If you don’t trigger those, you’ll be looking at a console on reboot.
You should also add a user:
users.extraUsers.myName = { isNormaluser = true; initialPassword = "password"; uid = 1000; home = "/home/myName"; description = "My Full Name"; extraGroups = [ "wheel" "networkmanager" ]; };
Installing
Run nixos-install
and pray. Don’t worry if you screwed up. NixOS configuration is stateless and can always be changed with nixos-rebuild switch
.
If everything went well, reboot
should lead you to the EFI loader, and you can now switch between the two OSes. Congratulations!