forked from mirrors/nixpkgs
97dc8a88e5
This ensures that the intermediate machine is shut down only after the migration has finished writing the memory dump to disk, to ensure we don't end up with empty state files depending on how fast the migration finished before we actually shut down the VM. Signed-off-by: aszlig <aszlig@redmoonstudios.org>
50 lines
1.3 KiB
Nix
50 lines
1.3 KiB
Nix
pkgs:
|
|
|
|
let
|
|
bootstrapper = import ./bootstrap.nix {
|
|
inherit (pkgs) stdenv vmTools writeScript writeText runCommand makeInitrd;
|
|
inherit (pkgs) coreutils dosfstools gzip mtools netcat openssh qemu samba;
|
|
inherit (pkgs) socat vde2 fetchurl python perl cdrkit pathsFromGraph;
|
|
inherit (pkgs) gnugrep;
|
|
};
|
|
|
|
builder = ''
|
|
source /tmp/xchg/saved-env 2> /dev/null || true
|
|
export NIX_STORE=/nix/store
|
|
export NIX_BUILD_TOP=/tmp
|
|
export TMPDIR=/tmp
|
|
export PATH=/empty
|
|
cd "$NIX_BUILD_TOP"
|
|
exec $origBuilder $origArgs
|
|
'';
|
|
|
|
in {
|
|
runInWindowsVM = drv: let
|
|
newDrv = drv.override {
|
|
stdenv = drv.stdenv.override {
|
|
shell = "/bin/sh";
|
|
};
|
|
};
|
|
in pkgs.lib.overrideDerivation drv (attrs: let
|
|
bootstrap = bootstrapper attrs.windowsImage;
|
|
in {
|
|
requiredSystemFeatures = [ "kvm" ];
|
|
builder = "${pkgs.stdenv.shell}";
|
|
args = ["-e" (bootstrap.resumeAndRun builder)];
|
|
windowsImage = bootstrap.suspendedVM;
|
|
origArgs = attrs.args;
|
|
origBuilder = if attrs.builder == attrs.stdenv.shell
|
|
then "/bin/sh"
|
|
else attrs.builder;
|
|
|
|
postHook = ''
|
|
PATH=/usr/bin:/bin:/usr/sbin:/sbin
|
|
SHELL=/bin/sh
|
|
eval "$origPostHook"
|
|
'';
|
|
|
|
origPostHook = attrs.postHook or "";
|
|
fixupPhase = ":";
|
|
});
|
|
}
|