about summary refs log tree commit diff
path: root/pkgs/build-support
diff options
context:
space:
mode:
authoraszlig <aszlig@redmoonstudios.org>2014-02-16 03:19:40 +0100
committeraszlig <aszlig@redmoonstudios.org>2014-02-26 04:51:58 +0100
commitfedf13e6cfb94bad00df71aba66f0b6fea233e0f (patch)
tree33268592fc66e02304b44f93c213e6e6356d6663 /pkgs/build-support
parent0ce1fd07fe7e59115af60dd33a9e668cbb1ebd4c (diff)
downloadnixlib-fedf13e6cfb94bad00df71aba66f0b6fea233e0f.tar
nixlib-fedf13e6cfb94bad00df71aba66f0b6fea233e0f.tar.gz
nixlib-fedf13e6cfb94bad00df71aba66f0b6fea233e0f.tar.bz2
nixlib-fedf13e6cfb94bad00df71aba66f0b6fea233e0f.tar.lz
nixlib-fedf13e6cfb94bad00df71aba66f0b6fea233e0f.tar.xz
nixlib-fedf13e6cfb94bad00df71aba66f0b6fea233e0f.tar.zst
nixlib-fedf13e6cfb94bad00df71aba66f0b6fea233e0f.zip
vm/windows: Implement and use "xchg" share.
This now finally introduces our xchg share and also uses it for
exchanging state while suspending a VM. However, accessing the _real_
Nix store still isn't possible because we're shadowing the directory in
the initrd.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Diffstat (limited to 'pkgs/build-support')
-rw-r--r--pkgs/build-support/vm/windows/controller/default.nix30
-rw-r--r--pkgs/build-support/vm/windows/default.nix3
2 files changed, 28 insertions, 5 deletions
diff --git a/pkgs/build-support/vm/windows/controller/default.nix b/pkgs/build-support/vm/windows/controller/default.nix
index 6abf87f82c87..da3be51c1026 100644
--- a/pkgs/build-support/vm/windows/controller/default.nix
+++ b/pkgs/build-support/vm/windows/controller/default.nix
@@ -36,7 +36,7 @@ let
     ifconfig lo up
     ifconfig eth0 up 192.168.0.2
 
-    mkdir -p /nix/store /etc /var/run /var/log
+    mkdir -p /xchg /nix/store /etc /var/run /var/log
 
     cat > /etc/passwd <<PASSWD
     root:x:0:0::/root:/bin/false
@@ -45,6 +45,10 @@ let
 
     mount -t 9p \
       -o trans=virtio,version=9p2000.L,msize=262144,cache=loose \
+      xchg /xchg
+
+    mount -t 9p \
+      -o trans=virtio,version=9p2000.L,msize=262144,cache=loose \
       store /nix/store
 
     exec "$command"
@@ -59,6 +63,8 @@ let
 
   shellEscape = x: "'${lib.replaceChars ["'"] [("'\\'" + "'")] x}'";
 
+  loopForever = "while :; do ${coreutils}/bin/sleep 1; done";
+
   initScript = writeScript "init.sh" (''
     #!${stdenv.shell}
     ${coreutils}/bin/mkdir -p /etc/samba /etc/samba/private /var/lib/samba
@@ -77,6 +83,11 @@ let
     path = /nix/store
     read only = no
     guest ok = yes
+
+    [xchg]
+    path = /xchg
+    read only = no
+    guest ok = yes
     CONFIG
 
     ${samba}/sbin/nmbd -D
@@ -92,7 +103,7 @@ let
     done
     echo " success."
     # Loop forever, because this VM is going to be killed.
-    while :; do ${coreutils}/bin/sleep 1; done
+    ${loopForever}
   '' else ''
     echo -n "Waiting for Windows VM to become available..."
     while ! ${netcat}/bin/netcat -z 192.168.0.1 22; do
@@ -108,6 +119,10 @@ let
       -l Administrator \
       192.168.0.1 -- ${shellEscape command}
 
+    ${lib.optionalString (suspendTo != null) ''
+    ${coreutils}/bin/touch /xchg/suspend_now
+    ${loopForever}
+    ''}
     ${busybox}/sbin/poweroff -f
   ''));
 
@@ -123,6 +138,7 @@ let
     "-nographic"
     "-no-reboot"
     "-virtfs local,path=/nix/store,security_model=none,mount_tag=store"
+    "-virtfs local,path=$XCHG_DIR,security_model=none,mount_tag=xchg"
     "-kernel ${modulesClosure.kernel}/bzImage"
     "-initrd ${initrd}/initrd"
     "-append \"${kernelAppend}\""
@@ -147,6 +163,7 @@ let
   });
 
   preVM = ''
+    XCHG_DIR="$(${coreutils}/bin/mktemp -d nix-vm.XXXXXXXXXX --tmpdir)"
     QEMU_VDE_SOCKET="$(pwd)/vde.ctl"
     MONITOR_SOCKET="$(pwd)/monitor"
     ${vde2}/bin/vde_switch -s "$QEMU_VDE_SOCKET" &
@@ -154,20 +171,23 @@ let
       UNIX-CONNECT:$QEMU_VDE_SOCKET/ctl,retry=20
   '';
 
+  bgBoth = lib.optionalString (suspendTo != null) " &";
+
   vmExec = if installMode then ''
     ${vmTools.qemuProg} ${controllerQemuArgs} &
-    ${vmTools.qemuProg} ${cygwinQemuArgs}
+    ${vmTools.qemuProg} ${cygwinQemuArgs}${bgBoth}
   '' else ''
     ${vmTools.qemuProg} ${cygwinQemuArgs} &
-    ${vmTools.qemuProg} ${controllerQemuArgs}
+    ${vmTools.qemuProg} ${controllerQemuArgs}${bgBoth}
   '' + lib.optionalString (suspendTo != null) ''
+    while ! test -e "$XCHG_DIR/suspend_now"; do sleep 1; done
     ${socat}/bin/socat - UNIX-CONNECT:$MONITOR_SOCKET <<CMD
     stop
     migrate_set_speed 4095m
     migrate "exec:${gzip}/bin/gzip -c > '${suspendTo}'"
     quit
     CMD
-    wait %%
+    wait %-
   '';
 
 in writeScript "run-cygwin-vm.sh" ''
diff --git a/pkgs/build-support/vm/windows/default.nix b/pkgs/build-support/vm/windows/default.nix
index b7c18f6d16c5..89acb9a2d689 100644
--- a/pkgs/build-support/vm/windows/default.nix
+++ b/pkgs/build-support/vm/windows/default.nix
@@ -21,8 +21,11 @@ let
       "set -e"
       "net config server /autodisconnect:-1"
       "net use S: '\\\\192.168.0.2\\nixstore' /persistent:yes"
+      "net use X: '\\\\192.168.0.2\\xchg' /persistent:yes"
       "mkdir -p /nix/store"
       "mount -o bind /cygdrive/s /nix/store"
+      "mkdir -p /tmp/xchg"
+      "mount -o bind /cygdrive/x /tmp/xchg"
     ];
     suspendTo = "state.gz";
   };