NixOS:nixos-rebuild build-vm: Difference between revisions

m Add subtitle and fix formatting
Restructured page, add more text more sections
Line 1: Line 1:
A virtual machine can be created , it will use your /etc/nixos/configuration.nix to make a 'clone' of your system. Useful for testing new configurations.
The commands


<code>
* <code>nixos-rebuild build-vm</code>
nixos-rebuild build-vm
* <code>nixos-rebuild build-vm-with-bootloader</code>
 
will build a virtual machine running NixOS with your system's configuration (usually <code>/etc/nixos/configuration.nix</code>) by using [[Qemu]].
 
One of its usages is for testing new configurations without needing to try them on the host.


nixos-rebuild build-vm -I nixos-config=./configuration.nix -I nix_path='<nixpkgs/nixos>' --max-jobs 4  --show-trace # e.g. to specify the environment variables / cores used
= Usage =
</code>


You can also use <code>build-vm-with-bootloader</code>. From the man page: this boots using the regular boot loader of your configuration rather than booting directly into the kernel and initial ramdisk of the system.
== Create login user ==


You will not be able to login to this virtual machine, as the passwords are not carried over to the virtual machine you build.
Before calling one of the commands above, you will have to create a user with an initial password first which you can login to because your passwords of your current system are not carried over to the virtual machine.


You should have user nixosvmtest (isSystemUser or isNormalUser)
Here is an example for a default user which you can simply add to your system config:
<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
users.users.nixosvmtest.isSystemUser = true ;
users.users.nixosvmtest.isSystemUser = true;
users.users.nixosvmtest.initialPassword = "test";
users.users.nixosvmtest.initialPassword = "test";
users.groups.nixosvmtest = {};
users.users.nixosvmtest.group = "nixosvmtest";
</syntaxhighlight>
</syntaxhighlight>


If you have a user called nixosvmtest for example, you can add
See this [https://discourse.nixos.org/t/default-login-and-password-for-nixos/4683/2 discourse-answer] for more information.
 
== Create and run virtual machine ==
Create the virtual machine by using of the commands above. Afterwards you will find an executable file in <code>./result/bin</code>. By executing the file qemu will open up and you can start testing the system.


<syntaxhighlight lang="nix">
== Examples ==
users.users.nixosvmtest.group = "nixosvmtest";
users.groups.nixosvmtest = {};
</syntaxhighlight>


to your <code>/etc/nixos/configuration.nix</code>
<syntaxhighlight lang="bash">
# build vm of your system config
nixos-rebuild build-vm


you should now be able to login and test your system with this user and password.
# e.g. to specify the environment variables / cores used
nixos-rebuild build-vm\
  -I nixos-config=./configuration.nix\
  -I nix_path='<nixpkgs/nixos>'\
  --max-jobs 4\
  --show-trace


https://discourse.nixos.org/t/default-login-and-password-for-nixos/4683/2
# From the man page: This boots using the regular boot loader of your configuration
# rather than booting directly into the kernel and initial ramdisk of the system.
nixos-rebuild build-vm-with-bootloader
</syntaxhighlight>


== Configure Virtual Machine ==
= Configure Virtual Machine =


By default, the virtual machine is configured to have 1 CPU and 1024MiB memory. It may be too small for testing with desktop environment enabled inside. You can set options <code>virtualisation.vmVariant.virtualisation.cores</code> and <code>virtualisation.vmVariant.virtualisation.memorySize</code> to enlarge the CPU cores and memory size for the virtual machine.
By default, the virtual machine is configured to have 1 CPU and 1024MiB memory. It may be too small for testing with a desktop environment enabled inside. You can configure the allocated resources with either
* [https://search.nixos.org/options?channel=25.05&show=virtualisation.vmVariant&query=virtualisation.vmVariant <code>virtualisation.vmVariant</code>]
* [https://search.nixos.org/options?channel=25.05&show=virtualisation.vmVariantWithBootLoader&query=virtualisation.vmVariant <code>virtualisation.vmVariantWithBootloader</code>]
by adding the following to your config:


<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
{
# replace `vmVariant` with `vmVariantWithBootLoader` if you are going to use `build-vm-with-bootloder`.
virtualisation.vmVariant = {
virtualisation.vmVariant = {
   # following configuration is added only when building VM with build-vm
   # the following configuration is added only when building VM with `build-vm`
   virtualisation = {
   virtualisation = {
     memorySize = 2048; # Use 2048MiB memory.
     memorySize = 2048; # use 2048MiB memory
     cores = 3;         
     cores = 3;        # use 3 cpu cores
   };
   };
}
}
</syntaxhighlight>
</syntaxhighlight>
Use <code>virtualisation.vmVariantWithBootLoader</code> option if you used <code>build-vm-with-bootloader</code> earlier.


== Troubleshooting ==
== Troubleshooting ==