I’d like to share with my experiences of migration from Debian 7.7 to NixOS 14.12.

I use 256mb RAM KVM-based VPS from RamNode

Before I opened a ticket ID: 399523 to the RamNode support asking to add a NixOS installation ISO for mounting, I needed to use available SystemRescCd image.

Boot: System Rescue (sysresccd), default boot options

Use VNC to get control over the termainal

It’s more comfortable to install the system via ssh, not VNC. So we’ll setup root password and connect to our running SystemRescCd VPS

sysresccd ~ # passwd root

Okay, we are in and now we can start our process of NixOS installation. First we’ll prepare the environment and the storage. VPS gives us 30 GB HDD available at /dev/sda

my-laptop $ ssh root@ipv4-of-your-vps sysresccd ~ # bash sysresccd ~ # export LANG=POSIX sysresccd ~ # export LC_ALL=POSIX sysresccd ~ # fdisk /dev/sda

I’ve created 512MB swap partition /dev/sda1 . However, based on my recent experience, it’s better to at least create it 1GB big as nix-env -i may require more than 700 MB of RAM when it builds a package.

And the rest of a disk space is for /dev/sda2 . Usually I use LVM, but this time I didn’t want to bother, but rather have NixOS up & running ASAP :-)

sysresccd ~ # fdisk -l /dev/sda Disk /dev/sda: 32.2 GB, 32212254720 bytes 255 heads, 63 sectors/track, 3916 cylinders, total 62914560 sectors Units = sectors of 1 * 512 = 512 bytes Sector size ( logical/physical ) : 512 bytes / 512 bytes I/O size ( minimum/optimal ) : 512 bytes / 512 bytes Disk identifier: 0xa3f12756 Device Boot Start End Blocks Id System /dev/sda1 2048 1050623 524288 82 Linux swap / Solaris /dev/sda2 1050624 62914559 30931968 83 Linux

It says that for installation minimum required RAM space should be at least 768MB. Setting up a Linux swap area at /dev/sda1 and activating it.

sysresccd ~ # mkswap /dev/sda1 sysresccd ~ # swapon /dev/sda1

Creating EXT4 FS over /dev/sda2 with the nixos label and mounting it

sysresccd ~ # mkfs.ext4 -j -L nixos /dev/sda2 sysresccd ~ # mount LABEL=nixos /mnt

To install NixOS from another running Linux, we will need to prepare the Nix environment. SystemRescCd doesn’t have any large enough partition (max ~120mb), so I mount tmpfs to /var/empty directory which gives me a pseudo-fs with 256mb space.

sysresccd ~ # mount -t tmpfs -o size=256M tmpfs /var/empty

Create a user/group which we will use for NixOS installation/build.

sysresccd ~ # groupadd -r -g 30000 nixbld sysresccd ~ # useradd -c "Nix build user 1" -u 30001 -d /var/empty -g nixbld -G nixbld -M -N -r -s "$(which nologin)" nixbld1 sysresccd ~ # usermod -s "$(which bash)" nixbld1 sysresccd ~ # mkdir -m 0755 /mnt/nixtmp && chown nixbld1:nixbld /mnt/nixtmp sysresccd ~ # ln -sv /mnt/nixtmp /nix ` /nix ' -> `/mnt/nixtmp'

Switch to the nixbld1 user and install the Nix environment.

sysresccd ~ # su - nixbld1 nixbld1@sysresccd ~ $ export LANG = POSIX nixbld1@sysresccd ~ $ export LC_ALL = POSIX nixbld1@sysresccd ~ $ export NIX_IGNORE_SYMLINK_STORE = 1 nixbld1@sysresccd ~ $ bash < ( curl https://nixos.org/nix/install ) nixbld1@sysresccd ~ $ . /var/empty/.nix-profile/etc/profile.d/nix.sh nixbld1@sysresccd ~ $ nix-channel --remove nixpkgs nixbld1@sysresccd ~ $ nix-channel --add http://nixos.org/channels/nixos-14.12 nixos nixbld1@sysresccd ~ $ nix-channel --update nixbld1@sysresccd ~ $ cat << EOF > configuration.nix { fileSystems."/" = {}; boot.loader.grub.enable = false; } EOF nixbld1@sysresccd ~ $ export NIX_PATH = nixpkgs = /var/empty/.nix-defexpr/channels/nixos:nixos = /var/empty/.nix-defexpr/channels/nixos/nixos nixbld1@sysresccd ~ $ export NIXOS_CONFIG = /var/empty/configuration.nix nixbld1@sysresccd ~ $ nix-env -i -A config.system.build.nixos-install -A config.system.build.nixos-option -A config.system.build.nixos-generate-config -f "<nixos>" nixbld1@sysresccd ~ $ exit sysresccd ~ # . /var/empty/.nix-profile/etc/profile.d/nix.sh sysresccd ~ # nixos-generate-config --root /mnt

We are almost done! Time to configure your NixOS configuration file. Based on how you will set it, the system you will get.

sysresccd ~ # nano -w /mnt/etc/nixos/configuration.nix

Usually it is enough to set there only the following parameters

boot.loader.grub.device = "/dev/sda" ; networking.hostName = "mynixos" ; services.openssh.enable = true ; users.extraUsers.user1 = { isNormalUser = true ; uid = 1000 ; home = "/home/user1" ; extraGroups = [ "wheel" ] ; } ;

Finally, setup the NixOS!

sysresccd ~ # unset NIXOS_CONFIG sysresccd ~ # export NIX_PATH=nixpkgs=/var/empty/.nix-defexpr/channels/nixos:nixos=/var/empty/.nix-defexpr/channels/nixos/nixos sysresccd ~ # nixos-install

At this point we are almost done. If you want to log-in to your NixOS, do not forget to set the password for your user and root if you would like.

sysresccd ~ # ls -latrh /nix/store/*/bin/bash -rwxr-xr-x 1 nixbld1 nixbld 801K Jan 1 1970 /nix/store/r5sxfcwq9324xvcd1z312kb9kkddqvld-bash-4.3-p30/bin/bash sysresccd ~ # nixos-install --chroot /nix/store/r5sxfcwq9324xvcd1z312kb9kkddqvld-bash-4.3-p30/bin/bash ( chroot ) passwd root ( chroot ) passwd user1 ( chroot ) exit sysresccd ~ # usermod -s "$(which nologin)" nixbld1 sysresccd ~ # rm /nix sysresccd ~ # rm -rf /mnt/nixtmp sysresccd ~ # umount /mnt sysresccd ~ # swapoff /dev/sda1 sysresccd ~ # sysctl -w vm.drop_caches=3 sysresccd ~ # sync sysresccd ~ # shutdown -r now

Once you boot your NixOS, don’t forget to check the journal for errors, warnings, etc.. and update the system.

my-laptop ~ $ ssh user1@my-vps [ user1@mynixos:~] $ sudo su - [ root@mynixos:~]# journalctl -b -p crit [ root@mynixos:~]# journalctl -b -p warning [ root@mynixos:~]# nix-channel --update [ root@mynixos:~]# nixos-rebuild switch --upgrade [ root@mynixos:~]# nix-env -u '*'

For the rest, here is the NixOS Manual ;-)

Good luck & Have fun!