This is a post of things I wanted to do in nixos but isn’t described anywhere. I had to read source code to figure these things out. By explaining here what is going on I make things easier for other people.
Nix custom image
It’s possible to bypass virtual box and make a bunch of different image formats directly, I used two files image.nix
:
{ config, ... }:
let
pkgs = import ./pin.nix { };
in
{
system.build.image = import <nixpkgs/nixos/lib/make-disk-image.nix> {
name = "nixos-vmdk-${config.system.nixos.label}-${pkgs.stdenv.hostPlatform.system}";
format = "vpc";
inherit pkgs config;
lib = pkgs.lib;
partitionTableType = "legacy";
diskSize = 11 * 1024;
};
.... # remaining config, same as configuration.nix
}
and the disk.nix
:
{ nixos ? <nixpkgs/nixos>
, system ? builtins.currentSystem
}:
let
machine-configuration = import ./image.nix;
machine = import nixos {
inherit system;
configuration = machine-configuration;
};
in
machine.config.system.build.image
If you run nix-build disk.nix
you’ll get a VHD with the configuration from image.nix
which is just a nixos standard configuraiton.nix
.
Nixos-rebuild remote
We can use nixos-rebuild to do in place updates of a running system remotely. If your deployment is a single VM this is significantly easier than using nixops. I ended up with this make file:
IP="192.168.0.39"
deploy:
NIXOS_CONFIG=$(shell pwd)"/image.nix" nixos-rebuild switch --target-host root@$(IP)
You may also want to set --build-host
, because by default it will build on target-host
.
Install nix on running nix
For some reason my boot disk gets corrupted after switching a couple of times. A solution is just to never reboot, however you can also just fix this while running the system. Switching doesn’t do this apparently. I know this because it didn’t boot. This doesn’t matter because you can install your currently running system!
Mount root as /mnt
. Format your boot partition and mount it on /mnt/boot
. Then run nixos-install
. For example:
mount # list everything mounted
mount /dev/nvme0n1p2 /mnt
umount /boot
mkfs.vfat -n boot /dev/nvme0n1p1
mount /dev/nvme0n1p1 /boot
mount /dev/nvme0n1p1 /mnt/boot