1. NFS原理描述
主要功能是通过网络让不同的机器系统之间可以彼此共享文件或目录,允许NFS客户端将远端NFS服务器的共享目录挂载到本地的NFS客户端中。在本地NFS客户端的机器看来,NFS服务器端共享的目录就好像是自己的磁盘分区或者目录一样,一般用来存储共享视频,图片等静态数据。
2. RPC(Remote Procedure Call)
NFS支持的功能相当多,不同的功能使用不同的程序启动,随机取用一些未被使用的的小于1024的端口传输数据。
RPC最主要的功能就是记录每个NFS功能所对应的的端口号,并且将该信息传递给NFS客户端,让客户端可以连接到正确的端口上去。NFS启动时会随机取用数个端口,并主动向RPC服务注册取用的相关端口信息,然后RPC服务使用固定的port 111来监听NFS客户端的请求,并将正确的NFS端口应答给客户端。
提示:
在启动NFS SERVER之前,首先要启动PRC服务(即portmap服务),否则NFS SERVER就无法向RPC服务注册。另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会丢失,因此,此时RPC服务管理的NFS程序也需要重新启动以重新向RPC注册。特别注意:一般修改NFS配置文件后,是不需要重启NFS的,直接在命令行执行/etc/init.d/nfs reload或exportfs -rv即可使修改的/etc/exports生效。 |
3. NFS工作原理简图
4. NFS SERVER端设置
4.1 查询系统版本
[qinbf@test2 ~]$ cat /etc/redhat-release CentOS release 5.8 (Final) [qinbf@test2 ~]$ uname -r 2.6.18-308.4.1.el5 |
4.2 NFS软件
要部署NFS服务,必须安装下面两个软件包:
1) nfs-utils:NFS主程序
包括rpc.nfsd、rpc.mountd两个daemons等
2) portmap:RPC主程序
4.3 查看NFS软件包
[root@test2 ~]# rpm -qa nfs-utils portmap portmap-4.0-65.2.2.1 nfs-utils-1.0.9-60.el5 |
4.4 启动NFS相关服务
4.4.1 启动portmap服务
因为NFS及其辅助服务都是基于RPC协议的,所以要首先确保系统(客户端和服务端都要启动)中运行了portmap服务。
[root@test2 ~]# service portmap status portmap 已停 [root@test2 ~]# service portmap start 启动 portmap: [确定] [root@test2 ~]# service portmap status portmap (pid 2489) 正在运行... |
如果portmap服务未启动,执行命令rpcinfo -p localhost会报如下错误:
[root@test2 ~]# rpcinfo -p localhost rpcinfo:无法同 portmapper 交互: RPC:远程系统错误 - 拒绝连接 |
正常情况下:
[root@test2 ~]# rpcinfo -p localhost 程序 版本 协议 端口 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper |
4.4.2 启动NFS服务
[root@test2 ~]# /etc/init.d/nfs status rpc.mountd 已停 nfsd 已停 rpc.rquotad 已停 [root@test2 ~]# /etc/init.d/nfs start 启动 NFS 服务: [确定] 关掉 NFS 配额: [确定] 启动 NFS 守护进程: [确定] 启动 NFS mountd: [确定] 正在启动 RPC idmapd: [确定] [root@test2 ~]# rpcinfo -p localhost 程序 版本 协议 端口 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100011 1 udp 773 rquotad 100011 2 udp 773 rquotad 100011 1 tcp 776 rquotad 100011 2 tcp 776 rquotad 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100021 1 udp 51795 nlockmgr 100021 3 udp 51795 nlockmgr 100021 4 udp 51795 nlockmgr 100003 2 tcp 2049 nfs 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100021 1 tcp 42098 nlockmgr 100021 3 tcp 42098 nlockmgr 100021 4 tcp 42098 nlockmgr 100005 1 udp 809 mountd 100005 1 tcp 812 mountd 100005 2 udp 809 mountd 100005 2 tcp 812 mountd 100005 3 udp 809 mountd 100005 3 tcp 812 mountd |
从NFS服务启动的提示,可以看出NFS默认需要启动的进程至少有:rpc.mountd,nfsd,rpc.rquotad。
(1) nfsd(rpc.nfsd)
这个daemon的主要功能是管理Client端是否能够登入主机,其中还包含登入者的判别。
(2) rpc.mountd
这个daemon的主要功能则是管理NFS的文件系统,当Client端顺利通过rpc.nfsd登入主机之后,在它可以使用NFS服务器提供的文件之前,还会经过文件使用权限的认证程序,它会去读NFS的配置文件/etc/exports来对比Client的权限,当通过这一关之后,Client端就可以取得使用NFS文件的权限。
4.5. nfs服务开机自启动
[root@test2 ~]# chkconfig --level 3 nfs on [root@test2 ~]# chkconfig --level 3 portmap on [root@test2 ~]# chkconfig --list |egrep "portmap|nfs" nfs 0:关闭 1:关闭 2:关闭 3:启用 4:关闭 5:关闭 6:关闭 nfslock 0:关闭 1:关闭 2:关闭 3:关闭 4:启用 5:启用 6:关闭 portmap 0:关闭 1:关闭 2:关闭 3:启用 4:启用 5:启用 6:关闭 |
4.6. NFS配置文件路径
NFS配置文件默认路径为:/etc/exports
4.6.1 export文件格式
/etc/exports文件配置格式为:
NFS共享目录 客户端地址1(参数1,参数2) 客户端地址2(参数1,参数2) |
- NFS共享目录:为NFS服务端要共享的实际目录绝对路径
- 客户端地址:为服务授权的可访问共享目录的可兑换服务器地址,可以为单独的IP地址或域名,也可以为整个网段地址,还可以用*来匹配所有服务器
- 参数集:对授权的客户端的访问权限设置
生产常见的配置实例:
常用格式说明 |
要共享的目录 客户端IP 地址或IP段 |
配置例一 |
/ett/oldboy 10.0.0.0/24(rw,sync) #注意红色部分没有空格 |
配置例二 |
/home/ryan 10.0.0.0/24(rw,sync,all_squash,anonuid=2000,anongid=2000) |
配置例三 |
/home/oldboy 10.0.0.15(ro) #只读共享 |
4.7. NFS权限设置
参数名称 |
参数用途 |
rw |
表示读写权限 |
ro |
表示只读权限 |
sync |
请求或写入数据时,数据同步写入到NFS Server的硬盘后再返回 |
async |
请求或写入数据时,先返回请求,再将数据写入到内存和缓存中。此参数可以提升NFS性能,但是会降低数据安全,不建议使用 |
no_root_squash |
访问NFS Sever共享目录的用户如果是root的话,它对该共享目录就有root权限。避免使用 |
root_suqash |
对于访问NFS Server共享目录的用户如果是root的话,则它的权限被压缩成匿名用户,同时它的UID和GID会变成nobody或nfsbody |
all_squash |
不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩成匿名用户,同时它的UID和GID都会变成nobody或nfsnobody账号,在多个NFS客户端同时读写NFS Sever数据时,这个参数很有用 |
anonuid |
参数以anon*开头即指anonymous匿名用户,这个用户的UID设置值通常为nobody或nfsbody的UID值,当然我们也可以自行设置这个UID值,但是UID必须存在于/etc/passwd中。 |
anongid |
同anonuid,区别就是把uid换成gid |
提示:
|
4.8. 开机挂载NFS
我们可以把共享的目录在/etc/fstab中进行配置,这样在开机启动就会自动加载mount的整个命令,而不需要开机再手工执行mount命令了,在/etc/fstab中加入如下配置即可:
192.168.1.3:/qinbf /mnt nfs defaults 1 1 |
在生产环境中,对于共享的NFS目录,一般不会配置到/etc/fstab里,因为在客户端主机重启时,如果因为网络等原因连接不上nfs server时,就会导致客户端主机无法启动的厄运发生。一般会把mount -t nfs 192.168.1.3:/qinbf /mnt 命令放到rc.local中来实现开机挂载,但是也会引起重启NFS客户端后,可能挂载NFS不成功。
4.9. 卸载NFS挂载目录
强制卸载NFS挂载的:umount -lf /mnt
无法卸载NFS挂载的原因:1)当前处于挂载点,必须要先退出才能卸载。2)nfs
server 挂了,nfs client会有问题
4.10. NFS实例
[root@test2 ~]# mkdir /qinbf [root@test2 ~]# echo "/qinbf 192.168.1.0/24(rw,sync)">>/etc/exports [root@test2 ~]# cat /etc/exports /qinbf 192.168.1.0/24(rw,sync) [root@test2 ~]# /etc/init.d/nfs reload #不需要restart [root@test3 ~]# showmount -e 192.168.1.3 #查看服务端有哪些目录可以挂载 Export list for 192.168.1.3: /qinbf 192.168.1.0/24 [root@test3 ~]# cd /mnt #未挂载前,此目录为空 [root@test3 mnt]# ll 总计 0 [root@test2 ~]# mkdir -p /qinbf/test/student #对服务端进行一系列端的创建目录和文件的操作 [root@test2 ~]# cd /qinbf [root@test2 qinbf]# touch aaa.txt [root@test2 qinbf]# ll 总计 12 -rw-r--r-- 1 root root 0 06-25 23:28 aaa.txt drwxr-xr-x 3 root root 4096 06-25 23:28 test [root@test2 qinbf]# cd .. [root@test2 /]# ll -d /qinbf drwxr-xr-x 3 root root 4096 06-25 23:28 /qinbf [root@test3 ~]# mount -t nfs 192.168.1.3:/qinbf /mnt #将服务端目录挂载到本地/mnt目录 [root@test3 ~]# cd /mnt/ [root@test3 mnt]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 9.7G 1.7G 7.5G 19% / /dev/sda3 4.9G 139M 4.5G 3% /data /dev/sda1 99M 18M 76M 19% /boot tmpfs 249M 0 249M 0% /dev/shm 192.168.1.3:/qinbf 9.7G 2.3G 7.0G 25% /mnt #挂载成功 [root@test3 mnt]# ll -a 总计 28 drwxr-xr-x 3 root root 4096 06-25 23:28 . drwxr-xr-x 25 root root 4096 06-26 07:18 .. -rw-r--r-- 1 root root 0 06-25 23:28 aaa.txt drwxr-xr-x 3 root root 4096 06-25 23:28 test [root@test3 mnt]# mkdir client2 #在/etc/export文件已经有w权限,本地却不能创建目录 mkdir: 无法创建目录 “client2”: 权限不够 [root@test2 /]# chmod o+w /qinbf -R #实际上,如果服务端本身没对外开放w权限,客户端也是没有w权限的 [root@test3 mnt]# mkdir client2 [root@test3 mnt]# ll 总计 28 -rwxr-xrwx 1 root root 0 06-25 23:28 aaa.txt drwxr-xrwx 2 nfsnobody nfsnobody 4096 06-25 23:42 client1 drwxr-xr-x 2 nfsnobody nfsnobody 4096 06-26 00:25 client2 #O位给了w,创建成功 drwxr-xrwx 3 root root 4096 06-25 23:28 test [root@test3 mnt]# umount /mnt #当前的目录为mnt,所以无法卸载 umount: /mnt: device is busy umount: /mnt: device is busy [root@test3 mnt]# cd [root@test3 ~]# umount /mnt #退出挂载目录即可卸载 [root@test3 ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 9.7G 1.6G 7.7G 17% / /dev/sda3 4.9G 139M 4.5G 3% /data /dev/sda1 99M 18M 76M 19% /boot tmpfs 249M 0 249M 0% /dev/shm 或者 [root@test3 mnt]# umount -lf /mnt #强制卸载的方法 [root@test3 mnt]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 9.7G 1.6G 7.7G 17% / /dev/sda3 4.9G 139M 4.5G 3% /data /dev/sda1 99M 18M 76M 19% /boot tmpfs 249M 0 249M 0% /dev/shm |
5. NFS客户端mount挂载参数
由于NFS共享的是图片、视频之类的数据,所以不必使用到suid,exec等权限,因此在挂载的时候,可以使用这样的命令:
mount -t nfs -o nosuid,noexec,nodev,rw,hard,intr,rsize=32768,wsize=32768 192.168.1.3:/qinbf /qinbf #hard和init参数可以让在nfs服务出现异常的时候,按下ctrl+c退出。 |
6. NFS生产案例
实现把NFS服务端的/data目录共享指定主机,要求在在NFS客户端可读可写入数据,写入的数据能在NFS SERVER端看到,请给出操作步骤或者设置方法。
要点:无论什么版本的系统,nfs服务默认的配置里匿名UID和GID都为65534。32位bit的系统中的nfsnobody用户默认的UID恰好和nfs服务默认的匿名UID相同。 方法一: 确认系统是32位或者nfsnobody用户默认的UID是65534,就可以使用下面这种方法。 首先检查各台服务器的NFS服务状态:(test2是server,test3是client,test4是client) [root@test2 ~]# grep nfsnobody /etc/passwd nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin [root@test3 ~]# /etc/init.d/portmap status portmap 已停 [root@test3 ~]# /etc/init.d/portmap start 启动 portmap:[确定] [root@test3 ~]# /etc/init.d/nfs start nfs nfslock [root@test3 ~]# /etc/init.d/nfs start 启动 NFS 服务: [确定] 关掉 NFS 配额:[确定] 启动 NFS 守护进程:[确定] 启动 NFS mountd:[确定] 正在启动 RPC idmapd:[确定] [root@test3 ~]# chkconfig --level 3 portmap on [root@test3 ~]# chkconfig --list |grep portmap portmap 0:关闭 1:关闭 2:关闭 3:启用 4:关闭 5:关闭 6:关闭 [root@test3 ~]# chkconfig --level 3 nfs on [root@test3 ~]# chkconfig --list |grep nfs nfs 0:关闭 1:关闭 2:关闭 3:启用 4:关闭 5:关闭 6:关闭 nfslock 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭 然后设置NFS SERVER [root@test2 ~]# echo "/data 192.168.1.0/24(rw,sync)"> /etc/exports [root@test2 ~]# tail /etc/exports /data 192.168.1.0/24(rw,sync) [root@test2 ~]# cat /var/lib/nfs/etab /data 192.168.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534) 在客户端机器上检测服务端设置情况 [root@test3 ~]# showmount -e 192.168.1.3 Export list for 192.168.1.3: /data 192.168.1.0/24 [root@test4 ~]# showmount -e 192.168.1.3 Export list for 192.168.1.3: /data 192.168.1.0/24 在客户端机器上挂载服务端目录: [root@test3 ~]# cd /mnt [root@test3 mnt]# ll 总计 0 [root@test3 mnt]# mount -t nfs 192.168.1.3:/data /mnt [root@test3 mnt]# ll /mnt 总计 24 drwxr-xr-x 3 root root 4096 2012-06-08 htdocs drwx------ 2 root root 16384 2012-05-28 lost+found [root@test3 mnt]# mkdir test mkdir: 无法创建目录 “test”: 权限不够 这是因为在server端/data这个目录的权限是755,当客户端机器创建目录,会转化成server端的nfsnoby用户创建,而other位没有w权限,故无权限创建目录。 [root@test2 /]# chmod o+w /data [root@test3 mnt]# mkdir test [root@test3 mnt]# ll 总计 32 drwxr-xr-x 3 root root 4096 2012-06-08 htdocs drwx------ 2 root root 16384 2012-05-28 lost+found drwxr-xr-x 2 nfsnobody nfsnobody 4096 07-19 08:11 test [root@test4 ~]# cd /mnt [root@test4 mnt]# ll 总计 32 drwxr-xr-x 3 root root 4096 2012-06-08 htdocs drwx------ 2 root root 16384 2012-05-28 lost+found drwxr-xr-x 2 nfsnobody nfsnobody 4096 07-19 08:11 test 方法二: 如果系统是64bit 5.x 需要在/etc/exports中添加参数 (rw,sync,all_squash,anonuid=4294967294,anongid=4294967294) 方法三: 万能的方法:所有的nfs的客户端和服务端都要建立oldboy用户及oldboy组,并指定ID。此方法不适用于服务器数量很大的情况。 [root@test2 /]# groupadd -g 1207 oldboynfs [root@test2 /]# useradd -u 1207 -g 1207 oldboynfs [root@test3 mnt]# groupadd -g 1207 oldboynfs [root@test3 mnt]# useradd -u 1207 -g 1207 oldboynfs [root@test4 mnt]# groupadd -g 1207 oldboynfs [root@test4 mnt]# useradd -u 1207 -g 1207 oldboynfs [root@test2 /]# mkdir /oldboynfs [root@test2 /]# ll -d /oldboynfs/ drwxr-xr-x 2 root root 4096 07-19 08:29 /oldboynfs/ [root@test2 /]# chown -R /oldboynfs/ [root@test2 /]# tail -1 /etc/exports /oldboynfs 192.168.1.0/24(rw,sync,all_squash,anonuid=1207,anongid=1207) [root@test2 /]# /etc/init.d/nfs reload [root@test3 mnt]# cd .. -bash: cd: ..: Stale NFS file handle #因为之前的挂载/data我已经注销了,所以无法退出当前目录。 [root@test3 mnt]# umount /mnt umount: /mnt: device is busy umount: /mnt: device is busy [root@test3 mnt]# umount -lf /mnt #强制卸载 [root@test3 mnt]# cd .. [root@test3 /]# mount -t nfs 192.168.1.3:/oldboynfs /mnt [root@test3 /]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 9.7G 1.6G 7.7G 17% / /dev/sda3 4.9G 139M 4.5G 3% /data /dev/sda1 99M 18M 76M 19% /boot tmpfs 249M 0 249M 0% /dev/shm 192.168.1.3:/oldboynfs 9.7G 2.3G 7.0G 25% /mnt #对test4进行同样的操作 [root@test4 /]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 9.7G 2.3G 7.0G 25% / /dev/sda3 4.9G 139M 4.5G 3% /data /dev/sda1 99M 18M 76M 20% /boot tmpfs 249M 0 249M 0% /dev/shm 192.168.1.3:/oldboynfs 9.7G 2.3G 7.0G 25% /mnt [root@test2 /]# cat /var/lib/nfs/rmtab #挂载目录历史 192.168.1.4:/qinbf:0x00000001 192.168.1.4:/data:0x00000001 192.168.1.5:/data:0x00000001 192.168.1.4:/oldboynfs:0x00000001 192.168.1.5:/oldboynfs:0x00000001 设置开机挂载 把/bin/mount -t nfs 192.168.1.3:/oldboynfs /mnt写进/etc/rc.local |
7.人为模拟错误的学习方法
7.1 在客户端不卸载已挂载目录的前提下,观察停止各项服务对nfs服务的影响
7.1.1 停止客户端的portmap服务,测试是否影响已经运行的nfs服务
[root@test3 ~]# /etc/init.d/portmap stop 停止 portmap: [确定] [root@test3 ~]# cd /mnt [root@test3 mnt]# ll 总计 8 drwxr-xr-x 2 oldboynfs oldboynfs 4096 07-19 16:09 test1 [root@test4 ~]# cd /mnt [root@test4 mnt]# ll 总计 8 drwxr-xr-x 2 oldboynfs oldboynfs 4096 07-19 16:09 test1 #客户端机器test3停掉portmap服务之后,仍然可以创建目录test,并在同样是客户端机器test4中看到信创建的目录test,说明停止portmap服务不影响已经运行的nfs服务。 |
7.1.2 挂载server端的/oldboynfs目录之前,停止客户端机器的nfs服务(portmap服务仍然运行),观察挂载能否成功
[root@test3 /]# /etc/init.d/portmap status portmap (pid 2680) 正在运行... [root@test3 /]# /etc/init.d/nfs status rpc.mountd (pid 2809) 正在运行... nfsd (pid 2806 2805 2804 2803 2802 2801 2800 2799) 正在运行... rpc.rquotad (pid 2794) 正在运行... [root@test3 /]# umount /mnt [root@test3 /]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 9.7G 1.6G 7.7G 17% / /dev/sda3 4.9G 139M 4.5G 3% /data /dev/sda1 99M 18M 76M 19% /boot tmpfs 249M 0 249M 0% /dev/shm [root@test3 /]# /etc/init.d/nfs stop 关闭 NFS mountd: [确定] 关闭 NFS 守护进程: [确定] 关闭 NFS quotas: [确定] [root@test3 /]# mount -t nfs 192.168.1.3:/oldboynfs /mnt [root@test3 /]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 9.7G 1.6G 7.7G 17% / /dev/sda3 4.9G 139M 4.5G 3% /data /dev/sda1 99M 18M 76M 19% /boot tmpfs 249M 0 249M 0% /dev/shm 192.168.1.3:/oldboynfs 9.7G 2.3G 7.0G 25% /mnt #证明客户端机器挂载server的目录时,并不需要运行nfs服务。 |
7.2 停止客户端的portmap服务和nfs服务,重启server端的nfs服务,观察对已经运行的nfs服务有何影响。
[root@test3 mnt]# /etc/init.d/portmap status portmap (pid 2680) 正在运行... [root@test3 mnt]# /etc/init.d/nfs status rpc.mountd (pid 3063) 正在运行... nfsd (pid 3060 3059 3058 3057 3056 3055 3054 3053) 正在运行... rpc.rquotad (pid 3048) 正在运行... [root@test3 mnt]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 9.7G 1.6G 7.7G 17% / /dev/sda3 4.9G 139M 4.5G 3% /data /dev/sda1 99M 18M 76M 19% /boot tmpfs 249M 0 249M 0% /dev/shm 192.168.1.3:/oldboynfs 9.7G 2.3G 7.0G 25% /mnt [root@test3 mnt]# /etc/init.d/portmap stop 停止 portmap: [确定] [root@test2 oldboynfs]# rpcinfo -p localhost 程序 版本 协议 端口 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100011 1 udp 1006 rquotad 100011 2 udp 1006 rquotad 100011 1 tcp 1009 rquotad 100011 2 tcp 1009 rquotad 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100021 1 udp 38753 nlockmgr 100021 3 udp 38753 nlockmgr 100021 4 udp 38753 nlockmgr 100003 2 tcp 2049 nfs 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100021 1 tcp 50878 nlockmgr 100021 3 tcp 50878 nlockmgr 100021 4 tcp 50878 nlockmgr 100005 1 udp 1021 mountd 100005 1 tcp 600 mountd 100005 2 udp 1021 mountd 100005 2 tcp 600 mountd 100005 3 udp 1021 mountd 100005 3 tcp 600 mountd [root@test2 oldboynfs]# /etc/init.d/nfs restart 关闭 NFS mountd: [确定] 关闭 NFS 守护进程: [确定] 关闭 NFS quotas: [确定] 关闭 NFS 服务: [确定] 启动 NFS 服务: [确定] 关掉 NFS 配额: [确定] 启动 NFS 守护进程: [确定] 启动 NFS mountd: [确定] [root@test2 oldboynfs]# rpcinfo -p localhost 程序 版本 协议 端口 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100011 1 udp 692 rquotad 100011 2 udp 692 rquotad 100011 1 tcp 695 rquotad 100011 2 tcp 695 rquotad 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100021 1 udp 56852 nlockmgr 100021 3 udp 56852 nlockmgr 100021 4 udp 56852 nlockmgr 100003 2 tcp 2049 nfs 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100021 1 tcp 45426 nlockmgr 100021 3 tcp 45426 nlockmgr 100021 4 tcp 45426 nlockmgr 100005 1 udp 707 mountd 100005 1 tcp 710 mountd 100005 2 udp 707 mountd 100005 2 tcp 710 mountd 100005 3 udp 707 mountd 100005 3 tcp 710 mountd #注意观察nfs服务重启前后,向portmap注册端口的变化,nfs和portmap的端口没变,其他的全部都改变了。 [root@test3 mnt]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 9.7G 1.6G 7.7G 17% / /dev/sda3 4.9G 139M 4.5G 3% /data /dev/sda1 99M 18M 76M 19% /boot tmpfs 249M 0 249M 0% /dev/shm 192.168.1.3:/oldboynfs 9.7G 2.3G 7.0G 25% /mnt #先停止portmap服务,并未对已挂载的目录产生影响。 [root@test3 mnt]# mkdir test3 [root@test3 mnt]# ll 总计 24 drwxr-xr-x 2 oldboynfs oldboynfs 4096 07-19 16:09 test1 drwxr-xr-x 2 oldboynfs oldboynfs 4096 07-19 16:28 test2 drwxr-xr-x 2 oldboynfs oldboynfs 4096 07-19 16:36 test3 [root@test3 mnt]# /etc/init.d/nfs stop 关闭 NFS mountd: [确定] 关闭 NFS 守护进程: [确定] 关闭 NFS quotas: [确定] [root@test3 mnt]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 9.7G 1.6G 7.7G 17% / /dev/sda3 4.9G 139M 4.5G 3% /data /dev/sda1 99M 18M 76M 19% /boot tmpfs 249M 0 249M 0% /dev/shm 192.168.1.3:/oldboynfs 9.7G 2.3G 7.0G 25% /mnt [root@test3 mnt]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 9.7G 1.6G 7.7G 17% / /dev/sda3 4.9G 139M 4.5G 3% /data /dev/sda1 99M 18M 76M 19% /boot tmpfs 249M 0 249M 0% /dev/shm 192.168.1.3:/oldboynfs 9.7G 2.3G 7.0G 25% /mnt [root@test3 mnt]# [root@test3 mnt]# [root@test3 mnt]# mkdir test5 [root@test3 mnt]# ll 总计 40 drwxr-xr-x 2 oldboynfs oldboynfs 4096 07-19 16:09 test1 drwxr-xr-x 2 oldboynfs oldboynfs 4096 07-19 16:28 test2 drwxr-xr-x 2 oldboynfs oldboynfs 4096 07-19 16:36 test3 drwxr-xr-x 2 oldboynfs oldboynfs 4096 07-19 16:49 test4 drwxr-xr-x 2 oldboynfs oldboynfs 4096 07-19 16:50 test5 #重启并没有中断已经运行的nfs服务,目录仍然可以挂载写入。 |
7.3 卸载已经挂载的目录,然后停止客户端服务,观察是否能够重新挂载
7.3.1 卸载已经挂载的目录,停止portmap服务,观察能否重新挂载。
[root@test3 ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 9.7G 1.6G 7.7G 17% / /dev/sda3 4.9G 139M 4.5G 3% /data /dev/sda1 99M 18M 76M 19% /boot tmpfs 249M 0 249M 0% /dev/shm 192.168.1.3:/oldboynfs 9.7G 2.3G 7.0G 25% /mnt [root@test3 ~]# /etc/init.d/portmap status portmap (pid 3443) 正在运行... [root@test3 ~]# /etc/init.d/nfs status rpc.mountd (pid 3489) 正在运行... nfsd (pid 3486 3485 3484 3483 3482 3481 3480 3479) 正在运行... rpc.rquotad (pid 3474) 正在运行... [root@test3 ~]# umount /mnt [root@test3 ~]# /etc/init.d/portmap stop 停止 portmap: [确定] [root@test3 ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 9.7G 1.6G 7.7G 17% / /dev/sda3 4.9G 139M 4.5G 3% /data /dev/sda1 99M 18M 76M 19% /boot tmpfs 249M 0 249M 0% /dev/shm [root@test3 ~]# mount -t nfs 192.168.1.3:/oldboynfs /mnt [root@test3 ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 9.7G 1.6G 7.7G 17% / /dev/sda3 4.9G 139M 4.5G 3% /data /dev/sda1 99M 18M 76M 19% /boot tmpfs 249M 0 249M 0% /dev/shm 192.168.1.3:/oldboynfs 9.7G 2.3G 7.0G 25% /mnt |
7.3.2 卸载已经挂载的目录,停止客户端的portmap服务,并重启server端的nfs服务,观察客户端能否重新挂载。
[root@test3 ~]# umount /mnt [root@test2 ~]# /etc/init.d/nfs restart 关闭 NFS mountd: [确定] 关闭 NFS 守护进程: [确定] 关闭 NFS quotas: [确定] 关闭 NFS 服务: [确定] 启动 NFS 服务: [确定] 关掉 NFS 配额: [确定] 启动 NFS 守护进程: [确定] 启动 NFS mountd: [确定] [root@test3 ~]# mount -t nfs 192.168.1.3:/oldboynfs /mnt [root@test3 ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 9.7G 1.6G 7.7G 17% / /dev/sda3 4.9G 139M 4.5G 3% /data /dev/sda1 99M 18M 76M 19% /boot tmpfs 249M 0 249M 0% /dev/shm 192.168.1.3:/oldboynfs 9.7G 2.3G 7.0G 25% /mnt #客户端停掉portmap服务之后,重启server端的nfs,能够重新挂载目录 |
7.3.3 卸载已经挂载的目录,停止portmap服务和nfs服务,nfs服务,重启server端的nfs服务,观察能否重新挂载
[root@test3 /]# /etc/init.d/portmap status portmap 已停 [root@test3 /]# /etc/init.d/nfs status rpc.mountd 已停 nfsd 已停 rpc.rquotad 已停 [root@test3 /]# umount /mnt [root@test3 /]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 9.7G 1.6G 7.7G 17% / /dev/sda3 4.9G 139M 4.5G 3% /data /dev/sda1 99M 18M 76M 19% /boot tmpfs 249M 0 249M 0% /dev/shm [root@test3 /]# mount -t nfs 192.168.1.3:/oldboynfs /mnt [root@test3 /]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 9.7G 1.6G 7.7G 17% / /dev/sda3 4.9G 139M 4.5G 3% /data /dev/sda1 99M 18M 76M 19% /boot tmpfs 249M 0 249M 0% /dev/shm 192.168.1.3:/oldboynfs 9.7G 2.3G 7.0G 25% /mnt #可以重新挂载 |
7.4 停止server端的nfs服务,观察对已经挂载目录的影响
[root@test2 ~]# /etc/init.d/nfs stop 关闭 NFS mountd: [确定] 关闭 NFS 守护进程: [确定] 关闭 NFS quotas: [确定] 关闭 NFS 服务: [确定] [root@test3 mnt]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 9.7G 1.6G 7.7G 17% / /dev/sda3 4.9G 139M 4.5G 3% /data /dev/sda1 99M 18M 76M 19% /boot tmpfs 249M 0 249M 0% /dev/shm hello,world! #停止server端的nfs服务,客户端的挂载马上出现窗口死掉的异常,重启server端的nfs服务之后即可恢复。 或者在挂载的时候加上参数-o hard,intr,按下ctrl+c即可退出窗口死掉的异常 |
回到最原始的测试:在不启动客户端的portmap和nfs服务,能否挂载server端的目录时,我发现答案是:可以!!
[root@test3 /]# /etc/init.d/portmap status portmap 已停 [root@test3 /]# /etc/init.d/nfs status rpc.mountd 已停 nfsd 已停 rpc.rquotad 已停 [root@test3 /]# mount -t nfs 192.168.1.3:/oldboynfs /mnt [root@test3 /]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda2 9.7G 1.6G 7.7G 17% / /dev/sda3 4.9G 139M 4.5G 3% /data /dev/sda1 99M 18M 76M 19% /boot tmpfs 249M 0 249M 0% /dev/shm 192.168.1.3:/oldboynfs 9.7G 2.3G 7.0G 25% /mnt |
8.NFS的优缺点
8.1 NFS的优点
1.简单
2.方便
3.可靠
8.2 NFS的局限
1.局限性是存在单点故障,如果nfs server挂了,所有的客户端不能访问共享目录,负载均衡及高可用方案可以弥补
2.在高并发的场合,NFS的性能有限
3.客户端认证时,基于ip和主机名的,安全性一般(用于内网则问题不大
4.NFS数据是明文的,完整性不作验证
5.多机器挂载服务器时,连接管理维护麻烦。尤其是NFS服务端除了问题之后,所有客户端都挂掉状态(可用autofs解决)
8.3 exportfs
exportfs命令可以不通过配置文件/etx/exports,直接在命令行中配置挂载。
[root@test2 ~]# mkdir /ex [root@test2 ~]# export export exportfs [root@test2 ~]# export export exportfs [root@test2 ~]# exportfs -o sync,all_squash,mp,fsid=2 192.168.1.3:/ex [root@test2 ~]# showmount -e 192.168.1.3 Export list for 192.168.1.3: /ex 192.168.1.3 /oldboynfs 192.168.1.0/24 |
9. NFS调优
调优的步骤:
- 测量当前的网络、服务器和每个客户端的执行效率
- 分析收集来的数据并画出图表。查找出特殊情况,例如很高的磁盘和CPU占用、很高的磁盘使用时间
- 调整服务器
- 重复第一到第三直到到达你渴望的性能
与NFS性能有关的问题有很多,通常要考虑的有以下这些选择:
- WSIZE,RSIZE参数
WSIZE,RSIZE对于NFS的效能有很大的影响,设定了server端和client端之间来往数据块的大小,如果挂载时,使用了这两个参数,可以让客户端读取和写入数据时,一次性可以读写更多的数据包
- noatime、nodiratime
读写磁盘的时候,不更新文件的时间戳,减少和和磁盘的交互
可以通过time命令来检查添加参数之后,执行效率。