如何在 Ubuntu 18.04 上安装和配置 NFS 服务器
温馨提示:这篇文章已超过635天没有更新,请注意相关的内容是否还可用!
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 权限。 它将会将 rootUID和GID映射到nobody/nogroup的UID和GID。
对于那些通过客户端机器访问的用户,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 文件系统的工具.
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/backupsubuntu web服务器配置,而使用/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用户在客户端机器上存在,并且GID和UID也和远程服务器上一样(比如ubuntu web服务器配置,你在服务器和客户机上都安装了 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 默认被加密,而且很容易配置和使用。