vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / virtualisation / lxd-agent.nix
blob4bcec117aba97d4129620904c118ae2c5681a7ab
1 { config, lib, pkgs, ... }:
3 let
4   cfg = config.virtualisation.lxd.agent;
6   # the lxd agent is provided by the lxd daemon through a virtiofs or 9p mount
7   # this is a port of the distrobuilder lxd-agent generator
8   # https://github.com/lxc/distrobuilder/blob/f77300bf7d7d5707b08eaf8a434d647d1ba81b5d/generators/lxd-agent.go#L18-L55
9   preStartScript = ''
10     PREFIX="/run/lxd_agent"
12     mount_virtiofs() {
13         mount -t virtiofs config "$PREFIX/.mnt" >/dev/null 2>&1
14     }
16     mount_9p() {
17         modprobe 9pnet_virtio >/dev/null 2>&1 || true
18         mount -t 9p config "$PREFIX/.mnt" -o access=0,trans=virtio,size=1048576 >/dev/null 2>&1
19     }
21     fail() {
22         umount -l "$PREFIX" >/dev/null 2>&1 || true
23         rmdir "$PREFIX" >/dev/null 2>&1 || true
24         echo "$1"
25         exit 1
26     }
28     # Setup the mount target.
29     umount -l "$PREFIX" >/dev/null 2>&1 || true
30     mkdir -p "$PREFIX"
31     mount -t tmpfs tmpfs "$PREFIX" -o mode=0700,size=50M
32     mkdir -p "$PREFIX/.mnt"
34     # Try virtiofs first.
35     mount_virtiofs || mount_9p || fail "Couldn't mount virtiofs or 9p, failing."
37     # Copy the data.
38     cp -Ra "$PREFIX/.mnt/"* "$PREFIX"
40     # Unmount the temporary mount.
41     umount "$PREFIX/.mnt"
42     rmdir "$PREFIX/.mnt"
44     # Fix up permissions.
45     chown -R root:root "$PREFIX"
46   '';
47 in {
48   options = {
49     virtualisation.lxd.agent.enable = lib.mkEnableOption "LXD agent";
50   };
52   config = lib.mkIf cfg.enable {
53     # https://github.com/lxc/distrobuilder/blob/f77300bf7d7d5707b08eaf8a434d647d1ba81b5d/generators/lxd-agent.go#L108-L125
54     systemd.services.lxd-agent = {
55       enable = true;
56       wantedBy = [ "multi-user.target" ];
57       before = [ "shutdown.target" ] ++ lib.optionals config.services.cloud-init.enable [
58         "cloud-init.target" "cloud-init.service" "cloud-init-local.service"
59       ];
60       conflicts = [ "shutdown.target" ];
61       path = [
62         pkgs.kmod
63         pkgs.util-linux
65         # allow `incus exec` to find system binaries
66         "/run/current-system/sw"
67       ];
69       preStart = preStartScript;
71       # avoid killing nixos-rebuild switch when executed through lxc exec
72       restartIfChanged = false;
73       stopIfChanged = false;
75       unitConfig = {
76         Description = "LXD - agent";
77         Documentation = "https://documentation.ubuntu.com/lxd/en/latest";
78         ConditionPathExists = "/dev/virtio-ports/org.linuxcontainers.lxd";
79         DefaultDependencies = "no";
80         StartLimitInterval = "60";
81         StartLimitBurst = "10";
82       };
84       serviceConfig = {
85         Type = "notify";
86         WorkingDirectory = "-/run/lxd_agent";
87         ExecStart = "/run/lxd_agent/lxd-agent";
88         Restart = "on-failure";
89         RestartSec = "5s";
90       };
91     };
93     systemd.paths.lxd-agent = {
94       enable = true;
95       wantedBy = [ "multi-user.target" ];
96       pathConfig.PathExists = "/dev/virtio-ports/org.linuxcontainers.lxd";
97     };
98   };