portfolio: 0.71.2 -> 0.72.2 (#360387)
[NixPkgs.git] / nixos / modules / services / network-filesystems / nfsd.nix
blob67597d37813fe7cfba5f2f6397b66784553cf2ac
1 { config, lib, pkgs, ... }:
2 let
4   cfg = config.services.nfs.server;
6   exports = pkgs.writeText "exports" cfg.exports;
8 in
11   imports = [
12     (lib.mkRenamedOptionModule [ "services" "nfs" "lockdPort" ] [ "services" "nfs" "server" "lockdPort" ])
13     (lib.mkRenamedOptionModule [ "services" "nfs" "statdPort" ] [ "services" "nfs" "server" "statdPort" ])
14   ];
16   ###### interface
18   options = {
20     services.nfs = {
22       server = {
23         enable = lib.mkOption {
24           type = lib.types.bool;
25           default = false;
26           description = ''
27             Whether to enable the kernel's NFS server.
28           '';
29         };
31         extraNfsdConfig = lib.mkOption {
32           type = lib.types.str;
33           default = "";
34           description = ''
35             Extra configuration options for the [nfsd] section of /etc/nfs.conf.
36           '';
37         };
39         exports = lib.mkOption {
40           type = lib.types.lines;
41           default = "";
42           description = ''
43             Contents of the /etc/exports file.  See
44             {manpage}`exports(5)` for the format.
45           '';
46         };
48         hostName = lib.mkOption {
49           type = lib.types.nullOr lib.types.str;
50           default = null;
51           description = ''
52             Hostname or address on which NFS requests will be accepted.
53             Default is all.  See the {option}`-H` option in
54             {manpage}`nfsd(8)`.
55           '';
56         };
58         nproc = lib.mkOption {
59           type = lib.types.int;
60           default = 8;
61           description = ''
62             Number of NFS server threads.  Defaults to the recommended value of 8.
63           '';
64         };
66         createMountPoints = lib.mkOption {
67           type = lib.types.bool;
68           default = false;
69           description = "Whether to create the mount points in the exports file at startup time.";
70         };
72         mountdPort = lib.mkOption {
73           type = lib.types.nullOr lib.types.int;
74           default = null;
75           example = 4002;
76           description = ''
77             Use fixed port for rpc.mountd, useful if server is behind firewall.
78           '';
79         };
81         lockdPort = lib.mkOption {
82           type = lib.types.nullOr lib.types.int;
83           default = null;
84           example = 4001;
85           description = ''
86             Use a fixed port for the NFS lock manager kernel module
87             (`lockd/nlockmgr`).  This is useful if the
88             NFS server is behind a firewall.
89           '';
90         };
92         statdPort = lib.mkOption {
93           type = lib.types.nullOr lib.types.int;
94           default = null;
95           example = 4000;
96           description = ''
97             Use a fixed port for {command}`rpc.statd`. This is
98             useful if the NFS server is behind a firewall.
99           '';
100         };
102       };
104     };
106   };
109   ###### implementation
111   config = lib.mkIf cfg.enable {
113     services.rpcbind.enable = true;
115     boot.supportedFilesystems = [ "nfs" ]; # needed for statd and idmapd
117     environment.etc.exports.source = exports;
119     systemd.services.nfs-server =
120       { enable = true;
121         wantedBy = [ "multi-user.target" ];
123         preStart =
124           ''
125             mkdir -p /var/lib/nfs/v4recovery
126           '';
127       };
129     systemd.services.nfs-mountd =
130       { enable = true;
131         restartTriggers = [ exports ];
133         preStart =
134           ''
135             mkdir -p /var/lib/nfs
137             ${lib.optionalString cfg.createMountPoints
138               ''
139                 # create export directories:
140                 # skip comments, take first col which may either be a quoted
141                 # "foo bar" or just foo (-> man export)
142                 sed '/^#.*/d;s/^"\([^"]*\)".*/\1/;t;s/[ ].*//' ${exports} \
143                 | xargs -d '\n' mkdir -p
144               ''
145             }
146           '';
147       };
149   };