diff --git a/nixos/doc/manual/development/debugging-nixos-tests.xml b/nixos/doc/manual/development/debugging-nixos-tests.xml
new file mode 100644
index 00000000000..0adf1293f7a
--- /dev/null
+++ b/nixos/doc/manual/development/debugging-nixos-tests.xml
@@ -0,0 +1,36 @@
+
+ Debugging NixOS tests
+
+
+ Tests may fail and infrastructure offers access to inspect machine state.
+
+
+
+ To prevent test from stopping and cleaning up, insert a sleep command:
+
+
+
+$machine->succeed("sleep 84000");
+
+
+
+ As soon as machine starts run as root:
+
+
+
+nix-shell -p socat --run "socat STDIO,raw,echo=0,escape=0x11 UNIX:/tmp/nix-build-vm-test-run-*.drv-0/vm-state-machine/backdoor"
+
+
+
+ You may need to find the correct path, replacing /tmp, * or machine.
+
+
+
+ Press "enter" to open up console and login as "root". After you're done, press "ctrl-q" to exit the console.
+
+
+
diff --git a/nixos/doc/manual/development/nixos-tests.xml b/nixos/doc/manual/development/nixos-tests.xml
index 2695082e386..d068887200a 100644
--- a/nixos/doc/manual/development/nixos-tests.xml
+++ b/nixos/doc/manual/development/nixos-tests.xml
@@ -16,4 +16,5 @@ xlink:href="https://github.com/NixOS/nixpkgs/tree/master/nixos/tests">nixos/test
+
diff --git a/nixos/lib/test-driver/Machine.pm b/nixos/lib/test-driver/Machine.pm
index b18f48464ce..a00fe25c2b8 100644
--- a/nixos/lib/test-driver/Machine.pm
+++ b/nixos/lib/test-driver/Machine.pm
@@ -155,8 +155,10 @@ sub start {
$ENV{USE_TMPDIR} = 1;
$ENV{QEMU_OPTS} =
($self->{allowReboot} ? "" : "-no-reboot ") .
- "-monitor unix:./monitor -chardev socket,id=shell,path=./shell " .
- "-device virtio-serial -device virtconsole,chardev=shell " .
+ "-monitor unix:./monitor " .
+ "-chardev socket,id=shell,path=./shell -device virtio-serial -device virtconsole,chardev=shell " .
+ # socket backdoor, see "Debugging NixOS tests" section in NixOS manual
+ "-chardev socket,id=backdoor,path=./backdoor,server,nowait -device virtio-serial -device virtconsole,chardev=backdoor " .
"-device virtio-rng-pci " .
($showGraphics ? "-serial stdio" : "-nographic") . " " . ($ENV{QEMU_OPTS} || "");
chdir $self->{stateDir} or die;
diff --git a/nixos/modules/testing/test-instrumentation.nix b/nixos/modules/testing/test-instrumentation.nix
index ed4cfa7805e..aa0db4afd97 100644
--- a/nixos/modules/testing/test-instrumentation.nix
+++ b/nixos/modules/testing/test-instrumentation.nix
@@ -55,7 +55,8 @@ with import ../../lib/qemu-flags.nix { inherit pkgs; };
systemd.services."serial-getty@hvc0".enable = false;
# Only use a serial console, no TTY.
- virtualisation.qemu.consoles = [ qemuSerialDevice ];
+ # hvc1: socket backdoor, see "Debugging NixOS tests" section in NixOS manual
+ virtualisation.qemu.consoles = [ "hvc1" qemuSerialDevice ];
boot.initrd.preDeviceCommands =
''