# nixos-generators - one config, multiple formats The nixos-generators project allows to take the same NixOS configuration, and generate outputs for different target formats. Just put your stuff into the configuration.nix and then call one of the image builders. for example: ``` nixos-generate -f iso ``` or ``` nixos-generate -f iso -c /etc/nixos/configuration.nix ``` it echoes the path to a iso image, which you then can flash onto an usb-stick or mount & boot in a virtual machine. # Installation nixos-generators is part of [nixpkgs](https://search.nixos.org/packages?channel=unstable&show=nixos-generators&from=0&size=50&sort=relevance&type=packages&query=nixos-generator) and can be installed from there. nixos-generators can be also installed from source into the user profile like this: ```console nix-env -f https://github.com/nix-community/nixos-generators/archive/master.tar.gz -i ``` or for flakes users like this: ```console nix profile install github:nix-community/nixos-generators ``` or run from the nix flake without installing: ``` nix run github:nix-community/nixos-generators -- --help ``` ## Supported formats format | description --- | --- amazon | Amazon EC2 image azure | Microsoft azure image (Generation 1 / VHD) cloudstack | qcow2 image for cloudstack do | Digital Ocean image docker | Docker image (uses systemd to run, probably only works in podman) gce | Google Compute image hyperv | Hyper-V Image (Generation 2 / VHDX) install-iso | Installer ISO install-iso-hyperv | Installer ISO with enabled hyper-v support iso | ISO kexec | kexec tarball (extract to / and run /kexec_nixos) kexec-bundle | same as before, but it's just an executable kubevirt | KubeVirt image lxc | create a tarball which is importable as an lxc container, use together with lxc-metadata lxc-metadata | the necessary metadata for the lxc image to start, usage: lxc image import $(nixos-generate -f lxc-metadata) $(nixos-generate -f lxc) openstack | qcow2 image for openstack proxmox | [VMA](https://pve.proxmox.com/wiki/VMA) file for proxmox proxmox-lxc | LXC template for proxmox qcow | qcow2 image raw | raw image with bios/mbr raw-efi | raw image with efi support sd-aarch64 | Like sd-aarch64-installer, but does not use default installer image config. sd-aarch64-installer | create an installer sd card for aarch64. For cross compiling use `--system aarch64-linux` and read the cross-compile section. vagrant-virtualbox | VirtualBox image for [Vagrant](https://www.vagrantup.com/) virtualbox | virtualbox VM vm | only used as a qemu-kvm runner vm-bootloader | same as vm, but uses a real bootloader instead of netbooting vm-nogui | same as vm, but without a GUI vmware | VMWare image (VMDK) ## Usage Run `nixos-generate --help` for detailed usage information. ## select a specific nixpkgs channel adds ability to select a specific channel version. example: ``` nix-shell --command './nixos-generate -f iso -I nixpkgs=channel:nixos-19.09' ``` ## Using a particular nixpkgs To use features found in a different nixpkgs (for instance the Digital Ocean image was recently merged in nixpkgs): ``` NIX_PATH=nixpkgs=../nixpkgs nixos-generate -f do ``` ## Cross Compiling To cross compile nixos images for other system you have to configure `boot.binfmtMiscRegistrations` on your host system. For more details about this have a look at : [clevers qemu-user](https://github.com/cleverca22/nixos-configs/blob/master/qemu.nix). Once you've run `nixos-rebuild` with theses options, you can use the `--system` option to create images for other architectures. ## Using in a Flake `nixos-generators` can be included as a `Flake` input and provides a `nixos-generate` function for building images as `Flake` outputs. This approach pins all dependencies and allows for conveniently defining multiple output types based on one config. An example `flake.nix` demonstrating this approach is below. `vmware` or `virtualbox` images can be built from the same `configuration.nix` by running `nix build .#vmware` or `nix build .#virtualbox` ```nix { inputs = { nixpkgs.url = "nixpkgs/nixos-unstable"; nixos-generators = { url = "github:nix-community/nixos-generators"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = { self, nixpkgs, nixos-generators, ... }: { packages.x86_64-linux = { vmware = nixos-generators.nixosGenerate { pkgs = nixpkgs.legacyPackages.x86_64-linux; modules = [ # you can include your own nixos configuration here, i.e. # ./configuration.nix ]; format = "vmware"; }; vbox = nixos-generators.nixosGenerate { pkgs = nixpkgs.legacyPackages.x86_64-linux; format = "virtualbox"; }; }; }; } ``` ### License This project is licensed under the [MIT License](LICENSE). # FAQ #### No space left on device this means either /tmp, /run/user/$UID or your TMPFS runs full. sometimes setting TMPDIR to some other location can help, sometimes /tmp needs to be on a bigger partition (not a tmpfs).