diff --git a/modules/services.nix b/modules/services.nix index 76ca71c..521b21d 100644 --- a/modules/services.nix +++ b/modules/services.nix @@ -305,6 +305,9 @@ in rm -f /run/vmsilo/${vm.name}/crosvm-control.socket rm -f /run/vmsilo/${vm.name}/cloud-hypervisor-control.socket rm -f /run/vmsilo/${vm.name}/vsock.socket + ${lib.optionalString (vm.hypervisor == "cloud-hypervisor") '' + rm -f /run/vmsilo/${vm.name}/console + ''} ''; usbCleanup = pkgs.writeShellScript "usb-cleanup-${vm.name}" '' source ${cfg._internal.usbHelperLib} @@ -343,55 +346,29 @@ in } ) (lib.attrValues cfg.nixosVms) ++ - # Console relay services (one per VM) + # Console relay services (one per crosvm VM) # Bridges serial backend to a persistent PTY so users can attach/detach map ( vm: - let - isCh = vm.hypervisor == "cloud-hypervisor"; - # crosvm connects to a socket we listen on; cloud-hypervisor creates its own socket we connect to - chRelayScript = pkgs.writeShellScript "console-relay-${vm.name}" '' - # Wait for cloud-hypervisor to create the serial socket - ELAPSED=0 - while [ ! -S /run/vmsilo/${vm.name}/serial.socket ] && [ $ELAPSED -lt 120 ]; do - sleep 0.5 - ELAPSED=$((ELAPSED + 1)) - done - if [ ! -S /run/vmsilo/${vm.name}/serial.socket ]; then - echo "Timeout waiting for serial socket" >&2 - exit 1 - fi - exec ${pkgs.socat}/bin/socat UNIX-CONNECT:/run/vmsilo/${vm.name}/serial.socket PTY,link=/run/vmsilo/${vm.name}/console,raw,echo=0,user=${toString userUid},mode=0600 - ''; - in lib.nameValuePair "vmsilo-${vm.name}-console-relay" { description = "Console relay for VM ${vm.name}"; - after = if isCh then [ "vmsilo-${vm.name}-vm.service" ] else [ "vmsilo-${vm.name}-prep.service" ]; - before = lib.optionals (!isCh) [ "vmsilo-${vm.name}-vm.service" ]; - requiredBy = lib.optionals (!isCh) [ "vmsilo-${vm.name}-vm.service" ]; - wantedBy = lib.optionals isCh [ "vmsilo-${vm.name}-vm.service" ]; + after = [ "vmsilo-${vm.name}-prep.service" ]; + before = [ "vmsilo-${vm.name}-vm.service" ]; + requiredBy = [ "vmsilo-${vm.name}-vm.service" ]; bindsTo = [ "vmsilo-${vm.name}-vm.service" ]; serviceConfig = { Type = "simple"; - ExecStartPre = - lib.optionals (!isCh) [ - "-${pkgs.coreutils}/bin/rm -f /run/vmsilo/${vm.name}/console-backend.socket" - ] - ++ [ - "-${pkgs.coreutils}/bin/rm -f /run/vmsilo/${vm.name}/console" - ]; - ExecStart = - if isCh then - "${chRelayScript}" - else - # crosvm: listen for crosvm to connect - "${pkgs.socat}/bin/socat UNIX-LISTEN:/run/vmsilo/${vm.name}/console-backend.socket,fork,reuseaddr PTY,link=/run/vmsilo/${vm.name}/console,raw,echo=0,user=${toString userUid},mode=0600"; + ExecStartPre = [ + "-${pkgs.coreutils}/bin/rm -f /run/vmsilo/${vm.name}/console-backend.socket" + "-${pkgs.coreutils}/bin/rm -f /run/vmsilo/${vm.name}/console" + ]; + ExecStart = "${pkgs.socat}/bin/socat UNIX-LISTEN:/run/vmsilo/${vm.name}/console-backend.socket,fork,reuseaddr PTY,link=/run/vmsilo/${vm.name}/console,raw,echo=0,user=${toString userUid},mode=0600"; Restart = "on-failure"; RestartSec = "1s"; }; } - ) (lib.attrValues cfg.nixosVms) + ) (lib.filter (vm: vm.hypervisor == "crosvm") (lib.attrValues cfg.nixosVms)) ++ # virtiofsd services (one per shared directory per VM) lib.concatMap (