如何在Ubuntu上配置NFS

介绍

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》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

进程监控工具supervisor 启动Mongodb

进程监控工具supervisor 启动Mongodb 一什么是supervisor Superviosr是一个UNIX-like系统上的进程监控工具。 Supe...

4376
来自专栏Jerry的SAP技术分享

使用JDK自带的jmap和jhat监控处于运行状态的Java进程

对于处于运行状态中的Java进程,JDK自带了很多工具,允许Java开发人员监控运行进程中的各种状态,比如该进程内部创建了多少个对象实例,消耗了多少内存,等等。

1542
来自专栏机器学习算法工程师

Windows下如何安装xgboost

最近有童鞋在后台询问windows下如何安装xgboost的问题,然后燕哥在团队中一问,哎!还真的有小伙伴会。然后一篇xgboost安装教程就热乎乎地出炉喽~ ...

2815
来自专栏Pythonista

Golang之go 命令用法

(注:实际上,package名在Go语言规范中指代码中“package”后使用的名称,此名称可以与文件夹名不同。默认生成的可执行文件名是文件夹名。)

7802
来自专栏快乐八哥

前后端分离下如何登录

目前大多数Web应用采用前后端分离方式进行开发。所以前端网站或应用都属于SPA(Single Page Application)。如果前端,后台API部署在同域...

1.5K2
来自专栏Linux运维学习之路

本地yum仓库搭建及rpm软件包定制

环境内核信息: [root@zabbix-01 ~]# uname -a Linux lodboyedu-01 2.6.32-696.el6.x86_64 #1...

3575
来自专栏linux系统运维

exportfs命令,NFS客户端问题,FTP介绍,使用vsftpd搭建ftp

/tmp/ 192.168.209.129/24(rw,sync,no_root_squash)

3643
来自专栏Angular&服务

mac安装nvm

如果没有.bash_profile文件需要自行touch .bash_profile哦

1033
来自专栏linux系统运维

exportfs命令,NFS客户端问题,FTP介绍,使用vsftpd搭建ftp

2208
来自专栏乐沙弥的世界

基于Linux下 Oracle 备份策略(RMAN)

对于 Oracle 数据库的备份与恢复,尽管存在热备,冷备以及逻辑备份之外,使用最多的莫过于使用RMAN进行备份与恢复。而制定RMAN备份策

872

扫码关注云+社区

领取腾讯云代金券