From d8e66722a3c5e1fceb36ef956062efdbf5f55d20 Mon Sep 17 00:00:00 2001 From: aszlig Date: Mon, 17 Feb 2014 02:10:00 +0100 Subject: vm/windows: Factor out bootstrapping process. This now isolates the vmTools integration from the bootstrap process and thus removes our fixed Windows ISO and product key. The latter can now be provided by an attribute "windowsImage" to runInWindowsVM. Signed-off-by: aszlig --- pkgs/build-support/vm/windows/bootstrap.nix | 61 ++++++++++++++++++++++++++ pkgs/build-support/vm/windows/default.nix | 68 +++-------------------------- 2 files changed, 67 insertions(+), 62 deletions(-) create mode 100644 pkgs/build-support/vm/windows/bootstrap.nix (limited to 'pkgs/build-support') diff --git a/pkgs/build-support/vm/windows/bootstrap.nix b/pkgs/build-support/vm/windows/bootstrap.nix new file mode 100644 index 000000000000..26aa6c7a6861 --- /dev/null +++ b/pkgs/build-support/vm/windows/bootstrap.nix @@ -0,0 +1,61 @@ +{ isoFile, productKey }: + +let + inherit (import {}) lib stdenv qemu; +in rec { + installedVM = import ./install { + inherit isoFile productKey; + }; + + runInVM = img: attrs: import ./controller (attrs // { + inherit (installedVM) sshKey; + qemuArgs = attrs.qemuArgs or [] ++ [ + "-boot order=c" + "-drive file=${img},index=0,media=disk" + ]; + }); + + runAndSuspend = let + drives = { + s = { + source = "nixstore"; + target = "/nix/store"; + }; + x = { + source = "xchg"; + target = "/tmp/xchg"; + }; + }; + + genDriveCmds = letter: { source, target }: [ + "net use ${letter}: '\\\\192.168.0.2\\${source}' /persistent:yes" + "mkdir -p '${target}'" + "mount -o bind '/cygdrive/${letter}' '${target}'" + "echo '/cygdrive/${letter} ${target} none bind 0 0' >> /etc/fstab" + ]; + in runInVM "winvm.img" { + command = lib.concatStringsSep " && " ([ + "net config server /autodisconnect:-1" + ] ++ lib.concatLists (lib.mapAttrsToList genDriveCmds drives)); + suspendTo = "state.gz"; + }; + + suspendedVM = stdenv.mkDerivation { + name = "cygwin-suspended-vm"; + buildCommand = '' + ${qemu}/bin/qemu-img create \ + -b "${installedVM}/disk.img" \ + -f qcow2 winvm.img + ${runAndSuspend} + ensureDir "$out" + cp winvm.img "$out/disk.img" + cp state.gz "$out/state.gz" + ''; + }; + + resumeAndRun = command: runInVM "${suspendedVM}/disk.img" { + resumeFrom = "${suspendedVM}/state.gz"; + qemuArgs = lib.singleton "-snapshot"; + inherit command; + }; +} diff --git a/pkgs/build-support/vm/windows/default.nix b/pkgs/build-support/vm/windows/default.nix index 9d870633ff17..8e8809f370f0 100644 --- a/pkgs/build-support/vm/windows/default.nix +++ b/pkgs/build-support/vm/windows/default.nix @@ -1,64 +1,5 @@ let - inherit (import {}) lib stdenv requireFile writeText qemu; - - winISO = /path/to/iso/XXX; - - installedVM = import ./install { - isoFile = winISO; - productKey = "XXX"; - }; - - runInVM = img: attrs: import ./controller (attrs // { - inherit (installedVM) sshKey; - qemuArgs = attrs.qemuArgs or [] ++ [ - "-boot order=c" - "-drive file=${img},index=0,media=disk" - ]; - }); - - runAndSuspend = let - drives = { - s = { - source = "nixstore"; - target = "/nix/store"; - }; - x = { - source = "xchg"; - target = "/tmp/xchg"; - }; - }; - - genDriveCmds = letter: { source, target }: [ - "net use ${letter}: '\\\\192.168.0.2\\${source}' /persistent:yes" - "mkdir -p '${target}'" - "mount -o bind '/cygdrive/${letter}' '${target}'" - "echo '/cygdrive/${letter} ${target} none bind 0 0' >> /etc/fstab" - ]; - in runInVM "winvm.img" { - command = lib.concatStringsSep " && " ([ - "net config server /autodisconnect:-1" - ] ++ lib.concatLists (lib.mapAttrsToList genDriveCmds drives)); - suspendTo = "state.gz"; - }; - - suspendedVM = stdenv.mkDerivation { - name = "cygwin-suspended-vm"; - buildCommand = '' - ${qemu}/bin/qemu-img create \ - -b "${installedVM}/disk.img" \ - -f qcow2 winvm.img - ${runAndSuspend} - ensureDir "$out" - cp winvm.img "$out/disk.img" - cp state.gz "$out/state.gz" - ''; - }; - - resumeAndRun = command: runInVM "${suspendedVM}/disk.img" { - resumeFrom = "${suspendedVM}/state.gz"; - qemuArgs = lib.singleton "-snapshot"; - inherit command; - }; + inherit (import {}) lib stdenv; builder = '' source /tmp/xchg/saved-env 2> /dev/null || true @@ -77,10 +18,13 @@ in { shell = "/bin/sh"; }; }; - in lib.overrideDerivation drv (attrs: { + in lib.overrideDerivation drv (attrs: let + bootstrap = import ./bootstrap.nix attrs.windowsImage; + in { requiredSystemFeatures = [ "kvm" ]; buildur = "${stdenv.shell}"; - args = ["-e" (resumeAndRun builder)]; + args = ["-e" (bootstrap.resumeAndRun builder)]; + windowsImage = bootstrap.suspendedVM; origArgs = attrs.args; origBuilder = if attrs.builder == attrs.stdenv.shell then "/bin/sh" -- cgit 1.4.1