diff options
Diffstat (limited to 'pkgs/build-support/vm/windows/bootstrap.nix')
-rw-r--r-- | pkgs/build-support/vm/windows/bootstrap.nix | 61 |
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; + }; +} |