NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
在本教程中,我们将介绍如何配置挂载NFS。
我们将在本教程中使用两个服务器:一个存储共享的文件,一个管理这些文件
我们将存储文件的服务器称为服务端,上传文件的服务器叫做客户端。为了简便,我们用以下两个IP地址代替:
实际的操作过程中,请把上面的IP地址替换成你自己的IP地址。
我们首先在每台服务器上安装必要的组件。
在服务端上,我们将安装nfs-kernel-server
包,这将允许我们共享我们的目录。安装任何新包之前,务必更新一下本地软件包,然后在安装:
sudo apt-get update
sudo apt-get install nfs-kernel-server
安装这些软件包后,切换到客户端。
在客户端上,我们需要安装一个名为nfs-common
的软件包,它提供NFS功能,而不包括不需要的服务器组件。同上:
sudo apt-get update
sudo apt-get install nfs-common
既然两台服务器都安装必要的软件包,我们就可以开始配置它们。
我们将分享两个具有不同配置设置的独立目录,以说明可以针对超级用户访问配置NFS挂载的两种主要方式。
Root可以在他们的系统的任何地方做任何事情。但是,挂载的NFS目录不是它们的系统的一部分,因此默认情况下,NFS服务器拒绝执行需要超级用户特权的操作。这个默认限制意味着客户端上的超级用户不能作为root
用户、重新分配所有权或者在NFS装载上执行任何其他超级用户任务。
然而,有时客户端系统上有值得信任的用户,他们需要能够在挂载的文件系统上执行这些操作,但不需要在主机上用超级账户访问主机。可以将NFS服务器配置为允许这样做,但是这会带来风险,因为这样的用户可以获得对整个主机系统root
权限。
在第一个示例中,我们将创建一个使用默认NFS的通用NFS挂载,你可以使用类似的内容来存储使用内容管理系统上传的文件,或者为用户创建空间共享项目文件。
首先,创建一个名为nfs
的共享目录:
sudo mkdir /var/nfs/general -p
由于我们是用sudo
创建的,因此该目录是归root所有。
ls -la /var/nfs/general
4 drwxr-xr-x 2 root root 4096 Jul 25 15:26 .
为了安全,NFS会将客户端上的任何root
操作转换为nobody:nogroup
凭据。因此,我们需要更改目录所有权以匹配这些凭据。
sudo chown nobody:nogroup /var/nfs/general
此目录现在可以导出了。
在我们的第二个示例中,目标是使存储在服务端的用户主目录在客户端上可用,同时允许这些客户端的受信任管理员方便地管理用户。
为此,我们将导出/home
目录。由于它已经存在,我们不需要创建它。我们也不会更改权限。如果我们这样做,就会出现各种不可预料的问题。
接下来,我们将深入了解NFS配置文件以设置这些资源的共享。
用nano
或者你喜欢的文本编辑器打开/etc/exports
文件,记得添加sudo
:
sudo nano /etc/exports
在这个文件中,每一行的后面,都会有一小段注释,如下所示:
directory_to_share client(share_option1,...,share_optionN)
我们需要为我们计划共享的每个目录创建一行。由于我们的示例客户端IP是 203.0.113.256
,因此我们的行将如下所示。请务必把IP改成你自己的:
/var/nfs/general 203.0.113.256(rw,sync,no_subtree_check)
/home 203.0.113.256(rw,sync,no_root_squash,no_subtree_check)
我们对两个目录使用相同的配置选项,除了no_root_squash
以外。让我们来看看每个词的意思。
no_root_squash
禁用某些共享的此行为。完成更改后,保存并关闭文件。然后,重启NFS服务器:
sudo systemctl restart nfs-kernel-server
但是,在实际使用新共享之前,你需要确保防火墙规则允许共享流量
首先,让我们防火墙的状态,看看NFS服务能不能用:
sudo ufw status
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
在我们的系统上,只允许SSH流量,因此我们需要为NFS流量添加规则。
你可以使用sudo ufw app list
然后按名字启用它们,但nfs
不行。因为ufw
还检查/etc/services
服务的端口和协议。最佳做法建议你启用限制性最强的规则,该规则仍允许你要允许的流量,因此我们将具体说明,而不是从任何地方启用流量。
使用以下命令在主机上打开2049端口,确保替换客户端的IP地址:
sudo ufw allow from 203.0.113.256 to any port 2049
你可以输入以下内容来验证更改:
sudo ufw status
你应该在输出中看到端口2049允许的流量:
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
2049 ALLOW 203.0.113.256
OpenSSH (v6) ALLOW Anywhere (v6)
这确认了UFW将仅允许来自客户端的端口2049上的NFS流量。
现在服务端已配置并提供其共享,我们将为客户端做好准备。
为了使客户端上的远程共享可用,我们需要在空客户端目录上挂载远程主机目录。
注意:如果挂载点中有文件和目录,则一旦挂载NFS共享,它们就会被隐藏。确保是否已安装在一个空目录。
我们将为我们的挂载创建两个目录:
sudo mkdir -p /nfs/general
sudo mkdir -p /nfs/home
既然我们有一些地方放置远程共享并且我们已经打开了防火墙,我们可以通过IP地址来安装共享,在本教程中203.0.113.0
如下:
sudo mount 203.0.113.0:/var/nfs/general /nfs/general
sudo mount 203.0.113.0:/home /nfs/home
这些命令应将共享从服务端挂载到客户端上。你可以通过多种方式仔细检查它们是否成功安装。你可以使用mount
或findmnt
检查这一点,但df -h
会为你提供更多输出,说明nfs共享的磁盘使用情况有何不同:
df -h
Filesystem Size Used Avail Use% Mounted on
udev 238M 0 238M 0% /dev
tmpfs 49M 628K 49M 2% /run
/dev/vda1 20G 1.2G 18G 7% /
tmpfs 245M 0 245M 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 245M 0 245M 0% /sys/fs/cgroup
tmpfs 49M 0 49M 0% /run/user/0
203.0.113.0:/home 20G 1.2G 18G 7% /nfs/home
203.0.113.0:/var/nfs/general 20G 1.2G 18G 7% /nfs/general
我们安装的两个挂载都显示在底部。因为它们是从同一文件系统挂载的,所以它们显示相同的磁盘使用情况。要查看每个安装点下实际使用的空间大小,请使用disk usage命令du
。 -s
标志将提供使用情况摘要。-h
将打印出能看到懂的输出。
du -sh /nfs/home
36K /nfs/home
这向我们展示了整个主目录的内容仅使用了36K的可用空间。
接下来,让我们通过向每个人写一些内容来测试对共享的访问。
首先,将测试文件写入/var/nfs/general
。
sudo touch /nfs/general/general.test
然后,检查其所有权:
ls -l /nfs/general/general.test
Output-rw-r--r-- 1 nobody nogroup 0 Aug 1 13:31 /nfs/general/general.test
因为我们在不更改NFS的默认行为的情况下安装了此卷并通过sudo
命令将文件创建为客户端计算机的root用户,所以文件的所有权默认为nobody:nogroup。客户端root将无法在此NFS挂载的共享上执行管理操作,如更改文件的所有者或为一组用户创建新目录。
要比较通用共享与主目录共享的权限,请以相同的方式创建文件主目录:
sudo touch /nfs/home/home.test
然后查看文件的所有权:
ls -l /nfs/home/home.test
-rw-r--r-- 1 nobody nogroup 0 Aug 1 13:31 /nfs/general/general.test
我们home.test
通过sudo
命令以root身份创建,与创建general.test
文件的方式完全相同。但是,在这种情况下,它由root拥有,因为当我们no_root_squash
在此挂载上指定选项时,会覆盖默认行为。这允许客户端计算机上的root用户充当root用户,并使用户帐户的管理更加方便。同时,这意味着我们不必在主机上为这些用户提供root访问权限。
我们可以通过将远程NFS共享添加到客户端上的/etc/fstab
文件,来自动挂载远程NFS共享的文件。
打开这个这个文件,不要忘了添加root
:
sudo nano /etc/fstab
在文件的底部,我们将为每个共享添加一行。它们看起来像这样:
. . .
203.0.113.0:/var/nfs/general /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
203.0.113.0:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
注意:有关在此指定的选项的更多信息,请参考NFS的安装手册。
客户端服务器将在开机时自动挂载远程分区,但可能需要一些时间才能建立连接。
如果你不想连接到NFS服务端,那就卸载,卸载命令如下所示:
cd ~
sudo umount /nfs/home
sudo umount /nfs/general
这将删除远程共享,只允许你访问本地存储:
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda 59G 1.3G 55G 3% /
none 4.0K 0 4.0K 0% /sys/fs/cgroup
udev 2.0G 12K 2.0G 1% /dev
tmpfs 396M 320K 396M 1% /run
none 5.0M 0 5.0M 0% /run/lock
none 2.0G 0 2.0G 0% /run/shm
none 100M 0 100M 0% /run/user
如果你还想在下次开机自动挂载NFS目录,可以再一次编辑/etc/fstab
,也就是再执行一次上步骤。
在本教程中,我们创建了一个NFS主机,并通过创建两个不同的NFS挂载来说明一些关键的NFS行为,我们与NFS客户端共享这些挂载。如果您是在公网环境下进行挂载,我强烈建议您使用SSHFS等协议进行挂载,关于SSHFS使用您可以参考这篇文章进行安装。更多Linux教程请前往腾讯云+社区学习。
参考文献:《How To Set Up an NFS Mount on Ubuntu 16.04》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有