1{ config, lib, pkgs, ... }: 2 3with lib; 4 5let 6 7 cfg = config.virtualbox; 8 9in { 10 11 options = { 12 virtualbox = { 13 baseImageSize = mkOption { 14 type = types.int; 15 default = 10 * 1024; 16 description = '' 17 The size of the VirtualBox base image in MiB. 18 ''; 19 }; 20 }; 21 }; 22 23 config = { 24 25 system.build.virtualBoxImage = import ../../lib/make-disk-image.nix { 26 inherit pkgs lib config; 27 partitioned = true; 28 diskSize = cfg.baseImageSize; 29 30 configFile = pkgs.writeText "configuration.nix" 31 '' 32 { 33 imports = [ <nixpkgs/nixos/modules/virtualisation/virtualbox-image.nix> ]; 34 } 35 ''; 36 37 postVM = 38 '' 39 echo "creating VirtualBox disk image..." 40 ${pkgs.vmTools.qemu}/bin/qemu-img convert -f raw -O vdi $diskImage $out/disk.vdi 41 rm $diskImage 42 ''; 43 }; 44 45 system.build.virtualBoxOVA = pkgs.runCommand "virtualbox-ova" 46 { buildInputs = [ pkgs.linuxPackages.virtualbox ]; 47 vmName = "NixOS ${config.system.nixosLabel} (${pkgs.stdenv.system})"; 48 fileName = "nixos-image-${config.system.nixosLabel}-${pkgs.stdenv.system}.ova"; 49 } 50 '' 51 echo "creating VirtualBox VM..." 52 export HOME=$PWD 53 VBoxManage createvm --name "$vmName" --register \ 54 --ostype ${if pkgs.stdenv.system == "x86_64-linux" then "Linux26_64" else "Linux26"} 55 VBoxManage modifyvm "$vmName" \ 56 --memory 1536 --acpi on --vram 32 \ 57 ${optionalString (pkgs.stdenv.system == "i686-linux") "--pae on"} \ 58 --nictype1 virtio --nic1 nat \ 59 --audiocontroller ac97 --audio alsa \ 60 --rtcuseutc on \ 61 --usb on --mouse usbtablet 62 VBoxManage storagectl "$vmName" --name SATA --add sata --portcount 4 --bootable on --hostiocache on 63 VBoxManage storageattach "$vmName" --storagectl SATA --port 0 --device 0 --type hdd \ 64 --medium ${config.system.build.virtualBoxImage}/disk.vdi 65 66 echo "exporting VirtualBox VM..." 67 mkdir -p $out 68 VBoxManage export "$vmName" --output "$out/$fileName" 69 ''; 70 71 fileSystems."/".device = "/dev/disk/by-label/nixos"; 72 73 boot.loader.grub.device = "/dev/sda"; 74 75 virtualisation.virtualbox.guest.enable = true; 76 77 }; 78}