如何在 Ubuntu 18.04 上安装和配置 NFS 服务器

网络文件系统 (NFS) 是一种分布式文件系统协议,允许您通过网络共享远程目录。使用 NFS ,您可以在系统上挂载远程目录,并使用远程计算机上的文件,就像它们是本地文件一样。

默认情况下, NFS 协议未加密,与 Samba 不同,它不提供用户身份验证。对服务器的访问受客户端 IP 地址或主机名的限制。

在本教程中,我们将讨论如何在 Ubuntu 18.04 上设置 NFSv4 服务器。我们还将向您展示如何在客户端上安装 NFS 文件系统。

先决条件

此示例假定您有一台运行 Ubuntu 18.04 的服务器和另一台运行任何其他 Linux 发行版的服务器。服务器和客户端应该能够通过专用网络相互通信。如果您的托管服务提供商不提供私有 IP 地址,您可以使用公共 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 服务器包:

sudo apt update
sudo apt install nfs-kernel-server

安装完成后, NFS 服务将自动启动。

默认情况下,在 Ubuntu 18.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 服务器时,最好使用全局 NFS 根目录,并将实际目录绑定到共享挂载点。在此示例中,我们将使用 /srv/nfs4 目录作为 NFS 根目录。

我们将分享两个具有不同配置设置的目录 (/var/www/opt/backups) ,以更好地解释如何配置 NFS 挂载。

/var/www/ 由用户和组 www-data 拥有, /opt/backupsroot 其所有。

使用以下 mkdir 命令创建导出文件系统:

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

并添加以下行:

/etc/fstab 文件

/opt/backups /srv/nfs4/backups  none   bind   0   0
/var/www     /srv/nfs4/www      none   bind   0   0

导出文件系统

下一步是定义将由 NFS 服务器,共享选项和允许访问这些文件系统的客户端导出的文件系统。为此,请打开 /etc/exports 文件:

sudo nano /etc/exports

/etc/exports 文件还包含描述如何导出目录的注释。

在我们的例子中,我们需要导出 wwwbackups 目录,并且只允许从 192.168.33.0/24 网络上的客户端访问:

/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/nfs 。此 NFS 卷上的访问权限仅授予 192.168.33.0/24 子网中的客户端。当共享目录是导出目录的子目录的时候 crossmnt 选项是必须的。

在第二行显示如何为一个文件系统指定多个导出规则。它导出 /srv/nfs4/backups 目录并且只允许对整个 192.168.33.0/24 范围的读访问以及 192.168.33.3 读写访问。该 sync 选项告诉 NFS 在回复之前将更改写入磁盘。

最后一行应该是不言自明的。有关终端中所有可用选项类型的更多信息。

保存文件并导出共享:

sudo exportfs -ra

每次修改 /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.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 上, root_squash 默认启用。这是有关 NFS 安全性的最重要选项之一。它可以防止从客户端连接的 root 用户对已挂载的共享具有 root 权限。它将映射根 UIDGIDnobody/   nogroup   UID/   GID

为了使客户端计算机上的用户能够访问, NFS 希望客户端的用户和组 ID 与服务器上的用户和组 ID 匹配。另一种选择是使用 NFSv4 idmapping 功能将用户和组 ID 转换为名称,反之亦然。

完成。此时,您已在 Ubuntu 服务器上设置了 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 允许端口上的流量:

To                         Action      From
--                         ------      ----
2049                       ALLOW       192.168.33.0/24
22/tcp                     ALLOW       Anywhere
22/tcp (v6)                ALLOW       Anywhere (v6)

设置 NFS 客户端

既然已设置 NFS 服务器并导出共享,则下一步将配置客户端并装入远程文件系统。

您也可以在 macOS 和 Windows 机器上安装 NFS 共享,但我们将专注于 Linux 系统。

安装 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 的客户端计算机上工作,该 IP 192.168.33.110 具有对 /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 /backupssudo mount -t nfs -o vers=4 192.168.33.10:/www /srv/www

NFS 服务器的 IP 是192.168.33.10 。您也可以使用主机名而不是 IP 地址,但客户端计算机需要解析它。这通常通过在 /etc/hosts 文件中将主机名映射到的 IP 来完成。

安装 NFSv4 文件系统时,需要省略 NFS 根目录,因此你需要使用 /backups 而不是 /srv/nfs4/backups

使用 mount 或 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

要在重新启动时使挂载永久化,请打开 /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

接下来,尝试 /srv/www 使用以下 sudo 命令以 root   身份创建测试文件到目录:

sudo touch /srv/www/test.txt

再次,您将看到 Permission denied 消息。

touch: cannot touch ‘/srv/www’: Permission denied

如果您回想起该 /var/www   目录由 www-data 用户拥有,并且此共享具有 root_squash 选项集,该选项设置将 root 用户映射到对远程共享没有写权限的 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 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 请运行:

sudo umount /backups

如果在 /etc/fstab 文件中定义了安装点,请确保删除该行或通过在行的开头添加 # 将其注释掉。

结论

在本教程中,我们向您展示了如何设置 NFS 服务器以及如何在客户端计算机上安装远程文件系统。如果您在生产中实现 NFS 并共享敏感数据,那么启用 kerberos 身份验证是个好主意。

作为 NSF 的替代方案,您可以使用 SSHFS 通过 SSH 连接挂载远程目录。 SSHFS 默认是加密的,更容易配置和使用。