1.1 NFS简介
Network File System(网络文件系统),由Sun公司研发,Unix-Like;nfs是基于RPC机制来实现的,它是内核级文件系统。网络文件系统,就是跨网络的文件系统,将远程主机上的文件系统或目录存放在本地主机上,就像它是本地文件系统一样,在Windows环境下有cifs协议实现的网络文件系统,在Unix环境下,是由NFS协议实现的NFS文件系统。
nfs版本:nfsv1、nfsv2、nfsv3、nfsv4
nfsd:监听在tcp/2049端口
1.2 RPC介绍
RPC:Remote Procedure Call(远程过程调用)
-
rpc.mountd:完成认证;
-
rpc.lockd
-
rpc.statd
1.2.1 RPC原理
1.3 安装NFS
由于nfs是使用RPC框架实现的,所以需要先安装好rpcbind。不过安装nfs-utils时会自动安装rpcbind。
# yum install -y nfs-utils
NFS是由很多进程组成,这些进程的启动程序都是由nfs-utils包提供
[root@CentOS7-171 ~]# rpm -ql nfs-utils | grep /usr/sbin/
/usr/sbin/blkmapd
/usr/sbin/exportfs
/usr/sbin/mountstats
/usr/sbin/nfsdcltrack
/usr/sbin/nfsidmap
/usr/sbin/nfsiostat
/usr/sbin/nfsstat
/usr/sbin/rpc.gssd
/usr/sbin/rpc.idmapd
/usr/sbin/rpc.mountd
/usr/sbin/rpc.nfsd
/usr/sbin/rpcdebug
/usr/sbin/showmount
/usr/sbin/sm-notify
/usr/sbin/start-statd
启动NFS
[root@CentOS7-171 ~]# systemctl start nfs.service
其中以"rpc."开头的程序都是rpc service,分别实现不同的功能,启动它们时每个都需要向rpcbind进行登记注册。
[root@CentOS7-171 ~]# 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 50397 status
100024 1 tcp 40547 status
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
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 37789 nlockmgr
100021 3 udp 37789 nlockmgr
100021 4 udp 37789 nlockmgr
100021 1 tcp 44165 nlockmgr
100021 3 tcp 44165 nlockmgr
100021 4 tcp 44165 nlockmgr
可以看到,每个program都启动了不同版本的功能。
program
|
说明
|
nfs program
|
为rpc.nfsd对应的program,为nfs服务的主进程,端口号为2049。
|
mountd
|
对应的program为rpc.mountd,它为客户端的mount和umount命令提供服务,即挂载和卸载NFS文件系统时会联系mountd服务,由mountd维护相关挂载信息。
|
nlockmgr
|
对应的program为rpc.statd,用于维护文件锁和文件委托相关功能,在NFSv4以前,称之为NSM(network status manager)。
|
nfs_acl和status
|
是访问控制列表和状态信息维护的program。
|
查看NFS启动的相关进程信息
[root@CentOS7-171 ~]# ps aux | grep -E "[n]fs|[r]pc"
root 664 0.0 0.0 0 0 ? S< Jun13 0:00 [rpciod]
root 3687 0.0 0.2 42548 1188 ? Ss 06:15 0:00 /usr/sbin/rpc.mountd
root 3688 0.0 0.0 21372 416 ? Ss 06:15 0:00 /usr/sbin/rpc.idmapd
root 3698 0.0 0.0 0 0 ? S< 06:15 0:00 [nfsd4]
root 3699 0.0 0.0 0 0 ? S< 06:15 0:00 [nfsd4_callbacks]
root 3705 0.0 0.0 0 0 ? S 06:15 0:00 [nfsd]
root 3706 0.0 0.0 0 0 ? S 06:15 0:00 [nfsd]
root 3707 0.0 0.0 0 0 ? S 06:15 0:00 [nfsd]
root 3708 0.0 0.0 0 0 ? S 06:15 0:00 [nfsd]
root 3709 0.0 0.0 0 0 ? S 06:15 0:00 [nfsd]
root 3710 0.0 0.0 0 0 ? S 06:15 0:00 [nfsd]
root 3711 0.0 0.0 0 0 ? S 06:15 0:00 [nfsd]
root 3712 0.0 0.0 0 0 ? S 06:15 0:00 [nfsd]
rpcuser 122682 0.0 0.3 44452 1832 ? Ss 01:42 0:00 /usr/sbin/rpc.statd
rpc 122683 0.0 0.3 69156 1468 ? Ss 01:42 0:00 /sbin/rpcbind -w
1.4 NFS配置文件
1.4.1 NFS配置文件exports文件格式
NFS默认配置文件路径:/etc/exports
配置/etc/exports文件格式:
[root@CentOS7-171 ~]# cat /etc/exports
/data 192.168.5.0/24(rw,async)
NFS共享目录 客户端地址1(参数1,参数2 ...) 客户端地址2(参数1,参数2 ...)
1.4.2 配置nfs导出目录的几种方式
/data 192.168.5.171(rw,async) # 仅导出单台主机192.168.5.171
/data
www.zhucke.com
(rw,async)
# 仅导出单台主机www.zhucke.com,但必须能解析该主机名。
/data
192.168.5.0/24(rw,async) 192.168.4.180(rw,no_root_squash) #导出192.168.5.0/24网段,和导出单台主机192.168.4.180,且导出选项各不相同。
/data
*
(rw,async,no_root_squash) # 导出所有主机,表示使用*号通配所有客户端;
1.4.3 NFS配置权限设置
NFS配置权限设置,即/etc/exports文件配置格式中小括号()里的参数集。
参数名称
|
用途
|
rw
|
read-write,读写权限;
|
ro
|
read-only,只读权限;
|
root_squash
|
压缩root用户权限;对于访问NFS Server共享目录的用户如果是root,则它的权限将被压缩成匿名用户,同时它的UID和GID都会变成nfsnobody账号身份。
|
no_root_squash
|
不压缩root用户权限;
访问
NFS Server
共享目录的用户如果是
root
,它对该共享具有
root
权限。这个配置原本为无盘客户端准备的,用户就避免使用!
|
all_squash
no_all_squash
|
压缩所有用户权限;不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩成匿名用户,同时它的UID和GID都会变成nfsnobody帐号身份。在多个NFS客户端同时读写NFS Server数据时,这个参数很有用。
|
anonuid and anongid
|
映射至何用户。以anon开头指anonymous匿名用户,这个用户的UID设置值通常为nobody或nfsnobody的UID值,可以自行设置这个UID值。但是,UID必须存在于/etc/passwd中。在多个NFS Clients时,如多台web server共享一个NFS目录时,通过这个参数可以使得不同的NFS Clients写入的数据对所有NFS Clients保持同样的用户权限,即为配置的匿名UID对应用户权限,这个参数很有用。
|
sync
|
请求或写入数据时,数据同步写入到
NFS Server
的硬盘后才会返回。
|
async
|
请求或写入数据时,先返回请求,再将数据写入到内存缓存和硬盘中,此参数可以提升NFS性能,但是会降低数据的安全。因此,一般情况下不建议使用,如果NFS处于瓶颈状态,并且允许数据丢失,可以打开此参数提升NFS性能。
写入时会先放到内存缓冲区,等硬盘空闲再写入磁盘提升写入效率!风险为若服务器宕机或不正常关机,会损失磁盘的数据!
|
提示:通过执行man exports查阅更多exports参数说明。
在配置文件写好要导出的目录后,直接重启nfs服务,它会读取这些配置文件。随后就可以在客户端执行mount命令进行挂载。
# 创建需要导出的目录
[root@CentOS7-171 ~]# mkdir -p /data/{test1,test2}
[root@CentOS7-171 ~]# mkdir -p /backup/web
示例:exports文件内容如下:
[root@CentOS7-171 ~]# vim /etc/exports
/data/test1 *(rw,no_root_squash)
/data/test2 *(rw,no_root_squash)
/backup/web *(rw,no_root_squash)
1.5 挂载NFS文件系统
在客户端上挂载它们
[root@localhost ~]# mount -t nfs 192.1.68.5.171:/data/test1 /web
[root@localhost ~]# mount 192.168.5.171:/data/test2 /web2
[root@localhost ~]# mount 192.168.5.171:/backup/web /web3
挂载时“-t nfs”可以省略,因为对于mount而言,只有挂载nfs文件系统才会写成host:/path格式。当然,除了mount命令,nfs-utils包还提供了独立的mount.nfs命令,它其实和"mount -t nfs"命令是一样的。
1.5.1 开机自动挂载NFS
开机自动挂载NFS文件系统有两种方式
1、写入/etc/fstab文件中
如果是将/etc/fstab中,那么在系统环境初始化(exec /etc/rc.d/rc.sysinit)的时候会加载fstab中的内容,如果挂载fstab中的文件系统出错,则会导致系统环境初始化失败,结果是系统开机失败。所以,要开机挂载nfs文件系统,则需要在/etc/fstab中加入一个挂载选项"_netdev",防止无法联系nfs服务端时导致开机启动失败。例如:
192.168.5.171:/data/test2 /web2 nfs defaults,_netdev 0 0
注意:CentOS6在/etc/fstab文件中的挂载选项"_netdev"和"_rnetdev"都可以用,而CenOS7只能用"_netdev"。
2、在/etc/profile.d/目录下添加脚本
[root@localhost ~]# vim /etc/profile.d/mount.sh
#!/bin/sh
mount 192.168.5.171:/data/test1 /web
注意:CentOS7,不建议再将放至到/etc/rc.d/rc.local中,因为Centos7的/etc/rc.d/rc.local文件默认是没有执行权限,如果一定在放在此文件中,需要添加执行权限,系统才会执行此文件的中命令,才会自动挂载。
1.6 exportfs命令
exportfs - maintain table of exported NFS file systems,重新导出文件系统
-
-r 重新导出
-
-u 不导出
-
-a 导出所有的
示例:
(1)导出/data/test2目录给客户端192.168.5.172
服务端
[root@CentOS7-171 ~]# exportfs 192.168.5.172:/data/test2
客户端
[root@localhost ~]# showmount -e 192.168.5.171
Export list for 192.168.5.171:
/backup/web *
/data/test1 *
/data/test2 192.168.5.172
[root@localhost ~]# mount 192.168.5.171:/data/test2 /web2
(2)卸载导出的目录
卸载导出的目录前,首先要取消此目录的挂载。
客户端
[root@localhost ~]# showmount -e 192.168.5.171
Export list for 192.168.5.171:
/backup/web *
/data/test1 *
/data/test2 192.168.5.172
[root@localhost ~]# umount 192.168.5.171:/data/test2 #取消挂载
服务端
[root@CentOS7-171 ~]# exportfs -u 192.168.5.172:/data/test2 #卸载导出的目录
客户端
[root@localhost ~]# showmount -e 192.168.5.171
Export list for 192.168.5.171:
/data/test1 *
/backup/web *
(3)导出/data/test2目录给所有人,并指定导出选项
服务端
[root@CentOS7-171 ~]# exportfs :/data/test2 -o rw,no_root_squash
客户端
[root@localhost web2]# showmount -e 192.168.5.171
Export list for 192.168.5.171:
/data/test2 *
/backup/web *
/data/test1 *
(3)重新导出所有目录,包括exports文件中的内容和exportfs单独导出的内容。
服务端
[root@CentOS7-171 ~]# exportfs -ar
客户端
[root@localhost web2]# showmount -e 192.168.5.171
Export list for 192.168.5.171:
/backup/web *
/data/test1 *
#通过exportfs命令导出的目录已经不存在了,所以通过exportfs命令导出的目录是临时生效。
(4)卸载所有已导出的目录,包括exports文件中的内容和exportfs单独导出的内容,即其本质为清空内核维护的导出表。
服务端
[root@CentOS7-171 ~]# exportfs -au
客户端
[root@localhost web2]# showmount -e 192.168.5.171
Export list for 192.168.5.171:
1.7 showmount命令
showmount - show mount information for an NFS server
显示NFS服务的挂载信息
-
-e:显示NFS服务端所有导出列表
[root@localhost ~]# showmount -e 192.168.5.171
Export list for 192.168.5.171:
/data 192.168.5.0/24