# Vagrant + VirtualBox { config, pkgs, ... }: { imports = [ ./vagrant-guest.nix ./virtualbox-image.nix ]; virtualbox.params = { audio = "none"; audioin = "off"; audioout = "off"; usb = "off"; usbehci = "off"; }; sound.enable = false; documentation.man.enable = false; documentation.nixos.enable = false; users.extraUsers.vagrant.extraGroups = [ "vboxsf" ]; # generate the box v1 format which is much easier to generate # https://www.vagrantup.com/docs/boxes/format.html system.build.vagrantVirtualbox = pkgs.runCommand "virtualbox-vagrant.box" {} '' mkdir workdir cd workdir # 1. create that metadata.json file echo '{"provider":"virtualbox"}' > metadata.json # 2. create a default Vagrantfile config cat < Vagrantfile Vagrant.configure("2") do |config| config.vm.base_mac = "0800275F0936" end VAGRANTFILE # 3. add the exported VM files tar xvf ${config.system.build.virtualBoxOVA}/*.ova # 4. move the ovf to the fixed location mv *.ovf box.ovf # 5. generate OVF manifest file rm *.mf touch box.mf for fname in *; do checksum=$(sha256sum $fname | cut -d' ' -f 1) echo "SHA256($fname)= $checksum" >> box.mf done # 6. compress everything back together tar --owner=0 --group=0 --sort=name --numeric-owner -czf $out . ''; }