Skip to content

Commit

Permalink
makeDarwinImage: allow not starting the macOS VM automatically
Browse files Browse the repository at this point in the history
On my laptop I want to just start the VM when I need it to conserve battery.
  • Loading branch information
Luflosi committed Feb 27, 2024
1 parent 62ba30e commit 1637090
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 5 deletions.
36 changes: 32 additions & 4 deletions makeDarwinImage/module.nix
Original file line number Diff line number Diff line change
Expand Up @@ -97,31 +97,59 @@ in
Whether to open the sshPort and vncDisplayNumber on the networking.firewall
'';
};
startWhenNeeded = lib.mkOption {
type = lib.types.bool;
default = true;
description = lib.mdDoc ''
If set, the VM is socket-activated; that is,
instead of having it permanently running as a daemon,
systemd will start it on the first incoming VNC or SSH connection.
'';
};
};
config = let
vncPort = 5900 + cfg.vncDisplayNumber;
run-macos = cfg.package.makeRunScript {
diskImage = cfg.package;
extraQemuFlags = [ "-vnc ${cfg.vncListenAddr}:${toString cfg.vncDisplayNumber}" ] ++ cfg.extraQemuFlags;
extraQemuFlags = [
"-add-fd fd=3,set=2,opaque='vnc socket' "
#-add-fd fd=4,set=2,opaque="rdonly:/path/to/file" \
# -drive file=/dev/fdset/2,index=0,media=disk
"-vnc unix:/dev/fdset/2"
] ++ cfg.extraQemuFlags;
inherit (cfg) threads cores sockets mem sshListenAddr sshPort;
};
in lib.mkIf cfg.enable {
networking.firewall.allowedTCPPorts = lib.optionals cfg.openFirewall [ (5900 + cfg.vncDisplayNumber) cfg.sshPort ];
networking.firewall.allowedTCPPorts = lib.optionals cfg.openFirewall [ vncPort cfg.sshPort ];
systemd = {
services.macos-ventura = {
preStart = lib.optionalString cfg.stateless ''
rm -f *.qcow2
'';
description = "macOS Ventura";
wantedBy = [ "multi-user.target" ];
wantedBy = lib.optionals (!cfg.startWhenNeeded) [ "multi-user.target" ];
serviceConfig = {
Type = "simple";
ExecStart = "${lib.getExe run-macos}";
Restart = "always";
Restart = "on-failure";
DynamicUser = true;
StateDirectory = baseNameOf cfg.dataDir;
WorkingDirectory = cfg.dataDir;
Sockets = [ "macos-ventura-vnc.socket" "macos-ventura-ssh.socket" ];
};
};
sockets.macos-ventura-vnc = {
description = "macOS Ventura VNC socket";
wantedBy = [ "sockets.target" ];
socketConfig.ListenStream = [ "${cfg.vncListenAddr}:${toString vncPort}" ];
socketConfig.Service = "macos-ventura.service";
};
/*sockets.macos-ventura-ssh = {
description = "macOS Ventura SSH socket";
wantedBy = [ "sockets.target" ];
socketConfig.ListenStream = [ "${cfg.sshListenAddr}:${toString cfg.sshPort}" ];
socketConfig.Service = "macos-ventura.service";
};*/
};
};
}
Expand Down
2 changes: 1 addition & 1 deletion makeDarwinImage/run.nix
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ writeShellScriptBin "run-macOS.sh" ''
-device ich9-intel-hda -device hda-duplex
-drive id=OpenCoreBoot,if=virtio,snapshot=on,readonly=on,format=qcow2,file="${OpenCoreBoot}"
-drive id=MacHDD,if=virtio,file="macos-ventura.qcow2",format=qcow2
-netdev user,id=net0,hostfwd=tcp:${sshListenAddr}:${toString sshPort}-:22 -device virtio-net-pci,netdev=net0,id=net0,mac=52:54:00:c9:18:27
-netdev user,id=net0,hostfwd=tcp::2224-:22 -device virtio-net-pci,netdev=net0,id=net0,mac=52:54:00:c9:18:27
#-monitor stdio
-device virtio-vga
${lib.concatStringsSep " " extraQemuFlags}
Expand Down

0 comments on commit 1637090

Please sign in to comment.