NFS安装选项| NFS导出选项

时间:2020-02-23 14:40:38  来源:igfitidea点击:

在本文中,我们将通过示例了解最常用的NFS挂载选项和NFS导出选项。
我试图在示例中尽可能地简化,以便Linux初学者也可以理解这些内容,然后决定在其设置中使用相应的NFS挂载和导出选项。

NFS服务器和客户端之间可以实现两种权限

  • " NFS服务器端"(NFS导出选项)

  • " NFS客户端"(NFS挂载选项)

NFS导出选项

NFS导出选项是在"/etc/exports"下创建NFS共享时的权限"我们在NFS Server上应用"。

以下是Linux中最常用的NFS导出选项

安全与不安全的NFS导出选项示例

  • 使用secure时,客户端请求安装的端口号必须小于1024.

  • 默认情况下,"安全"权限是打开的。

  • 要关闭它,请指定insecure代替

下面我在NFS服务器上共享了/nfs_shares文件夹

[root@nfs-server ~]# cat /etc/exports
/nfs_shares     *(rw,no_root_squash)

如我们所见,默认情况下,NFS导出选项采用"安全"

[root@nfs-server ~]# exportfs -v
/nfs_shares     (sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

在这种情况下,"客户端将被迫使用小于1024的端口号"来访问NFS共享。
如我们所见,客户端正在使用端口867来访问共享。

[root@nfs-server ~]# netstat | grep nfs
tcp        0      0 nfs-server:nfs             10.10.10.16:867         ESTABLISHED

提示:

这是我们正在讨论的客户端端口,而不是服务器端口。
服务器端口是指NFS服务使用的端口。
NFSv4仅使用端口2049,而要检查NFSv3使用的端口列表,请使用rpcinfo -p

要允许客户端使用任何可用的免费端口,请在NFS共享中使用"不安全"

[root@nfs-server ~]# cat /etc/exports
/nfs_shares     *(rw,no_root_squash,insecure)

接下来重新导出股票

[root@nfs-server ~]# exportfs -r

验证NFS共享权限

[root@nfs-server ~]# exportfs -v
/nfs_shares     (sync,wdelay,hide,no_subtree_check,sec=sys,rw,insecure,no_root_squash,no_all_squash)

因此,现在客户端可以自由使用任何端口。
使用不安全并不意味着我们在强迫客户端使用大于1024的端口,客户端仍然可以使用小于1024的端口值,只是现在该客户端也将被允许连接到具有更高端口的NFS服务器不安全的端口号。

带有ro vs rw的NFS导出选项示例

我相信命名语法其中解释了定义。

  • " ro"表示对NFS共享的"只读"访问权限

  • rw表示对NFS共享的读写权限

"但是,如果我们将目录共享为只读但将NFS共享安装为可读写该怎么办?
"

在下面的示例中,我以只读权限共享了/nfs_shares

[root@nfs-server ~]# cat /etc/exports
/nfs_shares     *(ro,no_root_squash)

列出可用的共享

[root@nfs-server ~]# exportfs -v
/nfs_shares     (sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,no_root_squash,no_all_squash)

但是在NFS客户端上,"我将以读写权限挂载NFS共享"。

[root@nfs-client ~]# mount -o rw 10.10.10.12:/nfs_shares /mnt

验证安装是否成功。
如我们所见,NFS共享已安装为读写

[root@nfs-client ~]# mount | grep nfs
10.10.10.12:/nfs_shares on /mnt type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.10.10.16,local_lock=none,addr=10.10.10.12)

让我们尝试在客户端的NFS挂载点中创建文件

[root@nfs-client ~]# touch /mnt/file
touch: cannot touch 'file': Read-only file system

因此,我希望这很清楚,如果目录以只读方式共享,那么即使我们使用读写权限挂载共享,也不允许我们对该目录执行任何写操作。

root_squash与no_root_squash

  • 如果仔细阅读文本,文本本身会解释参数的含义。

  • 其中"squash"字面意思是挤压(破坏)远程根用户的能力或者不挤压远程根用户的能力。

  • root_squash阻止远程root用户在安装了NFS的远程卷上拥有超级用户(root)特权。

  • no_root_squash允许NFS客户端主机上的root用户以与超级用户通常具有的相同的权限访问NFS挂载的目录。

NFS导出选项root_squash示例

让我们通过一些例子来理解root_squash

我的NFS服务器上有一个目录/nfs_shares,具有700个权限。
因此,仅允许用户所有者在此目录中读取,写入和执行

[root@nfs-server ~]# ls -ld /nfs_shares
drwx------ 2 root root 4096 Apr 17 18:01 /nfs_shares

现在,此目录已使用/etc/exports通过NFS服务器共享。
我已授予读写权限,所有其他权限均设置为默认

[root@nfs-server ~]# cat /etc/exports
/nfs_shares     *(rw)

再出口股票

[root@nfs-server ~]# exportfs -r

列出共享目录

[root@nfs-server ~]# exportfs -v
/nfs_shares     (sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)

在客户端上,我将NFS共享安装到/mnt上。

[root@nfs-client ~]# mount -t nfs 10.10.10.12:/nfs_shares /mnt

接下来让我尝试导航到NFS挂载点

[root@nfs-client ~]# cd /mnt
-bash: cd: /mnt: Permission denied

其中因为我们使用了默认的NFS导出选项,所以 NFS共享将以nobody用户身份挂载。
此外,我们已经为/nfs_shares授予了700权限,这意味着 对其他人没有权限,因此不允许nouser用户执行任何操作。
/nfs_shares中的活动

接下来,我将在NFS服务器上向其他人授予对/nfs_shares的读取和执行权限。

[root@nfs-server ~]# chmod o+rx /nfs_shares
[root@nfs-server ~]# ls -ld /nfs_shares
drwx---r-x 2 root root 4096 Apr 19 11:37 /nfs_shares

现在,我将被允许在安装点内导航

[root@nfs-client ~]# cd /mnt

但是由于没有写权限,所以甚至连root用户都不能在/mnt里面写。

[root@nfs-client mnt]# touch file
touch: cannot touch 'file': Permission denied

接下来,我还将对/nfs_shares授予写权限(因此现在其他人对/nfs_shares具有完全访问权限)

[root@nfs-server ~]# chmod o+w /nfs_shares
[root@nfs-server ~]# ls -ld /nfs_shares
drwx---rwx 2 root root 4096 Apr 19 11:37 /nfs_shares

现在,我应该被允许在/mnt(安装了/nfs_shares)内部进行写操作

[root@nfs-client mnt]# touch file

不出所料,我们能够创建一个文件,并且该文件是在没有用户和组权限的情况下创建的,就像我们在NFS共享上使用root_squash一样

[root@nfs-client mnt]# ls -l
total 4
-rw-r--r-- 1 nobody nobody  0 Apr 19  2017 file
-rw-r--r-- 1 root   root   10 Apr 19  2017 file1

重要的提示:

由于我们已经授予其他用户完全权限,因此在客户端,该用户还将有权删除root用户拥有的file1. 为了防止这种情况,我们还必须实现粘性位以增强安全性,这将限制客户端节点上的用户删除其他用户拥有的文件。

NFS导出选项no_root_squash示例

接下来让我们看看no_root_squash的行为

我将在NFS服务器上更新NFS导出选项以使用no_root_squash

[root@nfs-server ~]# cat /etc/exports
/nfs_shares     *(rw,no_root_squash)

再出口股票

[root@nfs-server ~]# exportfs -r

列出NFS服务器上NFS共享的属性

[root@nfs-server ~]# exportfs -v
/nfs_shares     (sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

提示:

我既没有重新启动也没有在NFS服务器上重新加载我的nfs-server服务。
由于我们已经使用了exportfs -r,所以这将重新导出具有新属性的所有股票。

如果我创建一个新文件,现在在NFS客户端上

[root@nfs-client mnt]# touch new_file

因此,新文件是在具有root权限的情况下创建的。

[root@nfs-client mnt]# ls -l
total 0
-rw-r--r-- 1 nobody nobody 0 Apr 19  2017 file
-rw-r--r-- 1 root   root   0 Apr 19  2017 new_file

这应该证明NFS共享是以root用户使用no_root_squash来访问的事实。

了解all_quash与no_all_squash

  • all_squash将所有用户ID(UID)和组ID(GID)映射到匿名用户。

  • all_squash对于NFS导出的公共FTP目录,新闻假脱机目录很有用

  • 默认情况下,将no_all_squash应用于NFS共享

了解同步与aysnc

  • 使用sync,仅在将更改提交到稳定存储后才对请求进行回复

  • 尽管async允许NFS服务器违反NFS协议并在对该请求进行的任何更改提交到稳定存储之前回复该请求

  • 使用aysnc选项通常可以提高性能,但是代价是不干净的服务器重启(即崩溃)可能导致数据丢失或者损坏。

说明:

我只介绍了一些最常用的NFS导出选项,我们还在实时生产环境中使用了更多选项,例如no_subtree_checkfsid,这些选项大多是理论上的,我们应该从导出的官方手册页中了解它。

带挂载的NFS挂载选项

NFS挂载选项是"我们将用于在NFS客户端上挂载NFS共享"的选项。

以下是我们将在本文中通过不同的示例了解的最常用的NFS挂载选项。

硬安装与软安装

  • 默认情况下,所有NFS共享都以硬挂载方式挂载

  • 如果NFS操作发生严重超时,则使用硬安装时,会报告"服务器未响应"消息,并且客户端将继续无限期地尝试

  • 如果NFS服务器变得不可访问,则通过硬安装有可能使在NFS共享上执行操作的客户端不确定地卡住

  • 软安装允许客户端在retrams = n指定的重试次数后使连接超时

NFS挂载选项硬挂载示例

在这个NFS挂载点示例中,我将使用hard挂载来挂载NFS共享。

[root@nfs-client ~]# mount -o hard 10.10.10.12:/nfs_shares /mnt

检查共享属性,以确保实现了硬安装。

[root@nfs-client ~]# mount | grep /mnt
10.10.10.12:/nfs_shares on /mnt type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=60,retrans=2,sec=sys,clientaddr=10.10.10.16,local_lock=none,addr=10.10.10.12)

接下来,我将创建一个小的脚本以写入NFS共享并在屏幕上打印,以便我们了解进度或者脚本:

[root@nfs-client ~]# cat /tmp/script.sh
#!/bin/bash
for (( i=0; i<1000; i++ )); do 
        # Echo to the file available under /nfs_shares mount point 
        echo $i >> /mnt/file;
	# Also print on STDOUT
        echo $i
	
	# Sleep for 1 second after each write
        sleep 1;
done

接下来,我在客户端节点上执行了脚本

[root@nfs-client ~]# /tmp/script.sh
0
1
2
3
4
<- 在这里,我们停止了nfs服务器节点上的nfs服务器服务

在打印" 4"之后的执行过程中,我停止了nfs-server服务

[root@nfs-server ~]# systemctl stop nfs-server

在客户端节点上,我开始在/var/log/messages中获取这些消息。

Apr 19 04:00:54 nfs-client.example.com kernel: nfs: server 10.10.10.12 not responding, still trying
Apr 19 04:01:55 nfs-client.example.com kernel: nfs: server 10.10.10.12 not responding, timed out
Apr 19 04:02:13 nfs-client.example.com kernel: nfs: server 10.10.10.12 not responding, timed out
Apr 19 04:02:19 nfs-client.example.com kernel: nfs: server 10.10.10.12 not responding, timed out
Apr 19 04:02:31 nfs-client.example.com kernel: nfs: server 10.10.10.12 not responding, timed out

然后,我启动了NFS服务器服务,之后客户端能够与NFS服务器建立连接

Apr 19 04:08:20 nfs-client.example.com kernel: nfs: server 10.10.10.12 OK

然后我们在客户端节点上的脚本再次开始在NFS共享上写入

[root@nfs-client ~]# /tmp/script.sh
0
1
2
3
4
<- 在这里,我们停止了nfs服务器节点上的nfs服务器服务
一旦启动NFS服务器服务,脚本就会继续编写
5
6
7
8
9

因此,我们发现"硬挂载不会造成数据丢失"

NFS硬安装的优缺点

  • 硬装载的缺点是,这将消耗系统上的更多资源,因为客户端将保持写入过程,直到NFS服务器启动。

  • 它可以用于任务关键型系统,在该系统中,数据更重要,以确保在写入NFS共享时不会丢失数据。

NFS挂载选项"软挂载"示例

在我们的NFS挂载选项示例中,让我们还检查NFS软挂载的行为"

首先,我将卸载NFS共享。
尽管我也可以重新安装,但让我们保持简单。

[root@nfs-client ~]# umount /mnt

然后,我将进行"软"装载以及更多的值,例如" retrans = 2和timeo = 60",因此客户端将以60秒的间隔传输两个数据包,然后将NFS服务器声明为不可访问。

[root@nfs-client ~]# mount -o nfsvers=4,soft,retrans=2,timeo=60 10.10.10.12:/nfs_shares /mnt

验证客户端上的NFS挂载选项

[root@nfs-client ~]# mount | grep /mnt
10.10.10.12:/nfs_shares on /mnt type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,soft,proto=tcp,timeo=60,retrans=2,sec=sys,clientaddr=10.10.10.16,local_lock=none,addr=10.10.10.12)

接下来,我们将再次执行脚本

[root@nfs-client ~]# /tmp/script.sh
0
1
2
3
4
5
<- 在这个阶段,我停止了服务器上的nfs服务器服务

其中我已经停止了nfs-server服务,以使我的服务器无法访问。

[root@nfs-server ~]# systemctl stop nfs-server

几秒钟后,我们开始在/var/log/messages中收到以下警报,类似于hard挂载

Apr 19 04:19:32 nfs-client.example.com kernel: nfs: server 10.10.10.12 not responding, timed out
Apr 19 04:19:50 nfs-client.example.com kernel: nfs: server 10.10.10.12 not responding, timed out
Apr 19 04:20:09 nfs-client.example.com kernel: nfs: server 10.10.10.12 not responding, timed out
Apr 19 04:20:17 nfs-client.example.com kernel: nfs: server 10.10.10.12 not responding, timed out

但是,即使脚本未能在NFS共享上写入,脚本仍会继续执行。

[root@nfs-client ~]# /tmp/script.sh
0
1
2
3
4
5
/tmp/script.sh: line 3: /mnt/file: Input/output error
6
/tmp/script.sh: line 3: /mnt/file: Input/output error
7

NFS软安装的优缺点

  • 因此,这可能会导致"实时环境中的数据丢失"。

  • 尽管在此示例中,如果我启动nfs-server,则服务器将再次可访问,而客户端将再次开始写入NFS共享,但是当我们的NFS服务器无法访问时,该数据将丢失。

  • 因此,在"数据很重要"的生产环境中,建议使用硬挂载作为首选的NFS挂载选项。

挂载NFS共享时定义NFS版本

  • 我们可以显式定义要用于挂载NFS共享的NFS版本。

  • 默认情况下,RHEL/CentoS 7/8支持NFSv3和NFSv4(除非我们已明确禁用它们中的任何一个)。

  • 因此,客户端可以选择一个选项,以定义要用于连接到NFS服务器的NFS版本

  • 我们可以使用nfsvers = n来定义NFS版本

例如:使用NFSv4挂载NFS共享。

[root@nfs-client ~]# mount -o nfsvers=4 10.10.10.12:/nfs_shares /mnt

类似于使用NFSv3挂载NFS共享

[root@nfs-client ~]# mount -o nfsvers=3 10.10.10.12:/nfs_shares /mnt

提示:

从RHEL/CentOS 7开始,仅正式支持NFSv3和NFSv4.

推荐的NFS挂载选项

使用wsize和rsize挂载选项

  • rsize和wsize没有默认值。
    默认值是使用客户端和服务器都支持的最大值。

  • 如果在挂载选项中未指定rsize/wsize,则客户端将查询服务器,并且将使用两个都支持的最大大小。

  • 如果在挂载选项中指定了rsize/wsize,并且超过了客户端或者服务器支持的最大值,则客户端将使用两个都支持的最大大小。

  • 但是,根据系统资源和要求,我们可以选择定义自己的rsizewsize

我们可以使用定义自己的wsizersize

[root@nfs-client ~]# mount -o nfsvers=4,wsize=65536,rsize=65536 10.10.10.12:/nfs_shares /mnt

验证新属性

[root@nfs-client ~]# mount | grep /mnt
10.10.10.12:/nfs_shares on /mnt type nfs4 (rw,relatime,vers=4.2,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.10.10.16,local_lock=none,addr=10.10.10.12)

有关使用不同Red Hat内核支持的最大读写大小的更多详细信息,请检查使用NFS挂载的rsize和wsize的默认值和最大值是多少?

使用intr挂载选项

  • 当进程进行系统调用时,内核将接管该动作。

  • 在内核处理系统调用的过程中,进程可能无法控制自己。

  • 但是,如果出现错误,可能会很麻烦。

  • 因此,NFS可以选择使用可中断标志来挂载文件系统(" intr"选项),这使正在等待NFS请求的进程放弃并继续前进。

  • 通常,除非我们有理由不使用intr选项,否则通常是一个好主意。

使用bg和fg NFS挂载选项

  • 我不会盲目推荐它,这主要取决于用例。

  • 如果安装失败,这些选项可用于选择重试行为。

  • bg选项使挂载尝试在后台运行。

  • fg选项使挂载尝试在前台运行。

  • 默认值为fg,它是必须可用的文件系统的最佳选择。
    该选项将阻止进一步的处理,直到安装完成。

  • bg对于非关键文件系统是一个很好的选择,因为客户端可以在等待安装请求完成的同时进行其他处理。

带Fstab的NFS挂载选项

如果使用mount命令安装共享,则更改仅对于当前会话是完整的,并且在重新启动后,我们将不得不再次安装NFS共享

要进行持久更改,我们必须在/etc/fstab中使用NFS共享详细信息创建一个新条目。
/etc/fstab中,我们可以为共享路径定义任何其他NFS挂载选项。

例如:在这个NFS挂载选项示例中,我将挂载/nfs_shares路径作为软挂载,NFSv3,超时值为600和retrans值为5.

10.10.10.2:/nfs_shares  /mnt    nfs     defaults,soft,nfsvers=3,timeo=60,retrans=5         0 0

保存并退出/etc/fstab文件

接下来执行mount -a/etc/fstab挂载所有路径。

# mount -a

接下来,验证客户端上的安装点。

# mount | grep nfs