如何在Ubuntu 20.04上安装和配置一个NFS服务器?
NFS或网络文件系统是一个分布式文件系统协议,允许你在网络上共享目录。通过NFS,你可以在你的系统上挂载远程目录,并像处理本地文件一样处理远程机器上的文件。
默认情况下,NFS协议是不加密的,也不提供用户认证。对服务器的访问由客户的IP地址或主机名来限制。
本文解释了如何在Ubuntu 20.04上建立一个NFSv4服务器。我们还将告诉你如何在客户机上挂载一个NFS文件系统。
先决条件
我们将使用两台机器,一台运行Ubuntu 20.04,它将作为NFS服务器,另一台运行任何其他Linux发行版,我们将在上面挂载共享。服务器和客户端应该能够通过一个私有网络相互通信。你可以使用公共IP地址,并配置服务器防火墙,使端口2049
上的流量只来自可信的来源。
这个例子中的机器有以下的IP。
NFS Server IP: 192.168.33.10
NFS Clients IPs: From the 192.168.33.0/24 range
设置NFS服务器
第一步是设置NFS服务器。我们将安装必要的软件包,创建和导出NFS目录,并配置防火墙。
装上NFS服务器
NFS服务器包提供了运行NFS内核服务器所需的用户空间支持。要安装该软件包,请运行。
sudo apt update
sudo apt install nfs-kernel-server
一旦安装完成,NFS服务就会自动启动。
在Ubuntu 20.04上,NFS版本2被禁用。版本3和4是启用的。你可以通过运行以下cat
命令来验证。
sudo cat /proc/fs/nfsd/versions
输出
-2 +3 +4 +4.1 +4.2
NFSv2现在已经很老了,没有理由再启用它了。
NFS服务器配置是在/etc/default/nfs-kernel-server
和/etc/default/nfs-common
文件中定义的。默认设置对大多数情况来说是足够的。
创建文件系统
NFSv4服务器使用一个全局根目录,而导出的目录是相对于这个目录的。你可以使用绑定挂载将共享挂载点链接到你想要导出的目录。
在这个例子中,我们将设置/srv/nfs4
目录为NFS根目录。为了更好地解释如何配置NFS挂载,我们将共享两个具有不同配置设置的目录(/var/www
和/opt/backups
)。其中/var/www/
为用户www-data
所有,而/opt/backups
为root
所有。
首先,创建根目录和共享挂载点。
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
文件。
sudo nano /etc/fstab
并添加以下几行。
/opt/backups /srv/nfs4/backups none bind 0 0
/var/www /srv/nfs4/www none bind 0 0
导出文件系统
下一步是在/etc/exports
文件中添加将被导出的文件系统和允许访问这些共享的客户机。
输出的文件系统的每一行都有以下形式。
export host(options)
其中export
是导出的目录,host
是可以访问导出的主机名或IP地址/范围,而options
是主机选项。
打开/etc/exports
文件,并添加以下几行。
sudo nano /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.20(rw,sync,no_subtree_check)
第一行包含fsid=0
选项,它定义了NFS根目录(/srv/nfs4
)。对这个NFS卷的访问只允许来自192.168.33.0/24
子网的客户端。分享作为导出目录的子目录的目录时,需要crossmnt
选项。
第二行显示了如何为一个文件系统指定多个导出规则。允许对整个192.168.33.0/24
范围进行读取访问,并且只允许对192.168.33.3
的IP地址进行读取和写入访问。sync
选项告诉NFS在回复之前将变化写入磁盘。
最后一行是不言自明的。关于所有可用选项的更多信息,请在你的终端输入man exports
。
保存文件并导出共享:
sudo exportfs -ar
你需要在每次修改/etc/exports
文件时运行上面的命令。如果有任何错误或警告,它们将显示在终端上。
要查看当前的活动出口和它们的状态,请使用。
sudo exportfs -v
输出将包括所有共享及其选项。正如你所看到的,还有一些选项是我们没有在/etc/exports
文件中定义的。那些是默认选项,如果你想改变它们,你需要明确地设置这些选项。
输出
/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.20(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上,root_squash
是默认启用的。这是关于NFS安全的最重要的选项之一。它通过将根用户UID
和GID
映射到nobody
/nogroup
UID
/GID
,防止从客户端连接的根用户在挂载的共享上拥有根权限。
为了使客户机上的用户能够访问,NFS希望客户机的用户和组的ID与服务器上的ID相匹配。另一个选择是使用NFSv4的idmapping功能,将用户和组的ID转换为名称,反之亦然。
就这样了。在这一点上,你已经在你的Ubuntu服务器上设置了一个NFS服务器。现在你可以进入下一步,配置客户端并连接到NFS服务器。
防火墙的配置
如果您在受到防火墙保护的远程Ubuntu服务器上安装Jenkins,您将需要启用NFS端口的流量。
sudo ufw allow from 192.168.33.0/24 to any port nfs
核实该变化。
sudo ufw status
输出结果应该显示,端口2049
上的流量是允许的。
输出
To Action From
-- ------ ----
2049 ALLOW 192.168.33.0/24
22/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
设置NFS客户机
现在NFS服务器已经设置好了,共享也导出了,下一步就是配置客户机和挂载远程文件系统了。
我们将专注于Linux系统,但您也可以在macOS和Windows机器上挂载NFS共享。
安装NFS客户机
在客户机上,我们只需要安装挂载远程NFS文件系统所需的工具。
在Debian和Ubuntu上安装NFS客户机
包含在基于Debian的发行版上安装NFS文件系统的程序的软件包名称是
nfs-common
。要安装它,请运行。sudo apt update
sudo apt install nfs-common
在CentOS和Fedora上安装NFS客户机
在Red Hat及其衍生产品上,请安装
nfs-utils
包。sudo yum install nfs-utils
挂载文件系统
我们将在IP为192.168.33.20
的客户机上工作,它对/srv/nfs4/www
的文件系统有读写权限,对/srv/nfs4/backups
的文件系统有只读权限。
为挂载点创建两个新的目录。
sudo mkdir -p /backups
sudo mkdir -p /srv/www
你可以在你想要的任何位置创建目录。
用mount
命令挂载已导出的文件系统。
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
其中192.168.33.10
是NFS服务器的IP。你也可以用主机名代替IP地址,但它需要能被客户机解析。这通常是通过在/etc/hosts
文件中将主机名映射到IP来完成的。
当挂载一个NFSv4文件系统时,省略NFS根目录。使用/backups
,而不是/srv/nfs4/backups
。
使用mount或df
命令,验证远程文件系统是否被成功挂载。
df -h
该命令将打印所有挂载的文件系统。最后两行是挂载的共享。
Filesystem Size Used Avail Use% Mounted on
udev 951M 0 951M 0% /dev
tmpfs 199M 676K 199M 1% /run
/dev/sda3 124G 2.8G 115G 3% /
tmpfs 994M 0 994M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 994M 0 994M 0% /sys/fs/cgroup
/dev/sda1 456M 197M 226M 47% /boot
tmpfs 199M 0 199M 0% /run/user/1000
192.168.33.10:/backups 124G 2.8G 115G 3% /backups
192.168.33.10:/www 124G 2.8G 115G 3% /srv/www
要想在重启时使挂载永久化,请打开/etc/fstab
文件,并添加以下几行:。
sudo nano /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文件系统时可用的选项的信息,请在终端键入man nfs
。
另一个挂载远程文件系统的方法是使用autofs
工具或创建一个systemd单元。
测试NFS的访问
让我们通过在每个共享上创建一个新文件来测试对共享的访问。
首先,尝试使用touch
命令创建一个测试文件到/backups
目录中。
sudo touch /backups/test.txt
/backup
文件系统被导出为只读,正如预期的那样,你会看到一个Permission denied
错误信息。
输出
touch: cannot touch ‘/backups/test’: Permission denied
接下来,尝试使用sudo
命令创建一个测试文件到/srv/www
目录下,作为根目录。
sudo touch /srv/www/test.txt
再一次,你会看到Permission denied
的信息。
输出
touch: cannot touch ‘/srv/www’: Permission denied
如果你还记得,/var/www
目录是由www-data
用户拥有的,这个共享有root_squash
选项设置,它将根用户映射到nobody
用户和nogroup
组,该组没有对远程共享的写权限。
假设你在客户机上有一个www-data
使用,与远程服务器上的UID
和GID
相同(例如,如果你在两台机器上都安装了nginx,就应该是这种情况),你可以尝试以用户www-data
的身份创建一个文件。
sudo -u www-data touch /srv/www/test.txt
该命令将不显示任何输出,这意味着文件被成功创建了。
为了验证它,列出了/srv/www
目录中的文件。
ls -la /srv/www
输出结果应该显示新创建的文件。
输出
drwxr-xr-x 3 www-data www-data 4096 Apr 10 22:18 .
drwxr-xr-x 3 root root 4096 Apr 10 22:29 ..
-rw-r--r-- 1 www-data www-data 0 Apr 10 21:58 index.html
-rw-r--r-- 1 www-data www-data 0 Apr 10 22:18 test.txt
解除对NFS文件系统的挂载
如果不再需要远程NFS共享,你可以使用umount
命令把它像其他挂载的文件系统一样取消挂载。
例如,如果要卸载/backup
共享,你可以运行。
sudo umount /backups
如果挂载点是在/etc/fstab
文件中定义的,请确保你删除这一行,或者在这一行的开头加上#
的注释。
总结
我们已经向你展示了如何建立一个NFS服务器以及如何在客户机上挂载远程文件系统。如果你在生产中实施NFS,并分享合理的数据,启用kerberos认证是一个好主意。
作为NFS的替代品,您可以使用SSHFS来通过SSH连接挂载远程目录。SSHFS默认是加密的,而且配置和使用起来更容易。
如果你有任何问题,请随时留言评论。