grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / virtualisation / lxc.nix
blobd1f4852cec64d82f68caa14dcd792d145d4eb5cc
1 # LXC Configuration
3 { config, lib, pkgs, ... }:
5 let
6   cfg = config.virtualisation.lxc;
7 in
10   meta = {
11     maintainers = lib.teams.lxc.members;
12   };
14   options.virtualisation.lxc = {
15     enable =
16       lib.mkOption {
17         type = lib.types.bool;
18         default = false;
19         description = ''
20             This enables Linux Containers (LXC), which provides tools
21             for creating and managing system or application containers
22             on Linux.
23           '';
24       };
26     unprivilegedContainers = lib.mkEnableOption "support for unprivileged users to launch containers";
28     systemConfig =
29       lib.mkOption {
30         type = lib.types.lines;
31         default = "";
32         description = ''
33             This is the system-wide LXC config. See
34             {manpage}`lxc.system.conf(5)`.
35           '';
36       };
37     package = lib.mkPackageOption pkgs "lxc" { };
39     defaultConfig =
40       lib.mkOption {
41         type = lib.types.lines;
42         default = "";
43         description = ''
44             Default config (default.conf) for new containers, i.e. for
45             network config. See {manpage}`lxc.container.conf(5)`.
46           '';
47       };
49     usernetConfig =
50       lib.mkOption {
51         type = lib.types.lines;
52         default = "";
53         description = ''
54             This is the config file for managing unprivileged user network
55             administration access in LXC. See {manpage}`lxc-usernet(5)`.
56           '';
57       };
59       bridgeConfig =
60         lib.mkOption {
61           type = lib.types.lines;
62           default = "";
63           description = ''
64               This is the config file for override lxc-net bridge default settings.
65             '';
66         };
67   };
69   ###### implementation
71   config = lib.mkIf cfg.enable {
72     environment.systemPackages = [ cfg.package ];
73     environment.etc."lxc/lxc.conf".text = cfg.systemConfig;
74     environment.etc."lxc/lxc-usernet".text = cfg.usernetConfig;
75     environment.etc."lxc/default.conf".text = cfg.defaultConfig;
76     environment.etc."lxc/lxc-net".text = cfg.bridgeConfig;
77     environment.pathsToLink = [ "/share/lxc" ];
78     systemd.tmpfiles.rules = [ "d /var/lib/lxc/rootfs 0755 root root -" ];
80     security.apparmor.packages = [ cfg.package ];
81     security.apparmor.policies = {
82       "bin.lxc-start".profile = ''
83         include ${cfg.package}/etc/apparmor.d/usr.bin.lxc-start
84       '';
85       "lxc-containers".profile = ''
86         include ${cfg.package}/etc/apparmor.d/lxc-containers
87       '';
88     };
90     # We don't need the `lxc-user` group, unless the unprivileged containers are enabled.
91     users.groups = lib.mkIf cfg.unprivilegedContainers { lxc-user = {}; };
93     # `lxc-user-nic` needs suid to attach to bridge for unpriv containers.
94     security.wrappers = lib.mkIf cfg.unprivilegedContainers {
95       lxcUserNet = {
96         source = "${pkgs.lxc}/libexec/lxc/lxc-user-nic";
97         setuid = true;
98         owner = "root";
99         group = "lxc-user";
100         program = "lxc-user-nic";
101         permissions = "u+rx,g+x,o-rx";
102       };
103     };
105     # Add lxc-net service if unpriv mode is enabled.
106     systemd.packages = lib.mkIf cfg.unprivilegedContainers [ pkgs.lxc ];
107     systemd.services = lib.mkIf cfg.unprivilegedContainers {
108       lxc-net = {
109         enable = true;
110         wantedBy = [ "multi-user.target" ];
111         path = [ pkgs.iproute2 pkgs.iptables pkgs.getent pkgs.dnsmasq ];
112       };
113     };
114   };