NFS: Difference between revisions
m Intro Sentence, Link, Category:Networking added (its not only a filesystem its a way to define networks too) |
Use nixos-generate-config instead of manually editing filesystems / explain more about why bind mount is needed |
||
| Line 8: | Line 8: | ||
=== Using bind mounts === | === Using bind mounts === | ||
When deploying NFS, it is considered best practice to bind mount directories to be shared to a "virtual root directory" (typically <code>/export</code>) as filesystems to be exported can be made available under a single directory. | |||
{{Note|This section demonstrates a best-practice NFS deployment using a virtual root directory (as in [https://wiki.gentoo.org/wiki/NFSv4 nfs-utils - Gentoo wiki]). Instead the directory can be directly exported as follows: | |||
{{file|/etc/nixos/configuration.nix|nix|<nowiki> | |||
{ | |||
services.nfs.server.enable = true; | |||
services.nfs.server.exports = '' | |||
/home 192.0.2.0/24(insecure,rw,sync,no_subtree_check) | |||
''; | |||
} | |||
</nowiki>}} | |||
}} | |||
Let's say that we've got one server-machine with 2 directories that we want to share: <code>/mnt/tomoyo</code> and <code>/mnt/kotomi</code>. | Let's say that we've got one server-machine with 2 directories that we want to share: <code>/mnt/tomoyo</code> and <code>/mnt/kotomi</code>. | ||
First, we have to create a dedicated directory from which our NFS server will access the data: | First, we have to create a dedicated directory ("virtual root directory") from which our NFS server will access the data: | ||
<syntaxhighlight lang="console"> | <syntaxhighlight lang="console"> | ||
| Line 17: | Line 31: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
You may need to change ownership of the <code>/export</code> directory to <code>nobody:nogroup</code> | You may need to change ownership of the <code>/export</code> directory to <code>nobody:nogroup</code>. | ||
Next mount directories to the virtual root directory. | |||
<syntaxhighlight lang="console"> | |||
# mount --bind /mnt/tomoyo /export/tomoyo | |||
# mount --bind /mnt/kotomi /export/kotomi | |||
</syntaxhighlight> | |||
Generate hardware config: | |||
<syntaxhighlight lang="console"> | |||
nixos-generate-config | |||
</syntaxhighlight> | |||
This will add the following to <code>hardware-configuration.nix</code>. | |||
< | {{file|/etc/nixos/hardware-configuration.nix|nix|<nowiki> | ||
{ | { | ||
fileSystems."/export/tomoyo" = { | fileSystems."/export/tomoyo" = { | ||
device = "/mnt/tomoyo"; | device = "/mnt/tomoyo"; | ||
fsType = "none"; | |||
options = [ "bind" ]; | options = [ "bind" ]; | ||
}; | }; | ||
| Line 30: | Line 58: | ||
fileSystems."/export/kotomi" = { | fileSystems."/export/kotomi" = { | ||
device = "/mnt/kotomi"; | device = "/mnt/kotomi"; | ||
fsType = "none"; | |||
options = [ "bind" ]; | options = [ "bind" ]; | ||
}; | }; | ||
} | } | ||
</ | </nowiki>}} | ||
Refer to [[Filesystems#Bind mounts]] for more information on bind mounts. | Refer to [[Filesystems#Bind mounts]] for more information on bind mounts. | ||
| Line 45: | Line 74: | ||
Having the filesystem ready, we can proceed to configure the NFS server itself: | Having the filesystem ready, we can proceed to configure the NFS server itself: | ||
< | {{file|/etc/nixos/configuration.nix|nix|<nowiki> | ||
{ | { | ||
services.nfs.server.enable = true; | services.nfs.server.enable = true; | ||
| Line 54: | Line 83: | ||
''; | ''; | ||
} | } | ||
</ | </nowiki>}} | ||
This configuration exposes all our shares to 2 local IPs; you can find more examples at [https://wiki.gentoo.org/wiki/NFSv4 Gentoo's wiki on NFS]. | This configuration exposes all our shares to 2 local IPs; you can find more examples at [https://wiki.gentoo.org/wiki/NFSv4 Gentoo's wiki on NFS]. | ||
| Line 91: | Line 120: | ||
= Client = | = Client = | ||
To ensure the client has the necessary NFS utilities installed, add the following to | To ensure the client has the necessary NFS utilities installed to mount NFS drives, add "nfs" to {{nixos:option|boot.supportedFilesystems}}. | ||
{{file|/etc/nixos/hardware-configuration.nix|nix|<nowiki> | |||
boot.supportedFilesystems = [ "nfs" ]; | |||
</nowiki>}} | |||
{{warning|Without addding "nfs" to {{nixos:option|boot.supportedFilesystems}}, the following error will be raised when trying to mount them: | |||
<syntaxhighlight lang="console"> | |||
# mount 192.0.2.1:/tomoyo /mnt/tomoyo | |||
mount: /mnt/nfs: fsconfig system call failed: NFS: mount program didn't pass remote address. | |||
dmesg(1) may have more information after failed mount system call. | |||
</syntaxhighlight> | |||
}} | |||
Next mount exports to your local directories: | |||
<syntaxhighlight lang="console"> | |||
# mount 192.0.2.1:/tomoyo /mnt/tomoyo | |||
# mount 192.0.2.1:/kotomi /mnt/kotomi | |||
</syntaxhighlight> | |||
{{Note|Replace "192.0.2.1" with the appropriate IP address or DNS entry of your NFS server.}} | |||
{{note| On the client side, the exposed shares are as if they were exposed at the root level - i.e. <code>/export/foo</code> becomes <code>/foo</code> (in the <code>device</code> option) }} | |||
Generate hardware config: | |||
<syntaxhighlight lang=" | <syntaxhighlight lang="console"> | ||
nixos-generate-config | |||
</syntaxhighlight> | </syntaxhighlight> | ||
This will add the following to <code>hardware-configuration.nix</code>. | |||
< | {{file|/etc/nixos/configuration.nix|nix|<nowiki> | ||
{ | { | ||
fileSystems."/mnt/tomoyo" = { | fileSystems."/mnt/tomoyo" = { | ||
device = " | device = "192.0.2.1:/tomoyo"; | ||
fsType = " | fsType = "nfs4"; | ||
}; | |||
fileSystems."/mnt/kotomi" = { | |||
device = "192.0.2.1:/kotomi"; | |||
fsType = "nfs4"; | |||
}; | }; | ||
} | } | ||
</ | </nowiki>}} | ||
Other, regular [https://search.nixos.org/options?query=filesystems.%3Cname%3E filesystem options] apply. | |||
== Specifying NFS version == | == Specifying NFS version == | ||