NFS服务由浅入深
1. NFS介绍
英文全称:network filesystem
作用:用在linux系统之间访问共享
使用的端口号:小于1024的随机端口
2. 什么是RPC?
全称:remote procedure call
作用:
客户端连接NFS服务器的时候,所使用的端口,需要向RPC注册,所以RPC就会知道端口号是多少,RPC程序会通过111反馈给客户端端口号。

要求:RPC要在NFS服务启动之前,就启动。
要想使用NFS,那么客户端和服务器都必须启动RPC服务。
NFS的RPC服务,在CentOS5.X下名称为portmap,在Centos6.x下名称为rpcbind.
3. NFS daemons
rpc.nfsd nfs服务器服务提供商,看nfs客户端是否可以使用nfs服务器。
rpc.mountd 验证客户端的权限。
rpc.lockd 锁定文档,防止多个用户同时修改一个文档,导致文档内容不一致。
rpc.statd 检查文件的一致性,如果有损坏,可以尝试恢复该文档。
4. NFS服务器端的设置
1. NFS软件列表
nfs-utils: NFS服务的主程序,包括rpc.nfsd,rpc.mountd两个daemons和相关文档说明,以及执行命令文件等。
rpcbind: Centos6.x下面RPC的主程序,在启动NFS服务之前必须先启动rpcbind服务才行。
2. 查看软件包
rpm -qa nfs-utils rpcbind
rpm -qa | grep -E "nfs-|rpcbind"
3. 安装软件包
yum install rpcbind nfs-utils -y
4. 启动NFS相关服务
centos6: /etc/init.d/rpcbind start
centos7: systemctl start rpcbind
检查rpcbind的启动情况:rpcinfo -p localhost,结果如下:
[root@kubernetes-node1 ~]# 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
100024 1 udp 45063 status
100024 1 tcp 45046 status
当启用nfs服务以后,systemctl start nfs 或者/etc/init.d/nfs start,再执行rpcinfo -p localhost,结果如下:
[root@localhost ~]# 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
100024 1 udp 47830 status
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100024 1 tcp 47243 status
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 49190 nlockmgr
100021 3 udp 49190 nlockmgr
100021 4 udp 49190 nlockmgr
100021 1 tcp 41713 nlockmgr
100021 3 tcp 41713 nlockmgr
100021 4 tcp 41713 nlockmgr
5. NFS服务常见进程详解
NFS服务启动以后,使用命令ps -ef | egrep "nfs|rpc",可以查看进程,如下:
[root@localhost ~]# ps -ef | egrep "nfs|rpc" root 27057 2 0 Apr27 ? 00:00:00 [rpciod] rpcuser 27064 1 0 Apr27 ? 00:00:00 /usr/sbin/rpc.statd root 27065 1 0 Apr27 ? 00:00:00 /usr/sbin/rpc.idmapd rpc 27074 1 0 Apr27 ? 00:00:01 /sbin/rpcbind -w root 27075 1 0 Apr27 ? 00:00:00 /usr/sbin/rpc.mountd root 27086 2 0 Apr27 ? 00:00:00 [nfsd4_callbacks] root 27092 2 0 Apr27 ? 00:00:00 [nfsd] root 27093 2 0 Apr27 ? 00:00:00 [nfsd] root 27094 2 0 Apr27 ? 00:00:00 [nfsd] root 27095 2 0 Apr27 ? 00:00:00 [nfsd] root 27096 2 0 Apr27 ? 00:00:00 [nfsd] root 27097 2 0 Apr27 ? 00:00:00 [nfsd] root 27098 2 0 Apr27 ? 00:00:00 [nfsd] root 27099 2 0 Apr27 ? 00:00:02 [nfsd] root 32584 32493 0 11:27 pts/0 00:00:00 grep -E --color=auto nfs|rpc
nfsd(rpc.nfsd):管理NFS客户端是否能够登入NFS服务器端主机,其中包含登入者的ID判别等。
mountd(rpc.mountd):管理NFS文件系统,看是不是有权限访问共享目录。
rpc.lockd: 锁定文档,防止多个用户同时修改一个文档,导致文档内容不一致。
rpc.statd: 检查文件的一致性,如果有损坏,可以尝试恢复该文档。
6. 配置NFS和rpcbind开机启动
centos6: chkconfig rpcbind on && chkconfig nfs on
centos7: systemctl enable rpcbind && systemctl enable nfs
生产实践中,都是添加到/etc/rc.local文件中,内容如下:
/etc/init.d/rpcbind start
/etc/init.d/nfs start
centos7直接用systemctl管理就好。
7. NFS服务配置文件管理
1. 配置文件路径
/etc/exports,内容为空。
2. 配置文件格式
语法:NFS共享的目录 NFS客户端地址(参数1,参数2,参数3)
NFS共享的目录:绝对路径,注意共享目录的本地权限,如果要读写共享,一定要让本地目录可以被NFS客户端的用户(nfsnobody)读写。
NFS客户端地址:可以是单独的IP或主机名或域名或网段,还可以用*通配符表示所有.
10.0.0.30
10.0.0.0/24
10.0.0.*
nfs.oldboy.com
*.oldboy.com
3. 配置参数权限
常用的参数
rw:读写权限
ro:只读权限
sync:写入数据时,数据同步写入到NFS Server的硬盘才返回。优点:数据安全;缺点:写入慢。
async:写入数据时,会先写到NFS Server内存缓冲区,直到硬盘有空才写入硬盘。优点:写入快;缺点:不能断电或宕机。
no_root_squash:如果访问共享目录的是root,则对共享目录还是root权限。
root_squash:如果访问共享目录的是root,则被压缩成匿名用户。
all_squash:不管是任何用户,都压缩成匿名用户。
anonuid:匿名用户的UID
anongid:匿名用户的GID
可以通过命令查看自带的参数:
cat /var/lib/nfs/etab 这是服务器端的查看
cat /proc/mounts 这是客户端的查看
NFS配置权限关系图,如下:

5. NFS服务配置实战
1. 安装rpcbind和NFS,启动起来,并设置为开机启动。
2. 创建共享目录,或者共享已经存在的目录。
mkdir -p /home/yangjianbo
3. 把共享目录添加到/etc/exports文件中,内容如下:
/home/yangjiabo 172.16.20.215(rw,sync,all_squash)
当客户端172.16.20.215访问共享目录的时候,使用的nfsnobody用户。所以要给nfsnobody用户权限。
chown -R nfsnobody.nfsnobody /home/yangjianbo
4. 修改完以后,一定要重新加载配置,一定要注意。不需要重启NFS服务。
[root@localhost home]# exportfs -rv
5. 在NFS服务器上查看一下挂载情况:showmount -e localhost
6. 在NFS客户端上也要安装rpcbind和NFS,但是NFS可以不用启动。
查看一下挂载目录:showmount -e nfs的IP
挂载命令:mount -t nfs 172.16.252.190:/home/yangjianbo /home/yangjianbo
前提一定要客户端存在/home/yangjiabo目录。
6. NFS客户端配置
1. 挂载命令
语法:mount -t nfs nfs_IP:共享目录 客户端挂载点(必须存在)
2. 挂载失败排错思路
1. 先看一下服务器上是否可以挂载
showmount -e localhost
mount -t nfs 172.16.252.190:/home/yangjianbo /mnt
2. 再从客户端showmount服务器是否正常。
showmount -e 172.16.252.190
3. 如果不正常,就看看网络是不是有问题,或者防火墙屏蔽掉了。
3. NFS客户端开机自启动挂载
1. 将挂载命令放在/etc/rc.local里。
缺点:偶尔挂载不上,生产需要对挂载监控。
#mount by www /bin/mount -t nfs 172.16.252.190:/usr/local/cmrcms /home/www
2. 将挂载目录放在/etc/fstab里。
echo "172.16.252.190:/usr/local/cmrcms /home/www nfs defaults 0 0" >> /etc/fstab
7. NFS高级配置
1. NFS服务端指定固定UID访问共享目录
1. 在NFS服务器上创建用户和组,指定UID和GID,然后把共享目录的属主属组指到该用户和组上。
groupadd web -g 888
useradd www-user -u 888 -g web
mkdir -p /home/www
chown -R www-user.web /home/www
echo '#www' >>/etc/exports
echo '/home/www 172.16.20.215(rw,sync,all_squash,anonuid=888,anongid=888)' >>/etc/exports
2. NFS客户端操作
1. 建立用户和组,同上一样。
groupadd web -g 888
useradd www-user -u 888 -g web
mkdir /home/test
mount -t nfs 172.16.252.190:/home/www /home/test
3. 如果出现属主和属组都为nobody,需要修改nfs服务器和nfs客户端文件/etc/idmapd.conf
Domain = zhen.com
[Mapping]
Nobody-User = java
Nobody-Group = java
CentOS6重启/etc/init.d/rpcidmapd restart
CentOS7重启systemctl restart rpcbind
NFS客户端重新挂载一下共享目录

浙公网安备 33010602011771号