前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Ubuntu上配置NFS

如何在Ubuntu上配置NFS

原创
作者头像
编程男孩
发布2018-07-31 16:09:24
1.7K0
发布2018-07-31 16:09:24
举报

介绍

NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。

在本教程中,我们将介绍如何配置挂载NFS。

准备

我们将在本教程中使用两个服务器:一个存储共享的文件,一个管理这些文件

  • 两台Ubuntu 16.04服务器,每台服务器都有一个非root用户,具有sudo权限,腾讯云给您配置好了这些,没有服务器的同学可以在这个页面购买,或免费试用腾讯云开发者实验室体验 Ubuntu 系统 CVM

我们将存储文件的服务器称为服务端,上传文件的服务器叫做客户端。为了简便,我们用以下两个IP地址代替:

  • 服务端:203.0.113.0
  • 客户端:203.0.113.256

实际的操作过程中,请把上面的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权限。

示例1:通用共享

在第一个示例中,我们将创建一个使用默认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

此目录现在可以导出了。

示例2:主目录共享

在我们的第二个示例中,目标是使存储在服务端的用户主目录在客户端上可用,同时允许这些客户端的受信任管理员方便地管理用户。

为此,我们将导出/home目录。由于它已经存在,我们不需要创建它。我们也不会更改权限。如果我们这样做,就会出现各种不可预料的问题。

第三步、在服务端上配置NFS导出

接下来,我们将深入了解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以外。让我们来看看每个词的意思。

  • rw:此选项为客户端提供对文件的读写访问权限。
  • sync:此选项强制NFS在回复之前将更改写入磁盘。这样会使你的服务器更稳定。但是,它也会降低文件操作的速度。
  • no_subtree_check:此选项可防止树状检查。在客户端打开文件时重命名文件时,可能会发生错误,建议您禁止这个选项。
  • no_root_squash:默认情况下,NFS将来自root用户的请求远程转换为服务器上的非特权用户。这旨在作为安全功能,以防止客户端上的root帐户以root身份使用主机的文件系统。 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

这些命令应将共享从服务端挂载到客户端上。你可以通过多种方式仔细检查它们是否成功安装。你可以使用mountfindmnt检查这一点,但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的可用空间。

第七步、测试NFS访问

接下来,让我们通过向每个人写一些内容来测试对共享的访问。

示例1:通用共享

首先,将测试文件写入/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挂载的共享上执行管理操作,如更改文件的所有者或为一组用户创建新目录。

示例2:主目录共享

要比较通用共享与主目录共享的权限,请以相同的方式创建文件主目录:

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目录

我们可以通过将远程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远程共享

如果你不想连接到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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 准备
  • 第一步、下载和安装组件
    • 在服务端上
      • 在客户端上
      • 第二步、在服务端创建共享目录
        • 示例1:通用共享
          • 示例2:主目录共享
          • 第三步、在服务端上配置NFS导出
          • 第四步、调整主机上的防火墙
          • 第五步、在客户端上创建挂载点
          • 第六步、在客户端上安装目录
          • 第七步、测试NFS访问
            • 示例1:通用共享
              • 示例2:主目录共享
              • 第八步、在客户端开机时自动挂载远程NFS目录
              • 第九步、卸载NFS远程共享
              • 结论
              相关产品与服务
              云开发 CloudBase
              云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档