NFS安装选项| NFS导出选项
在本文中,我们将通过示例了解最常用的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_check
和fsid
,这些选项大多是理论上的,我们应该从导出的官方手册页中了解它。
带挂载的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
,并且超过了客户端或者服务器支持的最大值,则客户端将使用两个都支持的最大大小。但是,根据系统资源和要求,我们可以选择定义自己的
rsize
和wsize
值
我们可以使用定义自己的wsize
和rsize
[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