Merge branch 'vbox-configurable-imgsize' of git://github.com/rickynils/nixpkgs

This commit is contained in:
Shea Levy 2014-08-04 13:20:13 -04:00
commit 8a35a474fe

View File

@ -2,112 +2,132 @@
with lib; with lib;
{ let
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 "10G"
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 ];
}
''
# 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. cfg = config.virtualbox;
${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. in {
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. options = {
storePaths=$(perl ${pkgs.pathsFromGraph} /tmp/xchg/closure) virtualbox = {
baseImageSize = mkOption {
type = types.str;
default = 10G;
description = ''
The size of the VirtualBox base image. The size string should be on
a format the qemu-img command accepts.
'';
};
};
};
echo "filling Nix store..." config = {
mkdir -p /mnt/nix/store system.build.virtualBoxImage =
set -f pkgs.vmTools.runInLinuxVM (
cp -prd $storePaths /mnt/nix/store/ pkgs.runCommand "virtualbox-image"
{ memSize = 768;
mkdir -p /mnt/etc/nix preVM =
echo 'build-users-group = ' > /mnt/etc/nix/nix.conf ''
mkdir $out
# Register the paths in the Nix database. diskImage=$out/image
printRegistration=1 perl ${pkgs.pathsFromGraph} /tmp/xchg/closure | \ ${pkgs.vmTools.qemu}/bin/qemu-img create -f raw $diskImage "${cfg.baseImageSize}"
chroot /mnt ${config.nix.package}/bin/nix-store --load-db mv closure xchg/
'';
# Create the system profile to allow nixos-rebuild to work. postVM =
chroot /mnt ${config.nix.package}/bin/nix-env \ ''
-p /nix/var/nix/profiles/system --set ${config.system.build.toplevel} echo "creating VirtualBox disk image..."
${pkgs.vmTools.qemu}/bin/qemu-img convert -f raw -O vdi $diskImage $out/disk.vdi
# `nixos-rebuild' requires an /etc/NIXOS. rm $diskImage
mkdir -p /mnt/etc/nixos '';
touch /mnt/etc/NIXOS buildInputs = [ pkgs.utillinux pkgs.perl ];
exportReferencesGraph =
# `switch-to-configuration' requires a /bin/sh [ "closure" config.system.build.toplevel ];
mkdir -p /mnt/bin }
ln -s ${config.system.build.binsh}/bin/sh /mnt/bin/sh ''
# Create a single / partition.
# Generate the GRUB menu. ${pkgs.parted}/sbin/parted /dev/vda mklabel msdos
ln -s vda /dev/sda ${pkgs.parted}/sbin/parted /dev/vda -- mkpart primary ext2 1M -1s
chroot /mnt ${config.system.build.toplevel}/bin/switch-to-configuration boot . /sys/class/block/vda1/uevent
mknod /dev/vda1 b $MAJOR $MINOR
umount /mnt/proc /mnt/dev /mnt/sys
umount /mnt # 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
system.build.virtualBoxOVA = pkgs.runCommand "virtualbox-ova" mount /dev/vda1 /mnt
{ buildInputs = [ pkgs.linuxPackages.virtualbox ];
vmName = "NixOS ${config.system.nixosVersion} (${pkgs.stdenv.system})"; # The initrd expects these directories to exist.
fileName = "nixos-${config.system.nixosVersion}-${pkgs.stdenv.system}.ova"; mkdir /mnt/dev /mnt/proc /mnt/sys
} mount --bind /proc /mnt/proc
'' mount --bind /dev /mnt/dev
echo "creating VirtualBox VM..." mount --bind /sys /mnt/sys
export HOME=$PWD
VBoxManage createvm --name "$vmName" --register \ # Copy all paths in the closure to the filesystem.
--ostype ${if pkgs.stdenv.system == "x86_64-linux" then "Linux26_64" else "Linux26"} storePaths=$(perl ${pkgs.pathsFromGraph} /tmp/xchg/closure)
VBoxManage modifyvm "$vmName" \
--memory 1536 --acpi on --vram 10 \ echo "filling Nix store..."
--nictype1 virtio --nic1 nat \ mkdir -p /mnt/nix/store
--audiocontroller ac97 --audio alsa \ set -f
--rtcuseutc on \ cp -prd $storePaths /mnt/nix/store/
--usb on --mouse usbtablet
VBoxManage storagectl "$vmName" --name SATA --add sata --portcount 4 --bootable on --hostiocache on mkdir -p /mnt/etc/nix
VBoxManage storageattach "$vmName" --storagectl SATA --port 0 --device 0 --type hdd \ echo 'build-users-group = ' > /mnt/etc/nix/nix.conf
--medium ${config.system.build.virtualBoxImage}/disk.vdi
# Register the paths in the Nix database.
echo "exporting VirtualBox VM..." printRegistration=1 perl ${pkgs.pathsFromGraph} /tmp/xchg/closure | \
mkdir -p $out chroot /mnt ${config.nix.package}/bin/nix-store --load-db
VBoxManage export "$vmName" --output "$out/$fileName"
''; # Create the system profile to allow nixos-rebuild to work.
chroot /mnt ${config.nix.package}/bin/nix-env \
fileSystems."/".device = "/dev/disk/by-label/nixos"; -p /nix/var/nix/profiles/system --set ${config.system.build.toplevel}
boot.loader.grub.version = 2; # `nixos-rebuild' requires an /etc/NIXOS.
boot.loader.grub.device = "/dev/sda"; mkdir -p /mnt/etc/nixos
touch /mnt/etc/NIXOS
services.virtualbox.enable = true;
# `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
''
);
system.build.virtualBoxOVA = pkgs.runCommand "virtualbox-ova"
{ buildInputs = [ pkgs.linuxPackages.virtualbox ];
vmName = "NixOS ${config.system.nixosVersion} (${pkgs.stdenv.system})";
fileName = "nixos-${config.system.nixosVersion}-${pkgs.stdenv.system}.ova";
}
''
echo "creating VirtualBox VM..."
export HOME=$PWD
VBoxManage createvm --name "$vmName" --register \
--ostype ${if pkgs.stdenv.system == "x86_64-linux" then "Linux26_64" else "Linux26"}
VBoxManage modifyvm "$vmName" \
--memory 1536 --acpi on --vram 10 \
--nictype1 virtio --nic1 nat \
--audiocontroller ac97 --audio alsa \
--rtcuseutc on \
--usb on --mouse usbtablet
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";
services.virtualbox.enable = true;
};
} }