NFS网络文件系统是一种分布式文件系统协议,使您可以通过网络共享远程目录。
使用NFS,您可以在系统上挂载远程计算机目录,并像对待本地文件一样使用远程计算机文件。
NFS协议是未加密的协议,并且与Samba不同,它不提供用户身份验证。使用客户端IP地址或主机名来限制客户端对服务器的访问。
在本教程中,我们将介绍如何在Ubuntu 20.04设置NFS v4服务器。我们还将向您展示如何在客户端计算机挂载NFS文件系统。
本教程假定您有一台正在运行的Ubuntu 20.04服务器,另一台运行着任意Linux发行版的计算机。
服务器和客户端能够通过网络相互通信。如果您托管服务器提供商不提供私有IP地址。可以使用公共IP地址并设置服务器防火墙仅允许来自受信任源端口2049
。
本教程中的计算机的IP地址是NFS Server/服务器 IP: 192.168.33.10。NFS Clients/客户端 IPs: 192.168.33.0/24 网段内任意IP。
安装NFS服务器
要在Ubuntu 20.04安装NFS服务器,你只需要运行apt命令sudo apt install nfs-kernel-server
更新软件包索引并安装NFS服务器软件包。
安装完成后,NFS服务将自动启动。默认情况下,在Ubuntu 20.04,NFS版本2是禁用的。版本3和版本4已启用。NFSv2现在已经很老了,我们没有理由再启用它。
NFS服务器配置文件分别是/etc/default/nfs-kernel-server
和/etc/default/nfs-common
。
您可以运行cat
命令sudo cat /proc/fs/nfsd/versions
来验证正在运行的NFS版本。
sudo apt update
sudo apt install nfs-kernel-server
sudo cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 +4.2
创建共享目录
配置NFSv4服务器时,一个好的做法是使用全局NFS根目录,并将实际目录绑定到共享挂载点。在本教程中,我们将使用/srv/nfs4
目录作为NFS根目录。
我们将共享具有不同配置的两个目录/var/www
和/opt/backups
,以更好地说明如何配置NFS。
/var/www/
由www-data
用户和组拥有和/opt/backups
它的拥有者是root
。
请运行以下mkdir
命令创建要共享的目录/var/www
和/opt/backups
。然后将目录/var/www
和/opt/backups
目录绑定到/srv/nfs4
根目录。
sudo mkdir -p /var/www/
sudo mkdir -p /opt/backups
sudo mkdir -p /srv/nfs4/backups
sudo mkdir -p /srv/nfs4/www
sudo mount --bind /opt/backups /srv/nfs4/backups
sudo mount --bind /var/www /srv/nfs4/www
要在重启后自动绑定目录,请使用你喜欢的文本编辑器打开文件/etc/fstab
,在本教程中我们将使用vim打开文件。
复制粘帖以下行到文件/etc/fstab
,然后保存文件并退出vim编辑器。
sudo vim /etc/fstab
/opt/backups /srv/nfs4/backups none bind 0 0
/var/www /srv/nfs4/www none bind 0 0
导出文件系统
下一步就是定义共享选项和访问限制然后通过NFS服务器导出。/etc/exports
文件包含了描述如何导出目录的说明。
在本教程中,我们需要导出www
和backups
目录,并仅允许IP是192.168.33.0/24
网段的客户端访问。
继续使用你喜欢的文本编辑器打开文件/etc/exports
,在本教程中我们将使用vim打开文件。
sudo vim /etc/exports
/srv/nfs4 192.168.33.0/24(rw,sync,no_subtree_check,crossmnt,fsid=0)
/srv/nfs4/backups 192.168.33.0/24(ro,sync,no_subtree_check) 192.168.33.3(rw,sync,no_subtree_check)
/srv/nfs4/www 192.168.33.110(rw,sync,no_subtree_check)
第一行包含fsid=0
定义NFS根目录/srv/nfs4
。仅允许来自192.168.33.0/24
子网的客户端对此NFS访问权限。crossmnt
选项是必需的,它用于共享目录和导出子目录。
第二行显示如何为一个文件系统指定多个导出规则。它导出/srv/nfs4/backups
目录,只允许192.168.33.0/24
网段的客户端有读的权限,并且仅允许IP地址是192.168.33.3
的客户端具有读和写权限。sync
选项告诉NFS在恢复之前将更改写入磁盘。
最后一行应该是不言自明的了。所有可用选项的更多信息,请在终端中输入man exports
查看手册。
保存文件并退出vim编辑器,然后运行命令导出目录sudo exportfs -ra
。
sudo exportfs -ra
每次修改/etc/exports
文件时,都需要运行命令sudo exportfs -ra
。如果有任何错误或警告,错误消息将打印在终端。
要查看当前活动的export及其状态,请运行命令sudo exportfs -v
。输出将包含所有共享目录及其选项。
如您所见,还有一些我们尚未在/etc/exports
文件中定义的选项。这些是默认选项,如果要更改它们,则需要显式设置这些选项。
sudo exportfs -v
/srv/nfs4/backups
192.168.33.3(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4/www 192.168.33.110(rw,wdelay,root_squash,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4 192.168.33.0/24(rw,wdelay,crossmnt,root_squash,no_subtree_check,fsid=0,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4/backups
192.168.33.0/24(ro,wdelay,root_squash,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
在Ubuntu 20.04,root_squash
默认情况下是启用的。这是NFS安全性的最重要的选择之一。
这样可以防止从客户端对已挂载的共享具有root权限。它将映射rootUID
和GID
到nobody
/nogroup
UID
/GID
。
为了使客户端计算机能够访问,NFS希望客户端的用户和组ID与服务器的用户和组ID匹配。另一种选择是使用NFSv4 idmapping功能,将用户和组ID转换为名称。
至此,您已经在Ubuntu 20.04安装配置NFS服务器。现在,您可以转到下一步配置客户端并连接到NFS服务器。
防火墙配置
如果您的服务器正在运行着防火墙,则需要添加一条规则,允许NFS端口连接。
假设您正在UFW
命令用来管理防火墙。为了仅允许来自192.168.33.0/24
子网进行访问,请运行命令sudo ufw allow from 192.168.33.0/24 to any port nfs
。
要验证防火墙规则的更改,请运行命令sudo ufw status
。输出将会显示允许端口2049
的连接。sudo ufw allow nfs
命令将会允许任何源IP地址。
sudo ufw allow from 192.168.33.0/24 to any port nfs
sudo ufw allow nfs
sudo ufw status
To Action From
-- ------ ----
2049 ALLOW 192.168.33.0/24
22/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
安装设置NFS客户端
现在我们已经设置NFS服务器并导出了共享,则下一步将配置客户端并挂载NFS文件系统。
您也可以在macOS和Windows计算机挂载NFS共享目录,但是我们将重点关注Linux系统。
在客户端计算机,我们仅需要安装挂载远程NFS文件系统所需的软件工具。
如果你的计算机运行的是基于Debian的Linux发行版,例如Ubuntu,Linux mint。请运行命令sudo apt update && sudo apt install nfs-common
安装NFS文件系统挂载软件。
如果你的计算机运行的是基于RedHat的Linux发行版,例如CentOS,Fedora。请运行命令sudo yum install nfs-utils
安装NFS文件系统挂载软件。
sudo apt update && sudo apt install nfs-common
sudo yum install nfs-utils
挂载NFS文件系统
我们将在IP地址是192.168.33.110
客户端计算机挂载NFS共享,该IP具有对/srv/nfs4/www
目录的读写权限和对/srv/nfs4/backups
的只读权限。
为挂载两个目录,我们将创建两个目录作为挂载点。您可以在你所需的任何目录创建此挂载点目录。
然后运行mount
命令挂载NFS共享文件系统,vers=4
表示使用V4版本的NFS,192.168.33.10:/backups
NFS服务器共享目录。/backups
挂载点。
sudo mkdir -p /backups
sudo mkdir -p /srv/www
sudo mount -t nfs -o vers=4 192.168.33.10:/backups /backups
sudo mount -t nfs -o vers=4 192.168.33.10:/www /srv/www
您也可以使用主机名代替NFS服务器IP地址192.168.33.10
。但是客户端计算机必须可以将主机名解析为IP地址。
你可以在/etc/hosts
文件添加主机名与IP的映射来完成,这是hosts文件格式127.0.1.1 ubuntu
,第一列是IP地址,第二列是主机名称,可以是任何名称。
挂载NFS v4版本的文件系统时,可以省略NFS根目录,因此你可以使用/backups
,而不是/srv/nfs4/backups
挂载NFS共享目录。
最后使用mount或df
命令验证是否成功挂载NFS共享目录,df命令将打印所有已挂载的文件系统。最后两行是已挂载的共享目录。
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00 38G 1.7G 36G 5% /
devtmpfs 236M 0 236M 0% /dev
tmpfs 244M 0 244M 0% /dev/shm
tmpfs 244M 4.5M 240M 2% /run
tmpfs 244M 0 244M 0% /sys/fs/cgroup
/dev/sda2 1014M 87M 928M 9% /boot
tmpfs 49M 0 49M 0% /run/user/1000
192.168.33.10:/backups 9.7G 1.2G 8.5G 13% /backups
192.168.33.10:/www 9.7G 1.2G 8.5G 13% /srv/www
要自动挂载NFS共享目录,请你喜欢的编辑器打开/etc/fstab
文件。复制粘帖以下行到文件/etc/fstab
。
/etc/fstab
文件包含一个挂载点列表,这些条目定义在系统启动时将在何处以及如何挂载文件系统。
要查找挂载NFS文件系统可用选项的更多信息,请在终端中键入man nfs
。挂载共享目录的另一种选择是使用autofs
工具或创建一个systemd服务文件。
sudo vim /etc/fstab
192.168.33.10:/backups /backups nfs defaults,timeo=900,retrans=5,_netdev 0 0
192.168.33.10:/www /srv/www nfs defaults,timeo=900,retrans=5,_netdev 0 0
测试NFS访问
让我们为每个共享目录创建一个文件来测试对NFS共享目录的访问。首先,尝试/backups
挂载点运行touch
命令创建文件。
/backup
文件系统被设置为只读权限,因此你会看到一个权限拒绝错误消息touch: cannot touch ‘/backups/test’: Permission denied。
sudo touch /backups/test.txt
touch: cannot touch ‘/backups/test’: Permission denied
接下来,尝试在/srv/www
目录,运行命令sudo touch /srv/www/test.txt
创建测试文件。
同样,您将看到错误消息touch: cannot touch ‘/srv/www’: Permission denied,也就是权限拒绝错误。
sudo touch /srv/www/test.txt
touch: cannot touch ‘/srv/www’: Permission denied
您可能还记得/var/www
目录所有者是www-data
用户。此共享设置root_squash
选项。
root_squash
选项将root用户映射到远程服务器nobody
用户和nogroup
组。nobody
用户和nogroup
组是没有写权限读写导出的共享目录。
假设在客户端计算机存在用户www-data
,在服务器端也有用户www-data
且相同的UID
和GID
。
则可以运行命令sudo -u www-data touch /srv/www/test.txt
在/srv/www/
共享目录中创建文件。
该命令将不显示任何输出,表示文件已成功创建。要验证它可以运行ls命令列出/srv/www
目录文件。
sudo -u www-data touch /srv/www/test.txt
ls -la /srv/www
drwxr-xr-x 3 www-data www-data 4096 Jun 23 22:18 .
drwxr-xr-x 3 root root 4096 Jun 23 22:29 ..
-rw-r--r-- 1 www-data www-data 0 Jun 23 21:58 index.html
-rw-r--r-- 1 www-data www-data 0 Jun 23 22:18 test.txt
卸载NFS文件系统
如果不再需要远程NFS共享,则可以使用umount命令将其卸载已挂载的任何目录。
例如要卸载/backup
NFS共享,请运行命令sudo umount /backups
。
如果在/etc/fstab
文件中定义了挂载记录,请确保删除包含挂载点的行或者在该行的开头添加#
注释掉。
sudo umount /backups
结论
在本教程中,我们向您展示了如何在Ubuntu 20.04设置NFS服务器以及如何在客户端计算机挂载NFS文件系统。
如果要在生产中实施NFS并共享敏感数据,建议启用kerberos身份验证。作为NFS的安全替代方案,您可以使用SSHFS通过SSH连接挂载NFS共享。
SSHFS默认是加密的协议,并且更易于配置和使用。如有任何疑问,请随时发表评论。