1{ lib, pkgs, ... }:
2{
3 name = "systemd-initrd-vconsole";
4
5 nodes.machine =
6 { pkgs, ... }:
7 {
8 boot.kernelParams = lib.mkAfter [
9 "rd.systemd.unit=rescue.target"
10 "loglevel=3"
11 "udev.log_level=3"
12 "systemd.log_level=warning"
13 ];
14
15 boot.initrd.systemd = {
16 enable = true;
17 emergencyAccess = true;
18 };
19
20 console = {
21 earlySetup = true;
22 keyMap = "colemak";
23 };
24 };
25
26 testScript = ''
27 # Boot into rescue shell in initrd
28 machine.start()
29 machine.wait_for_console_text("Press Enter for maintenance")
30 machine.send_console("\n")
31
32 # Wait for shell to become ready
33 for _ in range(300):
34 machine.send_console("printf '%s to receive commands:\\n' Ready\n")
35 try:
36 machine.wait_for_console_text("Ready to receive commands:", timeout=1)
37 break
38 except Exception:
39 continue
40 else:
41 raise RuntimeError("Rescue shell never became ready")
42
43 # Check keymap
44 machine.send_console("(printf '%s to receive text:\\n' Ready && read text && echo \"$text\") </dev/tty1\n")
45 machine.wait_for_console_text("Ready to receive text:")
46 for key in "asdfjkl;\n":
47 machine.send_key(key)
48 machine.wait_for_console_text("arstneio")
49 '';
50}