ALPHA: wire is a tool to deploy nixos systems wire.althaea.zone/

comment: true title: Creating a Virtual Machine description: Creating a NixOS virtual machine to use as a deployment target.#

Creating a Virtual Machine#

{{ $frontmatter.description }}

Creating a vm.nix#

For this step, you'll need your ssh public key, which you can obtain from ssh-add -L.

Open a text editor and edit vm.nix. Place in it this basic NixOS virtual machine configuration, which enables openssh and forwards it's 22 port:

let
  sources = import ./npins;
in
{
  imports = [ "${sources.nixpkgs}/nixos/modules/virtualisation/qemu-vm.nix" ];

  networking.hostName = "wire-tutorial";

  users.users.root = {
    initialPassword = "root";
    openssh.authorizedKeys.keys = [
      # I made this a nix syntax error so you're forced to deal with it!
      <your ssh public-key as a string>
    ];
  };

  boot = {
    loader = {
      systemd-boot.enable = true;
      efi.canTouchEfiVariables = true;
    };

    kernelParams = [ "console=ttyS0" ];

    boot.growPartition = true;
  };

  # enable openssh
  services = {
    openssh = {
      enable = true;
      settings.PermitRootLogin = "yes";
    };

    getty.autologinUser = "root";
  };

  virtualisation = {
    graphics = false;
    useBootLoader = true;

    # use a 5gb disk
    diskSize = 5 * 1024;

    # grow the filesystem to fit the 5 gb we reserved
    fileSystems."/".autoResize = true;

    # forward `openssh` port 22 to localhost:2222.
    forwardPorts = [
      {
        from = "host";
        host.port = 2222;
        guest.port = 22;
      }
    ];
  };

  system.stateVersion = "23.11";
}

If you like, you may take a moment to understand each line of this configuration.

Building & Running the virtual machine#

Open a separate Terminal tab/window/instance, ensuring you enter the development shell with nix-shell. Then, build the virtual machine with a bootloader, taking our vm.nix as the nixos configuration.

$ nix-shell
[nix-shell]$ nix-build '<nixpkgs/nixos>' -A vmWithBootLoader -I nixos-config=./vm.nix

::: tip HELP

If you got an error such as

error: The option `...' in `...' is already declared in `...'.

make sure you ran the above command in the nix-shell!

:::

Building the virtual machine can take some time, but once it completes, start it by running:

[nix-shell]$ ./result/bin/run-wire-tutorial-vm

You will see boot-up logs fly across the screen and eventually you will be placed into shell inside the virtual machine.

running activation script...
setting up /etc...

Welcome to NixOS 25.11 (Xantusia)!

[  OK  ] Created slice Slice /system/getty.
[  OK  ] Created slice Slice /system/modprobe.
...
<<< Welcome to NixOS 25.11pre861972.88cef159e47c (x86_64) - hvc0 >>>

Run 'nixos-help' for the NixOS manual.

wire-tutorial login: root (automatic login)

[root@wire-tutorial:~]#

::: details Further details on how the above commands work can be found at nix.dev :::

Summary#

Congratulations, you created a virtual machine in your terminal. We'll be deploying to this virtual machine, so keep the terminal instance open.

::: info From now on, commands ran inside the virtual machine will be lead with the following prompt:

[root@wire-tutorial:~]#

:::

::: tip If you ever want to quit the virtual machine, run the command poweroff. :::