网络文件系统(NFS)是一个分布式文件系统协议,它允许你通过网络共享远程文件夹。通过 NFS,你可以将远程文件夹挂载到你的系统上,并且操作远程机器的文件,就像本地文件一样方便。
NFS 协议默认是不加密的,它不像 Samba,它不提供用户身份鉴别。服务端通过限定客户端的 IP 地址和端口来限制访问。
在这个指南中,你将在 CentOS 8 上按照必要步骤去建立一个 NFSV4 服务器。我们将会为你展示如何在客户端上挂载 NFS 文件系统。
我们假设你有一台运行 CentOS 8 的服务器,在这台服务器上,我们将会建立 NFS 服务器,并且其他机器将作为 NFS 客户端。服务器和客户端应该能够通过私有局域网互相连接。如果无法提供私有 IP 地址,你可以使用公有地址,配置服务器的防火墙,并且允许来自可信源的流量通过端口2049
。
这个例子中的机器有如下 IPs:
NFS Server IP: 192.168.33.148
NFS Clients IPs: From the 192.168.33.0/24 range
这一段讲解如何安装必要的软件包,创建并且导出 NFS 目录,并且配置防火墙。
“nfs-utils”软件包提供了建立 NFS 服务器所需要的 NFS 工具和守护程序。想要安装它,运行下面的命令:
sudo dnf install nfs-utils
一旦安装完成,启用并启动 NFS 服务,输入:
sudo systemctl enable --now nfs-server
默认情况下,在 CentOS 8 上,NFS 3 和 NFS 4 都可以用,NFS 2 被禁用。NFSV2 非常老,没有理由启用它。想要验证,运行下面的cat
命令:
sudo cat /proc/fs/nfsd/versions
-2 +3 +4 +4.1 +4.2
NFS 服务器配置选项在/etc/nfsmount.conf
和/etc/nfs.conf
文件中。默认的设置足够满足我们的要求。
当配置 NFSv4 服务器的时候,最好的实践就是使用一个全局的 NFS 根目录,并且在这里挂载实际的目录。在这个例子中,我们将会使用/srv/nfs4
作为 NFS root 目录。
想要更好的讲解符合配置 NFS 挂载,我们将会在不同的配置文件设置中,分享两个目录(/var/www
和/opt/backups
)。
/var/www/
归属的用户和用户组为apache
,并且/opt/backups
归属于root
用户。
使用mkdir
命令,创建这个导出的文件系统:
sudo mkdir -p /srv/nfs4/{backups,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
下一步就是定位将要被 NFS 服务器导出的文件系统,共享选项和被允许访问文件系统的客户端。想要这么做,打开/etc/exports
文件:
sudo nano /etc/exports
导出www
和backups
目录,并且允许来自192.168.33.0/24
网络的所有客户端:
/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(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4/www 192.168.33.110(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4 192.168.33.0/24(sync,wdelay,hide,crossmnt,no_subtree_check,fsid=0,sec=sys,rw,secure,root_squash,no_all_squash)
/srv/nfs4/backups
192.168.33.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
root_squash
是一个最重要的选项,关系到 NFS 安全性。它阻止来自客户端 root 用户拥有被挂载分享目录的 root 权限。 它将会将 rootUID
和GID
映射到nobody/nogroup
的UID
和GID
。
对于那些通过客户端机器访问的用户,NFS 预期会把客户端的用户和用户组 ID 匹配服务器上的用户和用户组。另外一个选项,就是使用 NFSv4 idmapping 特性,它能将用户和用户组 ID 转换成名字或者其他的方式。
就这些。此时,你已经在你的 CentOS 服务器上建立了一个 NFS 服务器。你可以看下一步,并且配置客户端,以便连接 NFS 服务器。
FirewallD 是 CentOS 8 上的默认防火墙解决方案。
The NFS service 服务包含了允许访问 NFS 服务器的预设规则。
下面的命令将持久的允许来自192.168.33.0/24
子网的访问:
sudo firewall-cmd --new-zone=nfs --permanent
sudo firewall-cmd --zone=nfs --add-service=nfs --permanent
sudo firewall-cmd --zone=nfs --add-source=192.168.33.0/24 --permanent
sudo firewall-cmd --reload
现在 NFS 服务器已经设置并且分享也被导出了,下一步就是配置客户端,并且挂载远程文件系统。
你也可以在 macOS 和 Windows 机器上挂载 NFS 共享目录,但是我们将专注于在 Linux 系统上挂载共享目录。
在其他客户端的机器上,安装需要挂载远程 NFS 文件系统的工
nfs-common
。安装运行:
sudo apt update sudo apt install nfs-commonnfs-utils
包:
sudo yum install nfs-utils我们将在 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.148:/backups /backups
sudo mount -t nfs -o vers=4 192.168.33.148:/www /srv/www
192.168.33.148
是 NFS 服务器的 IP 地址。你也可以使用主机名,而不用 IP 地址,但是它需要在客户端机器上可以转换成 ip。这通常是在/etc/hosts
本地文件中将主机名和 IP 进行映射来完成的。
当挂载 NFSv4 文件系统,你需要忽略 NFS 根目录,因此,不使用/srv/nfs4/backups
,而使用/backups
。
验证远程文件系统是否成功挂载,使用df
命令:
df -h
这个命令将会打印出所有被挂载的文件系统。最后两行是被挂载的分享:
...
192.168.33.148:/backups 9.7G 1.2G 8.5G 13% /backups
192.168.33.148:/www 9.7G 1.2G 8.5G 13% /srv/www
想要持久化这些挂载,打开/etc/fstab
文件:
sudo nano /etc/fstab
添加下面的行:
192.168.33.148:/backups /backups nfs defaults,timeo=900,retrans=5,_netdev 0 0
192.168.33.148:/www /srv/www nfs defaults,timeo=900,retrans=5,_netdev 0 0
想要找到更多关于挂载 NFS 文件系统的可用选项的信息,在终端输入:man nfs
。
另外一个挂载远程文件系统的选项就是使用autofs
工具或者创建一个 systemd 单元。
让我们通过在共享目录中创建新文件来测试对共享文件夹的访问。
首先,通过使用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
目录归属apache
用户,并且这个分享拥有root_squash
选项,该选项将 root 用户映射成nobody
用户和nogroup
用户组,导致 root 用户对远程共享文件没有写入权限。
假设apache
用户在客户端机器上存在,并且GID
和UID
也和远程服务器上一样(比如,你在服务器和客户机上都安装了 apache),你可以以apache
用户身份创建一个文件:
sudo -u apache touch /srv/www/test.txt
这个命令不会显示任何输出,意味着文件被成功创建。
想要验证成功创建,列出/srv/www
文件夹下的所有文件:
ls -la /srv/www
输出应该显示最新创建的文件:
drwxr-xr-x 3 apache apache 4096 Jun 23 22:18 .
drwxr-xr-x 3 root root 4096 Jun 23 22:29 ..
-rw-r--r-- 1 apache apache 0 Jun 23 21:58 index.html
-rw-r--r-- 1 apache apache 0 Jun 23 22:18 test.txt
如果你不再需要远程 NFS 共享,你可以使用 umount 命令卸载它。例如,想要卸载/backup
,你可以运行:
sudo umount /backups
如果挂载点被定义在/etc/fstab
文件,确保你移除了对应的行,或者使用#
在行首进行了注释。
在这篇指南中,我们为你演示了如何建立一个远程 NFS 服务器,以及如何在客户机上挂载远程文件系统。如果你在生产环境中使用 NFS,并且分享敏感数据,我们建议你启用 kerberos 身份验证和鉴权。
作为一个 NFS 替代方案,你可以使用 SSHFS,通过 SSH 连接来挂载远程目录。SSH 默认被加密,而且很容易配置和使用。