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}