快速使用NFS(以centos7为例)
只想快速搭建一套nfs系统的童鞋,看到这一章就可以啦~
预设值:
服务端:192.168.100.254
客户端:192.168.100.10
1、安装
服务端与客户端:
[root@www ~]# yum install nfs-utils
2、配置与运行
服务器端:
[root@www ~]# mkdir -p /home/public
[root@www ~]# vi /etc/exports
/home/public 192.168.100.0/24(rw) *.ev.ncku.edu.tw(ro,sync)
[root@www ~]# systemctl start rpcbind
[root@www ~]# systemctl enable rpcbind
[root@www ~]# systemctl start nfs
[root@www ~]# systemctl enable nfs
后期添加时,无需重启,只需重新加载
[root@www ~]# exportfs -a
检查:
[root@www ~]# showmount -e localhost
客户端:
[root@www ~]# systemctl start rpcbind
[root@www ~]# systemctl enable rpcbind
[root@clientlinux ~]# mkdir -p /home/nfs/public
[root@clientlinux ~]# mount -t nfs 192.168.100.254:/home/public /home/nfs/public
检查:
[root@clientlinux ~]# mount
或者
[root@clientlinux ~]# df -h
测试目录读写权限等:
[root@clientlinux ~]# cd /home/nfs/public
[root@clientlinux ~]# touch test.txt
[root@clientlinux ~]# cat test.txt
测试结束后记得删除:
[root@clientlinux ~]# rm test.txt
目录
NFS 网络文件系统 介绍、安装与使用
想要了解更多的童鞋,或者对上一部分存在疑惑的童靴欢迎继续往下看~
推荐查看(小编所有的介绍都是基于这篇文章,相当详细,详细到不行的地步):
鸟哥对NFS的介绍:http://cn.linux.vbird.org/linux_server/0330nfs.php
1、什么是NFS?
Network File System(NFS),网络文件系统,可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的文件。这个 NFS 服务器可以让你的 PC 来将网络远程的 NFS 服务器分享的目录,挂载到本地端的机器当中, 在本地端的机器看起来,那个远程主机的目录就好像是自己的一个磁盘分区槽一样。
NFS 依赖 RPC,最主要的功能就是在指定每个 NFS 功能所对应的端口数字,并且回报给客户端,让客户端可以连结到正确的端口上去。
NFS 配置权限,需要注意目录的使用账号对应UID,服务器是否允许写入,NFS 文件系统是否配置有写入权限。
2、NFS怎么用呢?
2.1 安装
NFS 会直接使用到内核功能,所以你的内核必须要有支持 NFS 才行。因此你的内核版本要大于等于 2.2 版,查看内核版本的方法:
[root@www ~]# uname -srm
Linux 3.10.0-957.12.2.el7.x86_64 x86_64
解释一下Linux 3.10.0-957.12.2.el7.x86_64 x86_64:
3 - 内核版本.
10 - 主修订版本.
0-957 - 次要修订版本.
12 - 补丁版本.
NFS分为NFS服务端和NFS客户端两种角色,服务端就是本地存放文件的地方,而客户端可以远程访问文件。服务端和客户端都需要安装:
yum安装时会自动关联依赖:rpcbind
[root@www ~]# yum install nfs-utils
2.2 服务端
(1)结构
- 配置文件:/etc/exports
- 登录档案:/var/lib/nfs/目录下,一个文件是 etab ,主要记录了 NFS 所分享出来的目录的完整权限设定值;另一个 xtab 文件则记录曾经链接到此 NFS 服务器的相关客户端数据。
- 相关命令:/usr/sbin/exportfs(取消或分享目录)、/usr/sbin/showmount(查看 NFS 分享出来的目录资源)
(2)用法
[root@www ~]# vi /etc/exports
/tmp 192.168.100.0/24(ro) localhost(rw) *.ev.ncku.edu.tw(ro,sync)
[分享目录] [第一部主机(权限)] [可用主机名] [可用通配符]
关于配置文件的解释说明:
每一行最前面是要分享出来的目录,注意喔!是以目录为单位啊! 然后这个目录可以依照不同的权限分享给不同的主机。
主机后面以小括号 () 设计权限参数, 若权限参数不止一个时,则以逗号","分开,且不能有空格。且主机名与小括号是连在一起的,也不能有空格!
名词解释:
参数值 | 内容说明 |
rw ro | 该目录分享的权限是可擦写 (read-write) 或只读 (read-only),但最终能不能读写,还是与文件系统的 rwx 及身份有关。 |
sync async | sync 代表数据会同步写入到内存与硬盘中,async 则代表数据会先暂存于内存当中,而非直接写入硬盘! |
no_root_squash root_squash | 客户端使用 NFS 文件系统的账号若为 root 时,系统该如何判断这个账号的身份?预设的情况下,客户端 root 的身份会由 root_squash 的设定压缩成 nfsnobody, 如此对服务器的系统会较有保障。但如果你想要开放客户端使用 root 身份来操作服务器的文件系统,那么这里就得要开 no_root_squash 才行! |
all_squash | 不论登入 NFS 的使用者身份为何, 他的身份都会被压缩成为匿名用户,通常也就是 nobody(nfsnobody) 啦! |
anonuid anongid | anon 意指 anonymous (匿名者) 前面关于 *_squash 提到的匿名用户的 UID 设定值,通常为 nobody(nfsnobody),但是你可以自行设定这个 UID 的值!当然,这个 UID 必需要存在于你的 /etc/passwd 当中! anonuid 指的是 UID 而 anongid 则是群组的 GID 啰。 |
示例:
[root@www ~]# mkdir /home/public
[root@www ~]# setfacl -mg:vbirdgroup:rwx /home/public
[root@www ~]# mkdir /home/test
[root@www ~]# setfacl -mu:dmtsai:rwx /home/test
[root@www ~]# groupadd -g 45 nfsanon
[root@www ~]# useradd -u 45 -g nfsanon nfsanon
[root@www ~]# mkdir /home/linux
[root@www ~]# setfacl -mu: nfsanon:rwx /home/linux
[root@www ~]# vi /etc/exports
#1.任何人都可以用我的/tmp ,用*来处理主机名称,重点在no_root_squash
/tmp *(rw,no_root_squash)
#2.任何人都可以读取我的/home/public,但只有来自我的区域网路192.168.100.0/24 这个网域且加入vbirdgroup的用户才能够读写
/home/public 192.168.100.0/24(rw) *(ro)
#3.仅给某个单一主机使用的目录设定,使用者的身份是dmtsai 才具有完整的权限
/home/test 192.168.100.10(rw)
#4.开放匿名登入,那么重点是all_squash,并且要配合anonuid喔喔,这样在写入目录时,该目录的所有人与所有群组,就会变成/etc/passwd 里面对应的UID 为45的那个身份的使用者
/home/linux *.centos.vbird(rw,all_squash,anonuid=45,anongid=45)
场景体验:
用户1:与服务器拥有相同的uid和账号
假设我在192.168.100.10 登入这部NFS (IP 假设为192.168.100.254) 伺服器,并且我在192.168.100.10 的帐号为dmtsai 这个身份,同时,在这部NFS 上面也有dmtsai 这个帐号, 并具有相同的UID ,果真如此的话,那么:
1、由于192.168.100.254 这部NFS 伺服器的/tmp 权限为-rwxrwxrwt ,所以我(dmtsai 在192.168.100.10 上面) 在/tmp 底下具有存取的权限,并且写入的档案所有人为dmtsai ;
2、在/home/public 当中,由于我有读写的权限,所以如果在/home/public 这个目录的权限对于dmtsai 有开放写入的话,那么我就可以读写,并且我写入的档案所有人是dmtsai 。但是万一 /home/public 对于dmtsai 这个使用者并没有开放可以写入的权限时, 那么我还是没有办法写入档案喔!这点请特别留意!
3、在/home/test 当中,我的权限与/home/public 相同的状态!还需要NFS 伺服器的/home/test 对于 dmtsai 有开放权限;
4、在/home/linux 当中就比较麻烦!因为不论你是何种user ,你的身份一定会被变成UID=45 这个帐号!所以,这个目录就必需要针对UID = 45 的那个帐号名称,修改他的权限才行!用户2:与服务器的账号并不相同
假如我在192.168.100.10 的身份为vbird (uid 为600),但是192.168.100.254 这部NFS 主机却没有uid=600 的帐号时,情况会变成怎样呢?
1、我在/tmp 底下还是可以写入,只是该档案的权限会保持为UID=600 ,因此伺服器端看起来就会怪怪的, 因为找不到UID=600 这个帐号的显示,故档案拥有者会填上600 呦!
2、我在/home/public 里面是否可以写入,还需要视/home/public 的权限而定,不过,由于没有加上all_squash 的参数, 因此在该目录下会保留用户端的使用者UID,同上一点所示。
3、/home/test 的观点与/home/public 相同!
4、/home/linux 底下,我的身份就被变成UID = 45 那个使用者就是了!用户3:root
假如我在192.168.100.10 的身份为root 呢?root 这个帐号每个系统都会有呀!权限变成怎样呢?1、我在/tmp 里面可以写入,并且由于no_root_squash 的参数,改变了预设的 root_squash 设定值,所以在/tmp 写入的档案所有人为root 喔!
2、我在/home/public 底下的身份还是被压缩成为nobody 了!因为预设属性里面都具有 root_squash 呢!所以,如果/home/public 有针对nobody 开放写入权限时,那么我就可以写入,但是档案所有人变成nobody 就是了!
3、/home/test 与/home/public 相同;
4、/home/linux 的情况中,我root 的身份也被压缩成为UID = 45 的那个使用者了!
(3)运行
#启动
[root@www ~]# /etc/init.d/rpcbind start
#如果rpcbind本来就已经在执行了,那就不需要启动啊!
[root@www ~]# /etc/init.d/nfs start
#有时候某些distributions可能会出现如下的警告讯息:
exportfs: /etc/exports [3]: No 'sync' or 'async' option specified
for export "192.168.100.10:/home/test".
Assuming default behaviour ('sync').
# 上面的警告讯息仅是在告知因为我们没有指定sync 或async 的参数,
# 则NFS 将预设会使用sync 的资讯而已。你可以不理他,也可以加入/etc/exports。
[root@www ~]# /etc/init.d/nfslock start
#如果你想要增加一些 NFS 服务器的数据一致性功能时,可能需要用到 rpc.lockd 及 rpc.statd 等 RPC 服务, 那么或许你可以增加一个服务,那就是 nfslock 啰!
#自启动设置
[root@www ~]# chkconfig rpcbind on
[root@www ~]# chkconfig nfs on
[root@www ~]# chkconfig nfslock on
查看是否正常启动(带有NFSD和rpc.statd的字段的相关说明):
[root@www ~]# tail /var/log/messages
Jul 27 17:10:39 www kernel: Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
Jul 27 17:10:54 www kernel: NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state
recovery directory
Jul 27 17:10:54 www kernel: NFSD: starting 90-second grace period
Jul 27 17:11:32 www rpc.statd[3689]: Version 1.2.2 starting
在确认启动没有问题之后,接下来我们来瞧一瞧那么NFS 到底开了哪些端口?
[root@www ~]# netstat -tulnp| grep -E '(rpc|nfs)'
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:875 0.0.0.0:* LISTEN 3631/rpc.rquotad
tcp 0 0 0.0.0.0: 111 0.0.0.0:* LISTEN 3601/rpcbind
tcp 0 0 0.0.0.0:48470 0.0.0.0:* LISTEN 3647/rpc.mountd
tcp 0 0 0.0.0.0:59967 0.0.0.0:* LISTEN 3689/rpc.statd
tcp 0 0 0.0.0.0: 2049 0.0.0.0:* LISTEN -
udp 0 0 0.0.0.0:875 0.0.0.0:* 3631/rpc.rquotad
udp 0 0 0.0.0.0: 111 0.0.0.0:* 3601/rpcbind
udp 0 0 0.0.0.0:897 0.0.0.0:* 3689/rpc.statd
udp 0 0 0.0.0.0:46611 0.0.0.0:* 3647/rpc.mountd
udp 0 0 0.0.0.0:808 0.0.0.0:* 3601/rpcbind
udp 0 0 0.0.0.0:46011 0.0.0.0:* 3689/rpc.statd
注意看到上面喔!总共产生了好多的port 喔!真是可怕!不过主要的端口是:
rpcbind 启动的port 在111 ,同时启动在UDP 与TCP;
nfs 本身的服务启动在port 2049 上头!
其他rpc.* 服务启动的port 则是随机产生的,因此需向port 111 注册。
好了,那我怎么知道每个RPC 服务的注册状况?没关系,你可以使用rpcinfo 来观察的。
[root@www ~]# rpcinfo -p [IP|hostname]
[root@www ~]# rpcinfo -t|-u IP|hostname程式名称
选项与参数:
-p :针对某IP (未写则预设为本机) 显示出所有的port 与porgram 的资讯;
-t :针对某主机的某支程式检查其TCP 封包所在的软体版本;
-u :针对某主机的某支程式检查其UDP 封包所在的软体版本;
# 1.显示出目前这部主机的RPC状态
[root@www ~]# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100011 1 udp 875 rquotad
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100003 2 tcp 2049 nfs
....(底下省略)....
#程式代号NFS版本封包类型埠口服务名称
# 2.针对nfs这个程式检查其相关的软体版本资讯(仅察看TCP封包)
[root@www ~]# rpcinfo -t localhost nfs
program 100003 version 2 ready and waiting
program 100003 version 3 ready and waiting
program 100003 version 4 ready and waiting
# 可发现提供nfs 的版本共有三种,分别是2, 3, 4 版呦!
我们可以在server 端先自我测试一下是否可以连线喔!就是利用showmount 这个指令来查阅!
连接
[root@www ~]# showmount [-ae] [hostname|IP]
选项与参数:
-a :显示目前主机与用户端的NFS 连线分享的状态;
-e :显示某部主机的/etc/exports 所分享的目录资料。
# 请显示出刚刚我们所设定好的相关exports分享目录资讯
[root@www ~]# showmount -e localhost
Export list for localhost:
/tmp *
/home/linux *.centos.vbird
/home/test 192.168.100.10
/home/public (everyone)
很简单吧!所以,当你要扫瞄某一部主机他提供的NFS 分享的目录时,就使用showmount -e IP (或hostname) 即可!非常的方便吧!这也是NFS client 端最常用的指令喔! 另外, NFS 关于目录权限设定的资料非常之多!在/etc/exports 只是比较特别的权限参数而已,还有很多预设参数呢!这些预设参数在哪?我们可以检查一下/var/lib/nfs/etab 就知道了!
[root@www ~]# tail /var/lib/nfs/etab
/home/public 192.168.100.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,
no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
# 上面是同一行,可以看出除了rw, sync, root_squash 等等,
# 其实还有anonuid 及anongid 等等的设定!
上面仅仅是一个小范例,透过分析anonuid=65534对比/etc/passwd后,会发现CentOS出现的是nfsnobody啦!这个帐号在不同的版本都可能会不一样的!另外,如果有其他用户端挂载了你的NFS档案系统时,那么该用户端与档案系统资讯就会被记录到/var/lib/nfs/xtab里头去的!
另外,如果你想要重新处理/etc/exports 档案,当重新设定完/etc/exports 后需不需要重新启动nfs ?不需要啦!如果重新启动nfs 的话,要得再向RPC 注册!很麻烦~这个时候我们可以透过exportfs 这个指令来帮忙喔!
[root@www ~]# exportfs [-aruv]
选项与参数:
-a :全部挂载(或卸载) /etc/exports 档案内的设定
-r :重新挂载/etc/exports 里面的设定,此外,亦同步更新/etc/exports
及/var/lib/nfs/xtab 的内容!
-u :卸载某一目录
-v :在export 的时候,将分享的目录显示到萤幕上!
# 1.重新挂载一次/etc/exports的设定
[root@www ~]# exportfs -arv
exporting 192.168.100.10:/home/test
exporting 192.168.100.0/24:/home/public
exporting *.centos.vbird:/home/linux
exporting *:/home/public
exporting *:/tmp
# 2.将已经分享的NFS目录资源,通通都卸载
[root@www ~]# exportfs -auv
#这时如果你再使用showmount -e localhost就会看不到任何资源了!
(4)安全
一般来说, NFS 的服务仅会对内部网域开放,不会对网际网路开放的。
关于防火墙的部分,略,嘿嘿,不过有想了解的可以看之前推荐大家的鸟哥的介绍哈 ~
- NFS 服务器关机前的注意事项:
建议你的 NFS Server 想要关机之前,能先『关掉 rpcbind 与 nfs 』这两个东西! 如果无法正确的将这两个 daemons 关掉,那么先以 netstat -utlp 找出 PID ,然后以 kill 将他关掉先!这样才有办法正常的关机成功喔!这个请特别特别的注意呢!
2.3 客户端
(1)如何挂载
1、确认本地端已经启动了rpcbind 服务!
2、扫瞄NFS伺服器分享的目录有哪些,并了解我们是否可以使用( showmount );
3、在本地端建立预计要挂载的挂载点目录(mkdir);
4、利用mount 将远端主机直接挂载到相关目录。
# 1.启动必备的服务:若没有启动才启动,有启动则保持原样不动。
[root@clientlinux ~]# /etc/init.d/rpcbind start
[root@clientlinux ~]# /etc/init.d/nfslock start
#一般来说,系统预设会启动rpcbind ,不过鸟哥之前关闭过,所以要启动。
# 另外,如果伺服器端有启动nfslock 的话,用户端也要启动才能生效!
# 2.查询伺服器提供哪些资源给我们使用呢?
[root@clientlinux ~]# showmount -e 192.168.100.254
Export list for 192.168.100.254:
/tmp *
/home/linux *.centos.vbird
/home/test 192.168.100.10
/home/public (everyone) <==这是等一下我们要挂载的目录
# 3.建立挂载点,并且实际挂载看看啰!
[root@clientlinux ~]# mkdir -p /home/nfs/public
[root@clientlinux ~]# mount -t nfs 192.168.100.254:/home/public \
> /home/nfs/public
#注意一下挂载的语法!『 -t nfs 』指定档案系统类型,
# IP:/dir 则是指定某一部主机的某个提供的目录!另外,如果出现如下错误:
mount: 192.168.100.254:/home/public failed, reason given by server: No such file
or directory
# 这代表你在Server 上面并没有建立/home/public 啦!自己在伺服器端建立他吧!
# 4.总是得要看看挂载之后的情况如何,可以使用df或mount啦!
[root@clientlinux ~]# df
档案系统1K-区段已用可用已用% 挂载点
....(中间省略)....
192.168.100.254:/home/public
7104640 143104 6607104 3% /home/nfs/public
# 5、如何将挂载的NFS目录卸载?
[root@clientlinux ~]# umount /home/nfs/public
(2)安全
#一般来说,如果你的NFS 伺服器所提供的只是类似/home 底下的个人资料, 应该不需要可执行、SUID 与装置档案,因此当你在挂载的时候,可以这样下达指令喔:
[root@clientlinux ~]# umount /home/nfs/public
[root@clientlinux ~]# mount -t nfs -o nosuid,noexec,nodev,rw \
> 192.168.100.254:/home/public /home/nfs/public
[root@clientlinux ~]# mount | grep addr
192.168.100.254:/home/public on /home/nfs/public type nfs (rw,noexec,nosuid,nodev,vers=4,addr=192.168.100.254,clientaddr=192.168.100.10)
#这样一来你所挂载的这个档案系统就只能作为资料存取之用,相对来说,对于用户端是比较安全一些的。所以说,这个nosuid, noexec, nodev等等的参数可得记得啊!
#通常如果你的NFS 是用在高速运作的环境当中的话,那么可以建议加上这些参数的说:
[root@clientlinux ~]# umount /home/nfs/public
[root@clientlinux ~]# mount -t nfs -o nosuid,noexec,nodev,rw \
> -o bg,soft,rsize=32768,wsize=32768 \
> 192.168.100.254:/home/public /home/nfs/public
#则当你的192.168.100.254这部伺服器因为某些因素而离线时,你的NFS可以继续在背景当中重复的呼叫!直到NFS伺服器再度上线为止。这对于系统的持续操作还是有帮助的啦!当然啦,那个rsize与wsize的大小则需要依据你的实际网路环境而定喔!
2.4 将 NFS 开机即挂载
我们知道开机就挂载的挂载点与相关参数是写入/etc/fstab 中的,那NFS 能不能写入/etc/fstab 当中呢?
非常可惜的是, 不可以呢!(这一点我也惊奇\(〇O〇)/,因为一般都是这样设置的,而且管用,不过鸟哥说的也有道理)
为啥呢?分析一下开机的流程,我们可以发现网路的启动是在本机挂载之后,
因此当你利用/etc/fstab 尝试挂载NFS 时,系统由于尚未启动网路,
所以肯定是无法挂载成功的啦!那怎办?简单!就写入/etc/rc.d/rc.local 即可!
[root@clientlinux ~]# vim /etc/rc.d/rc.local
mount -t nfs -o nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768 \
192.168.100.254:/home/public /home/nfs/public
关于/etc/fstab 的补充 by 20220518
写入/etc/fstab虽然不能用于开机即挂载,但是不仅有记录功能,也能很方便的挂载:
比如新增挂载时,可以按照以下格式写入/etc/fstab:
192.168.100.254:/home/public /home/nfs/public nfs defaults 0 0
然后执行以下命令生效:
mount -a
2.5 自动挂载 autofs 的使用
这部分之前没有研究过,也是觉得很神奇,但是并没有更深入的研究,大家感兴趣的话,欢迎尝试,并留言使用感受哈~
神奇的功能:有用到服务器的数据时才自动挂载,没有使用了就会自动卸除!
建立主设定档/etc/auto.master ,并指定侦测的特定目录
[root@clientlinux ~]# vim /etc/auto.master
/home/nfsfile /etc/auto.nfs
上述资料中比较需要注意的是,那个/home/nfsfile 目录不需要存在,因为autofs 会主动的建立该目录!如果你建立了,可能反而会出问题~因此,先确定一下没有该目录吧!
建立资料对应档内(/etc/auto.nfs) 的挂载资讯与伺服器对应资源
刚刚我们所指定的/etc/auto.nfs 是自行设定的,所以这个档案是不存在的。那么这个档案的格式是如何呢?你可以这样看:
[本地端次目录] [-挂载参数] [伺服器所提供的目录]
选项与参数:
[本地端次目录] :指的就是在/etc/auto.master 内指定的目录之次目录
[-挂载参数] :就是前一小节提到的rw,bg,soft 等等的参数啦!可有可无;
[伺服器所提供的目录] :例如192.168.100.254:/home/public 等
[root@clientlinux ~]# vim /etc/auto.nfs
public -rw,bg,soft,rsize=32768,wsize=32768 192.168.100.254:/home/public
testing -rw,bg,soft,rsize=32768,wsize=32768 192.168.100.254:/home/test
temp -rw,bg,soft,rsize=32768,wsize=32768 192.168.100.254:/tmp
#参数部分,只要最前面加个-符号即可!
这样就可以建立对应了!要注意的是,那些/home/nfsfile/public 是不需要事先建立的!咱们的autofs 会事情况来处理喔!好了,接下来让我们看看如何实际运作吧!
启动与观察
[root@clientlinux ~]# /etc/init.d/autofs stop
[root@clientlinux ~]# /etc/init.d/autofs start
或
[root@clientlinux ~]# systemctl start autofs
[root@clientlinux ~]# systemctl enable autofs
#很奇怪!非常怪!CentOS 6.x的autofs使用restart会失效!所以鸟哥才进行两次
分享就到这结束啦~
很多地方直接搬上来了,之后再慢慢改吧,最重要的是先记下来,别让自己遗漏了知识~