From b3347287be60aebc723702b5b298f9738ce8481c Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Mon, 28 Sep 2015 14:31:19 +0200 Subject: [PATCH] Use make-disk-image.nix for VirtualBox images --- nixos/lib/make-disk-image.nix | 6 + .../virtualisation/virtualbox-image.nix | 112 +++++------------- 2 files changed, 34 insertions(+), 84 deletions(-) diff --git a/nixos/lib/make-disk-image.nix b/nixos/lib/make-disk-image.nix index 386d88a5b35..54090c95a56 100644 --- a/nixos/lib/make-disk-image.nix +++ b/nixos/lib/make-disk-image.nix @@ -19,6 +19,9 @@ # /etc/nixos/configuration.nix. configFile ? null +, # Shell code executed after the VM has finished. + postVM ? "" + }: with lib; @@ -35,6 +38,7 @@ pkgs.vmTools.runInLinuxVM ( buildInputs = [ pkgs.utillinux pkgs.perl pkgs.e2fsprogs pkgs.parted ]; exportReferencesGraph = [ "closure" config.system.build.toplevel ]; + inherit postVM; } '' ${if partitioned then '' @@ -68,6 +72,7 @@ pkgs.vmTools.runInLinuxVM ( mkdir -p /mnt/nix/store echo "copying everything (will take a while)..." + set -f cp -prd $storePaths /mnt/nix/store/ # Register the paths in the Nix database. @@ -94,6 +99,7 @@ pkgs.vmTools.runInLinuxVM ( # Generate the GRUB menu. ln -s vda /dev/xvda + ln -s vda /dev/sda chroot /mnt ${config.system.build.toplevel}/bin/switch-to-configuration boot umount /mnt/proc /mnt/dev /mnt/sys diff --git a/nixos/modules/virtualisation/virtualbox-image.nix b/nixos/modules/virtualisation/virtualbox-image.nix index 2d3b4834fc5..425726333c4 100644 --- a/nixos/modules/virtualisation/virtualbox-image.nix +++ b/nixos/modules/virtualisation/virtualbox-image.nix @@ -11,93 +11,37 @@ in { options = { virtualbox = { baseImageSize = mkOption { - type = types.str; - default = "10G"; + type = types.int; + default = 10 * 1024; description = '' - The size of the VirtualBox base image. The size string should be on - a format the qemu-img command accepts. + The size of the VirtualBox base image in MiB. ''; }; }; }; config = { - system.build.virtualBoxImage = - pkgs.vmTools.runInLinuxVM ( - pkgs.runCommand "virtualbox-image" - { memSize = 768; - preVM = - '' - mkdir $out - diskImage=$out/image - ${pkgs.vmTools.qemu}/bin/qemu-img create -f raw $diskImage "${cfg.baseImageSize}" - mv closure xchg/ - ''; - postVM = - '' - echo "creating VirtualBox disk image..." - ${pkgs.vmTools.qemu}/bin/qemu-img convert -f raw -O vdi $diskImage $out/disk.vdi - rm $diskImage - ''; - buildInputs = [ pkgs.utillinux pkgs.perl ]; - exportReferencesGraph = - [ "closure" config.system.build.toplevel ]; + + system.build.virtualBoxImage = import ../../lib/make-disk-image.nix { + inherit pkgs lib config; + partitioned = true; + diskSize = cfg.baseImageSize; + + configFile = pkgs.writeText "configuration.nix" + '' + { + imports = [ ]; } - '' - # Create a single / partition. - ${pkgs.parted}/sbin/parted /dev/vda mklabel msdos - ${pkgs.parted}/sbin/parted /dev/vda -- mkpart primary ext2 1M -1s - . /sys/class/block/vda1/uevent - mknod /dev/vda1 b $MAJOR $MINOR - - # Create an empty filesystem and mount it. - ${pkgs.e2fsprogs}/sbin/mkfs.ext4 -L nixos /dev/vda1 - ${pkgs.e2fsprogs}/sbin/tune2fs -c 0 -i 0 /dev/vda1 - mkdir /mnt - mount /dev/vda1 /mnt - - # The initrd expects these directories to exist. - mkdir /mnt/dev /mnt/proc /mnt/sys - mount --bind /proc /mnt/proc - mount --bind /dev /mnt/dev - mount --bind /sys /mnt/sys - - # Copy all paths in the closure to the filesystem. - storePaths=$(perl ${pkgs.pathsFromGraph} /tmp/xchg/closure) - - echo "filling Nix store..." - mkdir -p /mnt/nix/store - set -f - cp -prd $storePaths /mnt/nix/store/ - - mkdir -p /mnt/etc/nix - echo 'build-users-group = ' > /mnt/etc/nix/nix.conf - - # Register the paths in the Nix database. - printRegistration=1 perl ${pkgs.pathsFromGraph} /tmp/xchg/closure | \ - chroot /mnt ${config.nix.package}/bin/nix-store --load-db - - # Create the system profile to allow nixos-rebuild to work. - chroot /mnt ${config.nix.package}/bin/nix-env \ - -p /nix/var/nix/profiles/system --set ${config.system.build.toplevel} - - # `nixos-rebuild' requires an /etc/NIXOS. - mkdir -p /mnt/etc/nixos - touch /mnt/etc/NIXOS - - # `switch-to-configuration' requires a /bin/sh - mkdir -p /mnt/bin - ln -s ${config.system.build.binsh}/bin/sh /mnt/bin/sh - - # Generate the GRUB menu. - ln -s vda /dev/sda - chroot /mnt ${config.system.build.toplevel}/bin/switch-to-configuration boot - - umount /mnt/proc /mnt/dev /mnt/sys - umount /mnt - '' - ); - + ''; + + postVM = + '' + echo "creating VirtualBox disk image..." + ${pkgs.vmTools.qemu}/bin/qemu-img convert -f raw -O vdi $diskImage $out/disk.vdi + rm $diskImage + ''; + }; + system.build.virtualBoxOVA = pkgs.runCommand "virtualbox-ova" { buildInputs = [ pkgs.linuxPackages.virtualbox ]; vmName = "NixOS ${config.system.nixosVersion} (${pkgs.stdenv.system})"; @@ -118,17 +62,17 @@ in { VBoxManage storagectl "$vmName" --name SATA --add sata --portcount 4 --bootable on --hostiocache on VBoxManage storageattach "$vmName" --storagectl SATA --port 0 --device 0 --type hdd \ --medium ${config.system.build.virtualBoxImage}/disk.vdi - + echo "exporting VirtualBox VM..." mkdir -p $out VBoxManage export "$vmName" --output "$out/$fileName" ''; - + fileSystems."/".device = "/dev/disk/by-label/nixos"; - - boot.loader.grub.version = 2; + boot.loader.grub.device = "/dev/sda"; - + virtualisation.virtualbox.guest.enable = true; + }; }