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

December 17, 2023
测试
测试
测试
测试
12 分钟阅读

网络文件系统(NFS)是一个分布式文件系统协议,它允许你通过网络共享远程文件夹。通过 NFS,你可以将远程文件夹挂载到你的系统上,并且操作远程机器的文件,就像本地文件一样方便。

NFS 协议默认是不加密的,它不像 Samba,它不提供用户身份鉴别。服务端通过限定客户端的 IP 地址和端口来限制访问。

在这个指南中,我们将一起看看如何在 Ubuntu 18.04 上建立一个 NFSV4 服务器。我们将会为你展示如何在客户端上挂载 NFS 文件系统。

一、前提条件

我们假设你有一台运行 Ubuntu 18.04 的服务器,在这台服务器上,我们将会建立 NFS 服务器,并且另外一个运行其他 Linux 发行版的机器将作为 NFS 客户端。服务器和客户端应该能够通过私有局域网互相连接。如果无法提供私有 IP 地址,你可以使用公有地址,配置服务器的防火墙,并且允许来自可信源的流量通过端口2049

这个例子中的机器有如下 IPs:

NFS Server IP: 192.168.33.10
NFS Clients IPs: From the 192.168.33.0/24 range

二、建立 NFS 服务器

这一段讲解如何安装必要的软件包,创建并且导出 NFS 目录,并且配置防火墙。

2.1 安装 NFS 服务器

刷新软件索引并且安装 NFS 服务器软件包:

sudo apt update
sudo apt install nfs-kernel-server

一旦安装完成,NFS 服务将会自动启动。默认情况下,在 Ubuntu 18.04 上 NFS 版本 2 被禁用。NFS 3 和 NFS 4 都可以用。你可以运行下面的命令去验证:

sudo cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 +4.2

NFSv2 非常古老,没有理由去启用它。 NFS 服务器配置选项在/etc/default/nfs-kernel-server/etc/default/nfs-common文件。默认的设置对于我们的使用场景已经足够了。

2.2 创建文件系统

当配置 NFSv4 服务器的时候,最好的实践就是使用一个全局的 NFS 根目录,并且在这里挂载实际的目录。在这个例子中,我们将会使用/srv/nfs4作为 NFS root 目录。

我们将会分享两个目录(/var/www/opt/backups),使用不同的配置,来更好的解释如何配置 NFS 挂载。

/var/www/归属于用户和用户组www-data,并且/opt/backups归属于root

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

2.3 导出文件系统

下一步就是定位将要被 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.来自192.168.33.0/24网络的所有客户端被允许访问 NFS 卷。crossmnt选项是必要的,用来分享被导出目录的子目录。

第二行显示了如何针对一个文件系统指定多个导出规则。它导出了/srv/nfs4/backups目录,并且允许来自192.168.33.0/24的客户端只读访问,而来自192.168.33.3的客户端同时读写可访问。这个sync选项告诉了 NFS 在回复之前将修改写入磁盘。

最后一行应该是自解释的。想要了解更多可用选项,在终端输入man exports

保存文件并且导出分享:

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 权限。 它将会将 rootUIDGID映射到nobody/nogroupUIDGID

对于那些通过客户端机器访问的用户,NFS 预期会把客户端的用户和用户组 ID 匹配服务器上的用户和用户组。另外一个选项,就是使用 NFSv4 idmapping 特性,它能将用户和用户组 ID 转换成名字或者其他的方式。

就这些。此时,你已经在你的 Ubuntu 服务器上建立了一个 NFS 服务器。你可以看下一步,并且配置客户端,以便连接 NFS 服务器。

2.4 防火墙配置

如果你在网络上运行了防火墙,你将需要添加一个规则,允许 流量通过 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 系统上挂载共享目录。

3.1 安装 NFS 客户端

在其他客户端的机器上,安装需要挂载远程 NFS 文件系统的工具.

腾讯云:助力中小微企业上云,满足轻量级Web应用需求,云服务器钜惠 166元/年起
腾讯云:助力中小微企业上云,满足轻量级Web应用需求,云服务器钜惠 166元/年起
  • 在 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

3.2 挂载文件系统

我们将在 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 /backups
sudo mount -t nfs -o vers=4 192.168.33.10:/www /srv/www

192.168.33.10是 NFS 服务器的 IP 地址。你也可以使用主机名,而不用 IP 地址,但是它需要在客户端机器上可以转换成 ip。这通常是在/etc/hosts本地文件中将主机名和 IP 进行映射来完成的。

当挂载 NFSv4 文件系统,你需要忽略 NFS 根目录,因此,不使用/srv/nfs4/backups,而使用/backups

验证远程文件系统是否成功挂载,使用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

添加下面的行:

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 单元。

3.3 测试 NFS 访问

让我们通过在共享目录中创建新文件来测试对共享文件夹的访问。

首先,通过使用touch命令在/backups目录下创建一个测试文件:

sudo touch /backups/test.txt

backup文件系被导出为只读,并且你应该会看到一个类似Permission denied的错误信息:

touch: cannot touch ‘/backups/test’: Permission denied

下一步,通过 sudo 命令以 root 用户身份在/srv/www目录下创建一个测试文件:

sudo touch /srv/www/test.txt

再一次,你将会看到Permission denied信息。

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

/var/www目录归属www-data用户,并且这个分享拥有root_squash选项,该选项将 root 用户映射成nobody用户和nogroup用户组,导致 root 用户对远程共享文件没有写入权限。

假设www-data用户在客户端机器上存在,并且GIDUID也和远程服务器上一样(比如,你在服务器和客户机上都安装了 www-data),你可以以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

3.4 卸载 NFS 文件系统

如果你不再需要远程 NFS 共享,你可以使用 umount 命令卸载它。例如,想要卸载/backup,你可以运行:

sudo umount /backups

如果挂载点被定义在/etc/fstab文件,确保你移除了对应的行,或者使用#在行首进行了注释。

四、总结

在这篇指南中,我们为你演示了如何建立一个远程 NFS 服务器,以及如何在客户机上挂载远程文件系统。如果你在生产环境中使用 NFS,并且分享敏感数据,我们建议你启用 kerberos 身份验证和鉴权。

作为一个 NFS 替代方案,你可以使用 SSHFS,通过 SSH 连接来挂载远程目录。SSH 默认被加密,而且很容易配置和使用。

继续阅读

更多来自我们博客的帖子

如何安装 BuddyPress
由 测试 December 17, 2023
经过差不多一年的开发,BuddyPress 这个基于 WordPress Mu 的 SNS 插件正式版终于发布了。BuddyPress...
阅读更多
Filter如何工作
由 测试 December 17, 2023
在 web.xml...
阅读更多
如何理解CGAffineTransform
由 测试 December 17, 2023
CGAffineTransform A structure for holding an affine transformation matrix. ...
阅读更多