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
There is an easier way to run the VM using the flake's
apps
output:With this, executing
nix run
will run the default app, which in this case is the test VM. If you have more than one VM, you can specify which one you'd like to run withnix run .#<name>
. For example, I can runtest
withnix run .#test
.Also, it's optional to add flake-utils, but it's quite useful for supporting multiple systems.