目录
NFS概述
NFS是什么
NFS(Network File System,网络文件系统)是一种基于远程过程调用(RPC)协议,采用客户端\服务器结构实现的分布式文件系统。NFS允许系统在网络上与他人共享文件系统。主要功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据。NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂载到本地的NFS客户端中。在本地的NFS客户端的机器看来,NFS服务器共享的目录就好像自己的磁盘分区和目录一样。
NFS网络文件系统很像Windows系统的网络共享,安全功能,网络驱动器映射,这也和Linux系统的Samba服务相似。但一般情况下,Windows网络共享服务或Samba服务常用于办公室局域网共享,而互联网中小型网站集群架构后端常用NFS进行数据共享。
- Samba服务:Linux部署Samba服务实现Windows和Linux之间的数据共享存储
- NFS服务:Linux部署NFS服务实现Linux与Linux之间的数据共享存储
如果大型网站,还可能用到更为复杂的分布式文件系统,如Moosefs(mfs)、GlusterFS、FastDFS等。
- FastDFS:企业应用较多
- Moosefs:早期分布式存储,适合初学者
NFS的作用
- 实现数据的共享存储
- 便于数据操作管理
- 节省购买服务器磁盘开销
RPC是什么
由于NFS服务支持的功能很多,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能所对应的端口无法固定,而是随机采用未被使用的端口作为传输之用,这样就造成了客户端与服务端连接的困扰。
为了方便客户端和服务端的连接,需要使用RPC(Remote Procedure Call,远程过程调用)服务。RPC服务最主要的功能就是指定每个NFS功能对应的端口号,并且将该信息传递给客户端,让客户端能够连接到正确的端口。
为了让RPC知道NFS的端口信息,需要在启动NFS服务之前就启动RPC服务。而后服务器在启动NFS服务时会随机取用数个端口,并主动向RPC服务注册,因此RPC知道每个端口对应的NFS功能。RPC固定使用111号端口监听客户端的需求并且回应给客户端正确的端口。
NFS部署
NFS主机规划
IP | 主机名 | 功能 | 系统版本 |
---|---|---|---|
172.16.1.31 | nfs01 | 存储服务器 | CentOS 7.x |
172.16.1.7 | web01 | web服务器 | CentOS 7.x |
服务端部署
下载安装软件
检查nfs和rpc软件是否安装,如果没有,yum -y install nfs-utils rpcbind进行安装
[root@nfs01 ~]# rpm -qa | grep -E "nfs|rpc"
nfs4-acl-tools-0.3.3-14.el7.x86_64
xmlrpc-c-1.32.5-1905.svn2451.el7.x86_64
libnfsidmap-0.25-12.el7.x86_64
nfs-utils-1.3.0-0.21.el7.x86_64
libtirpc-0.2.4-0.6.el7.x86_64
xmlrpc-c-client-1.32.5-1905.svn2451.el7.x86_64
rpcbind-0.2.0-32.el7.x86_64
编写配置文件
[root@nfs01 ~]# vim /etc/exports
/share 172.16.1.0/24(rw,sync)
NFS配置文件格式
NFS服务的配置文件为/etc/exports(NFS的主配置文件,该文件不一定存在,需要vim手动建立),配置文件格式:
NFS共享目录 NFS客户端地址(参数1,参数2,… )
NFS共享目录 NFS客户端地址1(参数1, 参数2,…) NFS客户端地址2(参数1,参数2,…)
NFS共享目录:NFS服务器共享给客户机使用的目录
客户端地址:网络中可以访问这个NFS共享目录的主机
- 指定ip地址的主机
- 指定子网中的所有主机
- 指定域名的主机
- 指定域中的所有主机
- 所有主机
参数:设置共享目录的访问权限/用户映射等参数
NFS配置参数权限
访问权限参数 | 作用 |
---|---|
rw | 共享目录是否有读写权限 |
ro | 共享目录是否是只读权限 |
存储方式参数 | 作用 |
---|---|
sync | 同步方式存储数据(存入磁盘,保证数据可靠性,但数据传输慢) |
async | 异步方式存储数据(存入内存,传输数据快,减缓磁盘压力,但容易丢失) |
用户映射参数 | 作用 |
---|---|
root_squash | 将root用户的访问映射为匿名用户nfsnobody的uid和gid(默认配置) |
no_root_squash | 不要将root用户映射为匿名用户的uid和gid(对共享文件仍拥有权限) |
all_squash | 将远程访问的所有普通用户的访问都映射为匿名用户nfsnobody的uid和gid |
no_all_squash | 不要将普通用户映射为匿名用户的uid和gid(默认配置) |
anonuid=xxx | 将远程访问的所有用户都映射为指定uid的匿名用户 |
anongid=xxx | 将远程访问的所有用户组都映射为指定gid匿名组用户 |
如何改变默认的映射用户?
在/etc/exports配置文件中将anonuid和anongid设置为要映射的用户uid和gid即可:
[root@nfs01 ~]# vim /etc/exports
/share 172.16.1.0/24(rw,sync,anonuid=1002,anongid=1002)
Web+NFS+Rsync结合看用户映射
企业如何配置NFS各种squash参数保证网站存储服务器的数据安全?
- no_all_squash:若设置all_squash参数使所有普通用户可以映射到nfsnobody虚拟用户获取共享目录权限.倘若有黑客获取Web服务器的任何一个普通用户身份, 就会对NFS服务器的数据造成威胁.
- NFS服务器设置一个UID和GID都与Web服务器的www用户相同的www用户, 并且将共享目录的所有者和所属组设置为该www用户:chown www.www /share, 因此Web服务器的www用户无需经过身份映射即可对共享目录进行操作.
- root_squash:使root用户的访问映射为nfsnobody用户, 但是共享目录的所有者和所属组已经设置为与Web服务器的www用户uid和gid相同的用户, 因此即使root用户映射为nfsnobody虚拟用户,也无法对共享目录进行操作.
no_all_squash和root_squash都是NFS的默认配置, NFS的默认配置的记录文件/var/lib/nfs/etab:
[root@nfs01 ~]# cat /var/lib/nfs/etab
/share 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)
搭建服务环境
查看NFS虚拟用户
nfsnobody用户由NFS服务自动创建
[root@nfs01 ~]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
创建共享目录
创建配置文件/etc/exports中设置的共享存储目录并将目录所有者和所属组属性改为NFS虚拟用户nfsnobody
[root@nfs01 ~]# mkdir -p /share
[root@nfs01 ~]# chown nfsnobody.nfsnobody /share
[root@nfs01 ~]# ll /share/ -d
drwxr-xr-x 2 nfsnobody nfsnobody 6 Jul 23 14:27 /share/
启动服务程序
RPC服务
首先启动RPC服务
[root@nfs01 ~]# systemctl start rpcbind.service # 启动rpcbind服务
[root@nfs01 ~]# netstat -lntup|grep 111 # 通过端口号查看rpcbind服务是否成功启动
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 5090/rpcbind
tcp6 0 0 :::111 :::* LISTEN 5090/rpcbind
udp 0 0 0.0.0.0:111 0.0.0.0:* 5090/rpcbind
udp6 0 0 :::111 :::* 5090/rpcbind
设置RPC服务开机自启
[root@nfs01 ~]# systemctl enable rpcbind.service # 开机自启不起作用
[root@nfs01 ~]# systemctl is-enabled rpcbind.service
indirect
[root@nfs01 ~]# systemctl add-wants multi-user rpcbind.service # 强制使rpcbind服务由目标(例如多用户)启动
Created symlink from /etc/systemd/system/multi-user.target.wants/rpcbind.service to /usr/lib/systemd/system/rpcbind.service.
[root@nfs01 ~]# systemctl is-enabled rpcbind.service
enabled
NFS服务
启动RPC服务后启动NFS服务
[root@nfs01 ~]# systemctl start nfs
[root@nfs01 ~]# netstat -lntup | grep nfs # 通过netstat无法查询到nfs,因为nfs直接将信息注册到rpc,未必会告诉系统
[root@nfs01 ~]# systemctl status nfs
......
Active: active (exited) since Fri 2021-07-23 14:44:52 CST; 23s ago
Process: 6530
......
通过查看rpc服务注册信息可以看到NFS服务的一些信息
[root@nfs01 ~]# 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 58132 status
100024 1 tcp 60221 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 47593 nlockmgr
100021 3 udp 47593 nlockmgr
100021 4 udp 47593 nlockmgr
100021 1 tcp 36643 nlockmgr
100021 3 tcp 36643 nlockmgr
100021 4 tcp 36643 nlockmgr
设置NFS开机自启
[root@nfs01 ~]# systemctl enable nfs
[root@nfs01 ~]# systemctl is-enabled nfs
enabled
客户端部署
安装NFS服务软件
[root@web01 ~]# yum install -y nfs-utils.x86_64
远程挂载共享目录
临时挂载
[root@web01 ~]# mkdir /share
[root@web01 ~]# mount -t nfs 172.16.1.31:/share /share
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 18G 4.8G 13G 28% /
devtmpfs 898M 0 898M 0% /dev
tmpfs 913M 84K 913M 1% /dev/shm
tmpfs 913M 8.9M 904M 1% /run
tmpfs 913M 0 913M 0% /sys/fs/cgroup
/dev/sda1 497M 158M 340M 32% /boot
tmpfs 183M 16K 183M 1% /run/user/42
tmpfs 183M 0 183M 0% /run/user/0
172.16.1.31:/share 18G 4.8G 13G 28% /share
自动挂载
-
利用rc.local文件
echo “mount -t nfs 172.16.1.31:/share /share” >> /etc/rc.local
-
利用fstab文件(想要fstab实现开机自动挂载,需要保障remote-fs服务开机自启)
# vim /etc/fstab
172.16.1.31:/share /share nfs defaults
mount命令参数
参数 | 作用 |
---|---|
rw | 挂载后挂载点目录可读可写(默认) |
ro | 挂载后挂载点目录只读 |
suid | 挂载点目录setuid权限位生效(默认) |
nosuid | 挂载点目录setuid权限位不生效 , 提高目录的安全性 |
exec | 挂载点目录中的可执行文件可以直接执行(默认) |
noexec | 挂载点目录中的可执行文件无法直接执行,提高目录的安全性 |
auto | 可以实现自动挂载, 配合mount -a命令使用 ,实现加载fstab文件自动挂载(默认) |
noauto | 不可以实现自动挂载 |
user | 允许普通用户执行mount/umount操作 |
nouser | 禁止普通用户执行mount/umount操作(默认) |
共享目录存储测试
[root@web01 ~]# touch /share/test_web.txt
[root@web01 ~]# ls /share/
test_web.txt
[root@nfs01 ~]# ls /share/
test_web.txt
总结
NFS共享目录权限相关因素
- 共享目录本身权限 (755 nfsnobody nfsnobody)
- 配置文件权限参数(rw/ro *squash anonuid/anongid)
- 客户端挂载命令参数 (rw/ro)
企业如何编辑NFS配置文件
-
通用方法
/share 172.16.1.0/24(rw,sync)
-
只能看共享目录的数据而不能操作
/share 172.16.1.0/24(ro,sync)
-
修改默认的虚拟用户
/share 172.16.1.0/24(rw,sync,anonuid=xxx,anongid=xxx)
NFS服务可能遇到的问题
- nfs服务重启, 挂载后创建数据较慢
原因: 重启方式不正确
restart: 重启服务. 强制断开所有连接, 不管是否有数据传输, 直接将与客户端的连接断开, 用户感受不好
reload: 重启服务(平滑重启). 强制断开没有数据传输的连接, 有数据传输的连接先将数据传输完毕再断开, 提升用户感受
NFS服务挂载不上排查方法
服务端排查:
- 检查nfs进程信息是否注册:rpcinfo -p localhost
问题原因:rpc与nfs服务启动顺序不对,或没有启动nfs服务 - 检查有无可用共享目录:showmount -e localhost
问题原因:配置文件编写有问题,或重启nfs服务 - 在服务端进行挂载测试,是否能够在共享目录中创建或删除数据
客户端测试:
- 检查nfs进程信息是否注册:rpcinfo -p localhost
问题原因:rpc与nfs服务启动顺序不对,或没有启动nfs服务 - 检查有无可用共享目录:showmount -e localhost
问题原因:配置文件编写有问题,或重启nfs服务 - 网络问题:ping 172.16.1.31 / telnet 172.16.1.31 111
NFS/RPC启用的进程
[root@nfs01 ~]# ps -ef | grep -E "nfs|rpc"
root 747 2 0 10:02 ? 00:00:00 [rpciod]
avahi 889 1 0 10:02 ? 00:00:00 avahi-daemon: running [nfs01.local]
rpc 899 1 0 10:02 ? 00:00:00 /sbin/rpcbind -w
rpcuser 1225 1 0 10:03 ? 00:00:00 /usr/sbin/rpc.statd — — 检查数据存储一致性
root 5431 1 0 10:54 ? 00:00:00 /usr/sbin/rpc.idmapd — — 用户映射转换
root 5434 1 0 10:54 ? 00:00:00 /usr/sbin/rpc.mountd — — 权限管理验证等
root 5441 2 0 10:54 ? 00:00:00 [nfsd4]
root 5442 2 0 10:54 ? 00:00:00 [nfsd4_callbacks]
root 5453 2 0 10:54 ? 00:00:00 [nfsd] — — NFS主进程
root 5455 2 0 10:54 ? 00:00:00 [nfsd]
root 5456 2 0 10:54 ? 00:00:00 [nfsd]
root 5458 2 0 10:54 ? 00:00:00 [nfsd]
root 5460 2 0 10:54 ? 00:00:00 [nfsd]
root 5461 2 0 10:54 ? 00:00:00 [nfsd]
root 5463 2 0 10:54 ? 00:00:00 [nfsd]
root 5465 2 0 10:54 ? 00:00:00 [nfsd]
root 5620 5197 0 10:59 pts/0 00:00:00 grep --color=auto -E nfs|rpc