about summary refs log tree commit diff
path: root/pkgs/build-support/vm/windows/bootstrap.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/build-support/vm/windows/bootstrap.nix')
-rw-r--r--pkgs/build-support/vm/windows/bootstrap.nix61
1 files changed, 61 insertions, 0 deletions
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 <nixpkgs> {}) 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;
+  };
+}