如何在Ubuntu 20.04上安装和配置一个NFS服务器?

评论 0 浏览 0 2021-04-12

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 updatesudo 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/backupsroot所有。

首先,创建根目录和共享挂载点。

sudo mkdir -p /srv/nfs4/backupssudo mkdir -p /srv/nfs4/www

绑定挂载目录到共享挂载点。

sudo mount --bind /opt/backups /srv/nfs4/backupssudo mount --bind /var/www /srv/nfs4/www

要使绑定的挂载在不同的重启下都是永久性的,请打开/etc/fstab文件。

sudo nano /etc/fstab

并添加以下几行。

/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
/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安全的最重要的选项之一。它通过将根用户UIDGID映射到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 updatesudo 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 /backupssudo mkdir -p /srv/www

你可以在你想要的任何位置创建目录。

mount命令挂载已导出的文件系统。

sudo mount -t nfs -o vers=4 192.168.33.10:/backups /backupssudo 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
/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使用,与远程服务器上的UIDGID相同(例如,如果你在两台机器上都安装了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默认是加密的,而且配置和使用起来更容易。

如果你有任何问题,请随时留言评论。

最后更新2023-06-06
0 个评论