Installing NixOS
Obtaining NixOS NixOS ISO images can be downloaded from the NixOS homepage. These can be burned onto a CD. It is also possible to copy them onto a USB stick and install NixOS from there. For details, see the NixOS Wiki. As an alternative to installing NixOS yourself, you can get a running NixOS system through several other means: Using virtual appliances in Open Virtualization Format (OVF) that can be imported into VirtualBox. These are available from the NixOS homepage. Using AMIs for Amazon’s EC2. To find one for your region and instance type, please refer to the list of most recent AMIs. Using NixOps, the NixOS-based cloud deployment tool, which allows you to provision VirtualBox and EC2 NixOS instances from declarative specifications. Check out the NixOps homepage for details.
Installation Boot from the CD. The CD contains a basic NixOS installation. (It also contains Memtest86+, useful if you want to test new hardware.) When it’s finished booting, it should have detected most of your hardware and brought up networking (check ifconfig). Networking is necessary for the installer, since it will download lots of stuff (such as source tarballs or Nixpkgs channel binaries). It’s best if you have a DHCP server on your network. Otherwise configure networking manually using ifconfig. The NixOS manual is available on virtual console 8 (press Alt+F8 to access). Login as root and the empty password. If you downloaded the graphical ISO image, you can run start display-manager to start KDE. The NixOS installer doesn’t do any partitioning or formatting yet, so you need to that yourself. Use the following commands: For partitioning: fdisk. For initialising Ext4 partitions: mkfs.ext4. It is recommended that you assign a unique symbolic label to the file system using the option , since this makes the file system configuration independent from device changes. For example: $ mkfs.ext4 -L nixos /dev/sda1 For creating swap partitions: mkswap. Again it’s recommended to assign a label to the swap partition: . For creating LVM volumes, the LVM commands, e.g., $ pvcreate /dev/sda1 /dev/sdb1 $ vgcreate MyVolGroup /dev/sda1 /dev/sdb1 $ lvcreate --size 2G --name bigdisk MyVolGroup $ lvcreate --size 1G --name smalldisk MyVolGroup For creating software RAID devices, use mdadm. Mount the target file system on which NixOS should be installed on /mnt, e.g. $ mount /dev/disk/by-label/nixos /mnt If your machine has a limited amount of memory, you may want to activate swap devices now (swapon device). The installer (or rather, the build actions that it may spawn) may need quite a bit of RAM, depending on your configuration. You now need to create a file /mnt/etc/nixos/configuration.nix that specifies the intended configuration of the system. This is because NixOS has a declarative configuration model: you create or edit a description of the desired configuration of your system, and then NixOS takes care of making it happen. The syntax of the NixOS configuration file is described in , while a list of available configuration options appears in . A minimal example is shown in . The command nixos-generate-config can generate an initial configuration file for you: $ nixos-generate-config --root /mnt You should then edit /mnt/etc/nixos/configuration.nix to suit your needs: $ nano /mnt/etc/nixos/configuration.nix The vim text editor is also available. You must set the option to specify on which disk the GRUB boot loader is to be installed. Without it, NixOS cannot boot. Another critical option is , specifying the file systems that need to be mounted by NixOS. However, you typically don’t need to set it yourself, because nixos-generate-config sets it automatically in /mnt/etc/nixos/hardware-configuration.nix from your currently mounted file systems. (The configuration file hardware-configuration.nix is included from configuration.nix and will be overwritten by future invocations of nixos-generate-config; thus, you generally should not modify it.) Depending on your hardware configuration or type of file system, you may need to set the option to include the kernel modules that are necessary for mounting the root file system, otherwise the installed system will not be able to boot. (If this happens, boot from the CD again, mount the target file system on /mnt, fix /mnt/etc/nixos/configuration.nix and rerun nixos-install.) In most cases, nixos-generate-config will figure out the required modules. Examples of real-world NixOS configuration files can be found at . Do the installation: $ nixos-install Cross fingers. If this fails due to a temporary problem (such as a network issue while downloading binaries from the NixOS binary cache), you can just re-run nixos-install. Otherwise, fix your configuration.nix and then re-run nixos-install. If everything went well: $ reboot You should now be able to boot into the installed NixOS. The GRUB boot menu shows a list of available configurations (initially just one). Every time you change the NixOS configuration (see ), a new item appears in the menu. This allows you to easily roll back to another configuration if something goes wrong. You should log in and change the root password with passwd. You’ll probably want to create some user accounts as well, which can be done with useradd: $ useradd -c 'Eelco Dolstra' -m eelco $ passwd eelco You may also want to install some software. For instance, $ nix-env -qa \* shows what packages are available, and $ nix-env -i w3m install the w3m browser. To summarise, shows a typical sequence of commands for installing NixOS on an empty hard drive (here /dev/sda). shows a corresponding configuration Nix expression. Commands for installing NixOS on <filename>/dev/sda</filename> $ fdisk /dev/sda # (or whatever device you want to install on) $ mkfs.ext4 -L nixos /dev/sda1 $ mkswap -L swap /dev/sda2 $ swapon /dev/sda2 $ mount /dev/disk/by-label/nixos /mnt $ nixos-generate-config --root /mnt $ nano /mnt/etc/nixos/configuration.nix $ nixos-install $ reboot NixOS configuration { config, pkgs, ... }: { imports = [ # Include the results of the hardware scan. ./hardware-configuration.nix ]; boot.loader.grub.device = "/dev/sda"; # Note: setting fileSystems is generally not # necessary, since nixos-generate-config figures them out # automatically in hardware-configuration.nix. #fileSystems."/".device = "/dev/disk/by-label/nixos"; # Enable the OpenSSH server. services.sshd.enable = true; }
UEFI Installation NixOS can also be installed on UEFI systems. The procedure is by and large the same as a BIOS installation, with the following changes: You should boot the live CD in UEFI mode (consult your specific hardware's documentation for instructions). Instead of fdisk, you should use gdisk to partition your disks. You will need to have a separate partition for /boot with partition code EF00, and it should be formatted as a vfat filesystem. You must set to true, and to false. nixos-generate-config should do this automatically for new configurations when booted in UEFI mode. You may want to look at the options starting with and as well. To see console messages during early boot, add "fbcon" to your .
Booting from a USB stick For systems withoua CD drive, the NixOS livecd can be booted from a usb stick. For non-UEFI installations, unetbootin will work. For UEFI installations, you should mount the ISO, copy its contents verbatim to your drive, then either: Change the label of the disk partition to the label of the ISO (visible with the blkid command), or Edit loader/entries/nixos-livecd.conf on the drive and change the root= field in the options line to point to your drive (see the documentation on root= in the kernel documentation for more details).
Changing the configuration The file /etc/nixos/configuration.nix contains the current configuration of your machine. Whenever you’ve changed something to that file, you should do $ nixos-rebuild switch to build the new configuration, make it the default configuration for booting, and try to realise the configuration in the running system (e.g., by restarting system services). These commands must be executed as root, so you should either run them from a root shell or by prefixing them with sudo -i. You can also do $ nixos-rebuild test to build the configuration and switch the running system to it, but without making it the boot default. So if (say) the configuration locks up your machine, you can just reboot to get back to a working configuration. There is also $ nixos-rebuild boot to build the configuration and make it the boot default, but not switch to it now (so it will only take effect after the next reboot). You can make your configuration show up in a different submenu of the GRUB 2 boot screen by giving it a different profile name, e.g. $ nixos-rebuild switch -p test which causes the new configuration (and previous ones created using -p test) to show up in the GRUB submenu “NixOS - Profile 'test'”. This can be useful to separate test configurations from “stable” configurations. Finally, you can do $ nixos-rebuild build to build the configuration but nothing more. This is useful to see whether everything compiles cleanly. If you have a machine that supports hardware virtualisation, you can also test the new configuration in a sandbox by building and running a QEMU virtual machine that contains the desired configuration. Just do $ nixos-rebuild build-vm $ ./result/bin/run-*-vm The VM does not have any data from your host system, so your existing user accounts and home directories will not be available. You can forward ports on the host to the guest. For instance, the following will forward host port 2222 to guest port 22 (SSH): $ QEMU_NET_OPTS="hostfwd=tcp::2222-:22" ./result/bin/run-*-vm allowing you to log in via SSH (assuming you have set the appropriate passwords or SSH authorized keys): $ ssh -p 2222 localhost
Upgrading NixOS The best way to keep your NixOS installation up to date is to use one of the NixOS channels. A channel is a Nix mechanism for distributing Nix expressions and associated binaries. The NixOS channels are updated automatically from NixOS’s Git repository after certain tests have passed and all packages have been built. These channels are: Stable channels, such as nixos-13.10. These only get conservative bug fixes and package upgrades. For instance, a channel update may cause the Linux kernel on your system to be upgraded from 3.4.66 to 3.4.67 (a minor bug fix), but not from 3.4.x to 3.11.x (a major change that has the potential to break things). Stable channels are generally maintained until the next stable branch is created. The unstable channel, nixos-unstable. This corresponds to NixOS’s main development branch, and may thus see radical changes between channel updates. It’s not recommended for production systems. To see what channels are available, go to . (Note that the URIs of the various channels redirect to a directory that contains the channel’s latest version and includes ISO images and VirtualBox appliances.) When you first install NixOS, you’re automatically subscribed to the NixOS channel that corresponds to your installation source. For instance, if you installed from a 13.10 ISO, you will be subscribed to the nixos-13.10 channel. To see which NixOS channel you’re subscribed to, run the following as root: $ nix-channel --list | grep nixos nixos https://nixos.org/channels/nixos-unstable To switch to a different NixOS channel, do $ nix-channel --add http://nixos.org/channels/channel-name nixos (Be sure to include the nixos parameter at the end.) For instance, to use the NixOS 13.10 stable channel: $ nix-channel --add http://nixos.org/channels/nixos-13.10 nixos But it you want to live on the bleeding edge: $ nix-channel --add http://nixos.org/channels/nixos-unstable nixos You can then upgrade NixOS to the latest version in your chosen channel by running $ nixos-rebuild switch --upgrade which is equivalent to the more verbose nix-channel --update nixos; nixos-rebuild switch. It is generally safe to switch back and forth between channels. The only exception is that a newer NixOS may also have a newer Nix version, which may involve an upgrade of Nix’s database schema. This cannot be undone easily, so in that case you will not be able to go back to your original channel.