NFS网络文件共享服务
NFS介绍
- NFS是Network File System的缩写,中文意思是网络文件系统.主要功能是通过网络(一般是局域网)让不同主机之间可以共享文件或目录.NFS客户端(一般为应用服务器,如Web)可以通过挂载(mount)方式将NFS服务器端共享的数据目录挂载到NFS本地客户端(就是某一个挂载点下).从本地客户端来看,NFS服务器端共享的目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录
NFS应用场景
- 在企业架构中,NFS网络文件系统一般用来存储共享视频、图片、附件、头像等静态资源文件,通常网站用户上传的文件都会放到NFS共享文件中.前端所有到的节点访问这些静态资源时都会读取NFS存储上的资源
- 没有NFS共享存储访问
- NFS共享存储访问
NFS系统原理
- NFS服务器端设置好一个共享目录/video后,其他的有NFS服务器端的客户端可以将这个共享目录/video,挂载到客户端本地某个挂载点,挂载点就是一个目录,这个挂载点目录可以自己随意指定,上图中的两个NFS客户端挂载点分别为/v/video和/video,不同客户端的挂载点可以不相同
- NFS在传输数据时使用的端口会随机选择.是通过RPC(Remote Procedure Call,远程过程调用)协议/服务来实现
RPC
- NFS支持的功能相当多,而不同的功能会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此,NFS的功能所对应的端口无法固定,它会随机取用一些未被使用的端口作为传输
- 因为端口不确定,会造成NFS客户端与服务端的通信障碍,这时就需要RPC服务的帮助.NFS的RPC服务最主要的功能就是记录每个NFS功能所对应的端口号,并且在NFS客户端发出请求时将该端口和功能对应的信息传递给请求数据的NFS客户端,从而确保客户端可以连接到正确的NFS端口,达到数据传输、交互数据的目的.RPC服务类似于NFS服务器端和客户端之间的一个中介
- 当NFS服务器端启动服务时会随机取用若干端口,并主动向RPC服务注册取用的相关端口及功能信息,如此一来,RPC服务就知道NFS每个端口对应的NFS功能,然后RPC服务使用固定的111端口来监听客户端提交的请求,并将正确的NFS端口信息回复给请求的NFS客户端
- 在启动NFS Server之前,首先要启动RPC服务,否则NFS Server就无法向RPC服务注册.另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会丢失,因此,此时RPC服务管理的NFS程序也需要重新启动以重新向RPC注册.要特别注意,修改NFS配置文件后是不需要重启NFS,直接在命令行执行systemctl reload nfs即可使修改的/etc/exports生效
NFS工作原理
- 当程序通过NFS客户端向NFS服务端存取文件时,流程是
- 用户访问网站程序,由程序在NFS客户端上发出存取NFS文件请求,这是NFS客户端的RPC服务(rpcband)就会通过网络向NFS服务器端的RPC服务的111端口发出NFS文件存取功能的询问请求
- NFS服务器RPC服务找到对应已注册的NFS端口后,通知NFS客户端RPC服务
- NFS客户端获取到正确的端口,与NFS daemon联机存取数据
- NFS客户端将数据存取成功后返回给前端访问程序,告知给用户存取结果
- 因为NFS的各项功能都需要向RPC服务注册,所以只有RPC服务才能获取到NFS服务的各项功能对应的端口号、PID、NFS在主机所监听的IP等信息,而NFS客户端也只能通过向RPC服务询问才能找到正确的端口.也就是说,NFS需要有RPC服务的协助才能成功对外提供服务.NFS服务必须在RPC服务启动之后启动
NFS服务端部署
服务器系统 | 服务器角色 | 内外网IP |
---|---|---|
CentOS 7.6 x86_64 | NFS服务器端(NFS01) | eth0:10.0.0.31 eth1:172.16.1.31 |
CentOS 7.6 x86_64 | NFS客户端1(Web01) | eth0:10.0.0.7 eth1:172.16.1.7 |
CentOS 7.6 x86_64 | NFS客户端2(BACKUP) | eth0:10.0.0.41 eth1:172.16.1.41 |
NFS服务器端安装
- NFS软件列表
- nfs-utils:NFS服务的主程序,包括rpc.nfsd、rpc.mountd
- rpcbind:RPC主程序,NFS可视为一个RPC程序,在启动任何一个RPC程序之前,需要做好端口和功能的映射,由rpcbind服务来完成
- 安装软件包
yum install nfs-utils rpcbind -y
-
启动NFS相关服务
- 启动rpcbind服务
yum install nfs-utils rpcbind -y # rpc被systemd接管了 netstat -tunlp |grep -E 'rpc|111' tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd # 查看NFS服务向ROC服务注册的端口信息 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
- 启动NFS服务
systemctl start nfs systemctl enable nfs # 查看NFS服务向ROC服务注册的端口信息 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 17969 status 100024 1 tcp 52251 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 43699 nlockmgr 100021 3 udp 43699 nlockmgr 100021 4 udp 43699 nlockmgr 100021 1 tcp 14415 nlockmgr 100021 3 tcp 14415 nlockmgr 100021 4 tcp 14415 nlockmgr
- NFS进程说明
ps -ef|grep -E 'rpc|nfs'
rpc 7924 1 0 20:38 ? 00:00:00 /sbin/rpcbind -w
rpcuser 7959 1 0 20:42 ? 00:00:00 /usr/sbin/rpc.statd
root 7960 2 0 20:42 ? 00:00:00 [rpciod]
root 7968 1 0 20:42 ? 00:00:00 /usr/sbin/rpc.idmapd
root 8012 1 0 20:42 ? 00:00:00 /usr/sbin/rpc.mountd
root 8017 2 0 20:42 ? 00:00:00 [nfsd4_callbacks]
root 8023 2 0 20:42 ? 00:00:00 [nfsd]
root 8024 2 0 20:42 ? 00:00:00 [nfsd]
root 8025 2 0 20:42 ? 00:00:00 [nfsd]
root 8026 2 0 20:42 ? 00:00:00 [nfsd]
root 8027 2 0 20:42 ? 00:00:00 [nfsd]
root 8028 2 0 20:42 ? 00:00:00 [nfsd]
root 8029 2 0 20:42 ? 00:00:00 [nfsd]
root 8030 2 0 20:42 ? 00:00:00 [nfsd]
- NFS服务的主要任务是共享数据,而数据的共享离不开权限.所以NFS服务器启动时最少需要两个不同的进程,一个是管理NFS客户端是否能够登陆的rpc.nfsd主进程,另一个管理NFS客户端是否能够取得对应权限的rpc.mountd进程.如果还要管理磁盘,则NFS还需要加载rpc.rquotad进程
服务或进程名 | 用途说明 |
---|---|
nfsd(rpc.nfsd) | rpc.nfsd的主要功能是管理NFS客户端是否能够登录NFS服务器端主机,其中还包含登录者的ID判别 |
mountd(rpc.mountd) | rpc.mountd的主要功能是管理NFS文件系统.当NFS客户端顺利通过rpc.nfsd登录NFS服务器端主机时,在使用NFS服务器提供数据之前,它会去读NFS的配置文件/etc/exports来比对NFS客户端的权限,通过这一关后,还会经过NFS服务器端本地文件系统使用权限(u,g,o)的认证程序.如果都通过了,NFS客户端就可以取得使用NFS服务器端文件的权限./etc/exports文件是用来管理NFS共享目录的使用权限与安全设置的依据,强调的是,NFS本身设置的是网络共享权限,整个共享目录的权限还和目录自身的系统权限有关 |
rpc.lockd(非必要) | 可用来锁定文件,用于多客户端同时写入 |
rpc.statd(非必要) | 检查文件的一致性,与rpc.lockd有关.监听来自其它主机重启的通知,并且管理本地系统重启时的主机列表 |
rpc.idmapd | 名称映射后台进程 |
配置NFS服务器端
- NFS服务的默认配置文件路径为/etc/exports
配置文件格式
NFS共享目录 NFS客户端地址(参数1,参数2)
NFS共享目录 NFS客户端地址1(参数1,参数2) NFS客户端地址2(参数1,参数2)
# sample /etc/exports file
/ master(rw) trusty(rw,no_root_squash)
/projects proj*.local.domain(rw)
/usr *.local.domain(ro) @trusted(rw)
/home/joe pc001(rw,all_squash,anonuid=150,anongid=100)
/pub *(ro,insecure,all_squash)
/srv/www -sync,rw server @trusted @external(ro)
/foo 2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)
/build buildhost[0-9].local.domain(rw)
- 参数含义
- NFS共享目录:为NFS服务端要共享的实际目录,要用绝对路径,注意共享目录的本地权限,如果需要读写共享,一定要让本地目录可以被NFS客户端的用户(nfsnonody)读写
- NFS客户端地址:为NFS服务器端授权的可访问共享目录的NFS客户端地址,可以为单独的IP地址或主机名、域名等,也可以为整个网段,还可以使用"*"来匹配所有客户端服务器,这里的客户端一般来说是前端的业务服务器,如Web服务
- 权限参数集:对授权的NFS客户端的访问权限设置
客户端地址 | 具体地址 | 说明 |
---|---|---|
授权单一客户端访问NFS | 172.16.1.7 | 生产环境使用不多 |
授权整个网段访问NFS | 172.16.1.0/24 | 最常见的配置.配置简单、维护方便 |
授权整个网段访问NFS | 172.16.1.* | 指点网段的其他写法(不推荐) |
授权某个域名客户端访问NFS | nfs.test.com | 生产环境一般不用 |
授权整个域名客户端访问NFS | *.test.com | 生产环境一般不用 |
配置实例
常用格式说明 | 要共享的目录 客户端IP地址或IP端(参数1,参数2) |
---|---|
配置例一 | /data 172.16.1.0/24(rw,sync),允许客户端读写,并且数据同步到服务器端的磁盘 /data172.16.1.0/24(rw,sync) 10.0.0.0/24(ro) 允许同时存在不同的授权 |
配置例二 | /data 172.16.1.0/24(rw,sync,all_squash,anonuid=2000,anongid=2000),允许客户端读写,并且数据同步到服务器端的磁盘,并且制定客户端的用户UID和GID |
配置例三 | /home/test 172.16.1.0/24(ro),只读共享 |
- /data为要共享的NFS服务器端目录,注意要使用绝对路径
- 172.16.1.0/24表示运行NFS客户端访问共享目录的网段范围
- (rw,sync):rw表示读写,sync表示数据同步写入到NFS服务器端的硬盘
- 可以使用通配符'*'替换iP地址
NFS配置文件权限参数
参数名称 | 参数用途 |
---|---|
rw | Read-write,表示可读写权限 |
ro | Read-only,表示只读权限 |
sync | 请求或写入数据时,数据同步写入到NFS Server的硬盘才返回.优点:数据安全不丢失;缺点:性能比不启用该参数时要差 |
async | 写入数据时会写到内存缓冲区,直到硬盘有空档才会再写入磁盘,提示写入效率.风险:服务器宕机或不正常关机,会损失缓冲区中未写入磁盘的数据(解决方法:服务器主板电池或加UPS不间断电源) |
no_root_squash | 访问NFS Server共享目录的用户如果是root的话,他对该共享目录具有root权限.避免使用 |
root_squash | 访问NFS Server共享目录的用户时root,则它的权限将被压缩成匿名用户,同时它的UID和GID通常会变成nfsnobody账号身份 |
all_squash | 不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩成匿名用户,同时它的UID和GID都会变成nfsnobody账号身份 |
anonuid | 参数以anon开头即指anonymous匿名用户,这个用户的UID设置值通常为nfsnody的UID值,也可以自行设置,但UID必须存在于/etc/passwd中.在多NFS Clients时,如多台Web Server共享一个NFS目录,通过这个参数就可以使得不同的NFS Clients写入的数据对所有NFS Clients保持同样的用户权限,即为配置的匿名UID对应用户权限,一般默认即可* |
anongid | 同anonuid,区别就是把UID换成GID |
- man exports查看更多参数
- NFS权限设置参数流程
NFS实践
共享/data目录给172.16.10/24整个网段,可读写
-
在NFS Server端执行的操作
- 创建共享目录并授权
mkdir -p /data touch /data/1.txt chown -R nfsnobody.nfsnobody /data
- 创建NFS服务配置文件,并在本地查看挂载信息
vim /etc/exports /data 172.16.1.0/24(rw,sync) # 写入此条内容 # 平滑加载,使修改的配置内容生效 systemctl reload nfs # 查看挂载情况 showmount -e localhost # 输出结果 Export list for localhost: /data 172.16.1.0/24 # 查看NFS Server配置文件参数(包括默认加载的参数) cat /var/lib/nfs/etab # 输出结果 /data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)
- 把本地服务器端作为客户端进行挂载测试
mount -t nfs 172.16.1.31:/data /mnt ls /mnt # 输出结果 1.txt df -h|tail -1 # 输出结果 172.16.1.31:/data 196G 1.9G 195G 1% /mnt
-
在NFS Client端执行的操作
- 安装nfs-utils,rpcbind软件包
yum install nfs-utils rpcbind -y
- 启动RPC服务(注意,因为是客户端,所以无须启动NFS服务)
systemctl enable rpcbind systemctl start rpcbind
- 挂载NFS共享目录/data
# 挂载前先检查需要挂载的权限信息,是否能够挂载 showmount -e 172.16.1.31 # 查看结果 Export list for 172.16.1.31: /data 172.16.1.0/24 mount -t nfs 172.16.1.31:/data /mnt ls /mnt # 查看结果 1.txt # 客户端挂载的mnt目录属主和属组权限和共享目录相同 ll /mnt -d drwxr-xr-x. 2 nfsnobody nfsnobody 32 4月 12 22:24 /mnt ll /mnt 总用量 8 -rw-r--r--. 1 nfsnobody nfsnobody 4 4月 12 22:00 1.txt ll -d /data/ drwxr-xr-x. 2 nfsnobody nfsnobody 32 4月 12 22:24 /data/ ll /data/ 总用量 8 -rw-r--r--. 1 nfsnobody nfsnobody 4 4月 12 22:00 1.txt
- 从客户端web01测试读写NFS服务器数据
touch 2.txt echo 222 > 2.txt # 切换到nfs服务器端进行查看 ls /data/ # 输出结果 1.txt 2.txt cat /data/2.txt # 输出结果 222
NFS梳理
-
当多个NFS客户端访问服务器端读写文件时,需要以下几个权限
- NFS服务器/etc/exports设置需要开放可写入的权限,即服务器端的共享权限
- NFS服务器实际要共享的NFS目录权限具有写入的权限,即服务器端本地目录的安全权限
- 每台机器都对应存在和NFS默认配置UID的相同UID65534的nfsnobody用户(确保所有客户端的访问权限统一,否则每个机器需要同时建立相同UID的用户,并覆盖NFS的默认用户配置)
NFS服务文件或命令的说明
NFS常用路径 | 说明 |
---|---|
/etc/exports | NF服务主配置文件,配置NFS具体共享服务的依据,默认为空,以行为单位 |
/usr/sbin/exportfs | NFS服务的管理命令.可以加载NFS配置生效,好可以直接配置NFS共享目录,即无需配置/etc/exports实现共享.exportfs不但可以加载配置生效,也可以通过命令直接共享目录.越过/etc/exports,但是重启失效 |
/usr/bin/showmount | 用来在客户端查看NFS配置及挂载结果的命令 |
/var/lib/nfs/etab | NFS配置文件完整参数文件(有很多没有配置但是默认就有的NFS参数) |
/proc/mounts | 本地客户端挂载参数和状态信息的文件 |
/var/lib/nfs/rmtab | 客户端访问服务器exports的信息列表(CentOS7取消此功能) |