diff options
author | Alexander Ried <ried@mytum.de> | 2016-10-08 16:10:56 +0200 |
---|---|---|
committer | Franz Pletz <fpletz@fnordicwalking.de> | 2016-10-08 16:10:56 +0200 |
commit | ce7739a4dd453679938755c939076eff3f153bba (patch) | |
tree | 1fa8a02f0c84352443b6910efd64a3085b89d452 /nixos/modules/system/boot/systemd-nspawn.nix | |
parent | e67e18a52b56acb24e391b6d490772d1b7ff9638 (diff) | |
download | nixlib-ce7739a4dd453679938755c939076eff3f153bba.tar nixlib-ce7739a4dd453679938755c939076eff3f153bba.tar.gz nixlib-ce7739a4dd453679938755c939076eff3f153bba.tar.bz2 nixlib-ce7739a4dd453679938755c939076eff3f153bba.tar.lz nixlib-ce7739a4dd453679938755c939076eff3f153bba.tar.xz nixlib-ce7739a4dd453679938755c939076eff3f153bba.tar.zst nixlib-ce7739a4dd453679938755c939076eff3f153bba.zip |
systemd.nspawn: add definition (#18320)
this adds the option to manage systemd.nspawn files via config.systemd.nspawn. The files are placed in "/etc/systemd/nspawn".
Diffstat (limited to 'nixos/modules/system/boot/systemd-nspawn.nix')
-rw-r--r-- | nixos/modules/system/boot/systemd-nspawn.nix | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/nixos/modules/system/boot/systemd-nspawn.nix b/nixos/modules/system/boot/systemd-nspawn.nix new file mode 100644 index 000000000000..2527ab35719b --- /dev/null +++ b/nixos/modules/system/boot/systemd-nspawn.nix @@ -0,0 +1,121 @@ +{ config, lib , pkgs, ...}: + +with lib; +with import ./systemd-unit-options.nix { inherit config lib; }; +with import ./systemd-lib.nix { inherit config lib pkgs; }; + +let + cfg = config.systemd.nspawn; + assertions = [ + # boot = true -> processtwo != true + ]; + + checkExec = checkUnitConfig "Exec" [ + (assertOnlyFields [ + "Boot" "ProcessTwo" "Parameters" "Environment" "User" "WorkingDirectory" + "Capability" "DropCapability" "KillSignal" "Personality" "MachineId" + "PrivateUsers" + ]) + (assertValueOneOf "Boot" boolValues) + (assertValueOneOf "ProcessTwo" boolValues) + (assertValueOneOf "PrivateUsers" (boolValues ++ [ "pick" ])) + ]; + + checkFiles = checkUnitConfig "Files" [ + (assertOnlyFields [ + "ReadOnly" "Volatile" "Bind" "BindReadOnly" "TemporaryFileSystems" + "PrivateUsersChown" + ]) + (assertValueOneOf "ReadOnly" boolValues) + (assertValueOneOf "Volatile" (boolValues ++ [ "state" ])) + (assertValueOneOf "PrivateUsersChown" boolValues) + ]; + + checkNetwork = checkUnitConfig "Network" [ + (assertOnlyFields [ + "Private" "VirtualEthernet" "VirtualEthernetExtra" "Interface" "MACVLAN" + "IPVLAN" "Bridge" "Zone" "Port" + ]) + (assertValueOneOf "Private" boolValues) + (assertValueOneOf "VirtualEthernet" boolValues) + ]; + + instanceOptions = { + + execConfig = mkOption { + default = {}; + example = { Parameters = "/bin/sh"; }; + type = types.addCheck (types.attrsOf unitOption) checkExec; + description = '' + Each attribute in this set specifies an option in the + <literal>[Exec]</literal> section of this unit. See + <citerefentry><refentrytitle>systemd.nspawn</refentrytitle> + <manvolnum>5</manvolnum></citerefentry> for details. + ''; + }; + + filesConfig = mkOption { + default = {}; + example = { Bind = [ "/home/alice" ]; }; + type = types.addCheck (types.attrsOf unitOption) checkFiles; + description = '' + Each attribute in this set specifies an option in the + <literal>[Files]</literal> section of this unit. See + <citerefentry><refentrytitle>systemd.nspawn</refentrytitle> + <manvolnum>5</manvolnum></citerefentry> for details. + ''; + }; + + networkConfig = mkOption { + default = {}; + example = { Private = false; }; + type = types.addCheck (types.attrsOf unitOption) checkNetwork; + description = '' + Each attribute in this set specifies an option in the + <literal>[Network]</literal> section of this unit. See + <citerefentry><refentrytitle>systemd.nspawn</refentrytitle> + <manvolnum>5</manvolnum></citerefentry> for details. + ''; + }; + + }; + + instanceToUnit = name: def: + { text = '' + [Exec] + ${attrsToSection def.execConfig} + + [Files] + ${attrsToSection def.filesConfig} + + [Network] + ${attrsToSection def.networkConfig} + ''; + }; + +in { + + options = { + + systemd.nspawn = mkOption { + default = {}; + type = types.attrsOf types.optionSet; + options = [ instanceOptions ]; + description = "Definition of systemd-nspawn configurations."; + }; + + }; + + config = + let + units = mapAttrs' (n: v: nameValuePair "${n}.nspawn" (instanceToUnit n v)) cfg.instances; + in mkIf (cfg != {}) { + + environment.etc."systemd/nspawn".source = generateUnits "nspawn" units [] []; + + systemd.services."systemd-nspawn@" = { + wantedBy = [ "machine.target" ]; + }; + }; + +} |