Did you know that it is rather easy to setup a VM to test your NixOs configuration?
# flake.nix
{
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
outputs = { self, nixpkgs, ... }:
let
system = "x86_64-linux";
in
{
# test is a hostname for our machine
nixosConfigurations.test = nixpkgs.lib.nixosSystem {
inherit system;
modules = [
./configuration.nix
];
};
};
}
# configuration.nix
{ config, lib, pkgs, ... }: {
# customize kernel version
boot.kernelPackages = pkgs.linuxPackages_5_15;
users.groups.admin = {};
users.users = {
admin = {
isNormalUser = true;
extraGroups = [ "wheel" ];
password = "admin";
group = "admin";
};
};
virtualisation.vmVariant = {
# following configuration is added only when building VM with build-vm
virtualisation = {
memorySize = 2048; # Use 2048MiB memory.
cores = 3;
graphics = false;
};
};
services.openssh = {
enable = true;
settings.PasswordAuthentication = true;
};
networking.firewall.allowedTCPPorts = [ 22 ];
environment.systemPackages = with pkgs; [
htop
];
system.stateVersion = "23.05";
}
git init # skip this step if you are inside already tracked repository
git add . # flakes requires at least tracking the files
nixos-rebuild build-vm --flake .#test
# expose port 22 from guest
export QEMU_NET_OPTS="hostfwd=tcp::2221-:22"
result/bin/run-nixos-vm
# ssh onto the machine
ssh -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no admin@localhost -p 2221
I ended up here from Google, and thought I'd share a little snippet that might be helpful. You can make building the VM easier by exposing the
config.system.build.vm
value directly:This allows you to run something like this to build the system:
nix build .#vms.test ./result/bin/run-nixos-vim
That name could be anything, though. This is by no means necessary, but is very nice if you are going to iterate on a VM at all.