NFS: Difference between revisions
Cleaned up client section Tags: Mobile edit Mobile web edit Advanced mobile edit |
m →Client: add missing $ |
||
| (2 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
__FORCETOC__ | __FORCETOC__ | ||
[[wikipedia:Network_File_System|NFS]] is a distribute filesystem protocol to access directories and files over a network. | |||
= Server = | = Server = | ||
| Line 5: | 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 14: | 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="nix | <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 27: | 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 42: | 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 51: | 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 88: | Line 120: | ||
= Client = | = Client = | ||
To ensure the client has the necessary NFS utilities installed, add | 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> | |||
}} | |||
<syntaxhighlight lang=" | 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="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 == | ||
| Line 225: | Line 286: | ||
<syntaxhighlight lang="console"><host_or_ip>/nix /nix nfs nofail,x-systemd.device-timeout=4,local_lock=all 0 0</syntaxhighlight>'''TODO:''' Why this? That seems extremely unsafe. This disables NFS locks (which apply to all NFS clients), and makes locks ''local'', meaning a lock taken by one NFS client isn't seen by another, and both can take their locks. So this removes protection against concurrent writes, which Nix assumes. | <syntaxhighlight lang="console"><host_or_ip>/nix /nix nfs nofail,x-systemd.device-timeout=4,local_lock=all 0 0</syntaxhighlight>'''TODO:''' Why this? That seems extremely unsafe. This disables NFS locks (which apply to all NFS clients), and makes locks ''local'', meaning a lock taken by one NFS client isn't seen by another, and both can take their locks. So this removes protection against concurrent writes, which Nix assumes. | ||
[[Category:Filesystem]] | [[Category:Filesystem]] | ||
[[Category:Networking]] | |||