综合架构2 - NFS存储服务
NFS介绍
什么是NFS
NFS(Network File System)网络文件共享系统,它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。NFS客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务器端共享的数据目录挂载到NFS客户端本地系统中(就是某一个挂载点下)。从客户端本地看,NFS服务器端共享的目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录。
NFS网络文件系统很像Windows系统的网络共享,安全功能,网络驱动器映射,这也和linux系统里的samba服务类似。只不过一般情况下, windows网络共享服务或samba服务用于办公室局域网共享,而互联网中小型网站集群机构后端常用NFS进行数据共享,如果大型网站,那么有可能还会用到更复杂的分布式文件系统,例如: Moosefs (mfs)、GlusterFS、 FastDFS
NFS存储服务的作用
1)实现数据的共享存储
2)便于数据操作管理
3)节省购买服务器磁盘开销
NFS的特点
1)提供透明文件访问以及文件传输
2)容易扩充新的资源或软件,不需要改变现有的工作环境
3)高性能,可灵活配置
存储服务的种类
FTP(File Transfer Protocol)文件传输协议,用于互联网双向传输,控制文件下载空间在服务器复制文件从本地计算机或本地上传文件复制到服务器上的空间。
Samba(Server Message Block)主要用于linux与windows之间数据传输,是一个能让Linux系统应用Microsoft网络通讯协议的软件,而SMB是Server Message Block的缩写,即为服务器消息块 ,SMB主要是作为Microsoft的网络通讯协议,后来Samba将SMB通信协议应用到了Linux系统上,就形成了现在的Samba软件。后来微软又把 SMB 改名为 CIFS(Common Internet File System),即公共 Internet 文件系统,并且加入了许多新的功能,使得Samba具有了更强大的功能。
NFS(Network File System)网络文件系统,主要用于linux与linux之间数据传输,让不同的主机系统之间通过网络可以共享文件或目录。
注:这些协议只能用于中小型企业,实现数据共享存储,大型网站(如门户网站、淘宝、京东...)主要用分布式存储
Moosefs(MFS)是一款具有冗余容错功能的分布式文件系统。它把数据分散在多台服务器上,确保一份数据多个备份副本,对外提供统一的结构。
GlusterFS 是一个开源的分布式文件系统,是Scale存储的核心,能够处理千数量级的客户端。是整合了许多存储块(server)通过Infiniband RDMA或者 Tcp/Ip方式互联的一个并行的网络文件系统。
FastDFS 是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
分布式存储原理图
RPC的作用
RPC最主要的功能就是指定每个NFS功能所对应的port number, 并且回报给客户端,让客户端可以连接到正确的端口上去。当服务器在启动NFS时会随机取用数个端口,并主动向RPC注册,因此RPC可以知道每个端口对应的NFS功能,然后RPC是固定使用port 111来监听客户端的需求并回报客户端正确的端口。
NFS工作原理
1)首先服务器端启动RPC服务,并开启111端口
2)服务器端启动NFS服务,并向RPC注册端口信息
3)客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
4)服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
启动各服务的作用
rpc:远程过程调用协议,是实现本地调用远程主机实现系统调用的协议。
portmapper:负责分配rpc server的端口,并在client端请求时,负责响应目的rpc server端口返回给client端,工作在tcp与udp的111端口上。
mountd:是nfs服务的认证服务的守护进程,client在收到返回的真正端口时,就会去连接mountd,认证取得令牌。
nfsd:nfs的守护进程,负责接收到用户的调用请求后与内核发出请求并得到调用结果响应给用户,工作在tcp和udp的2049端口。
idmapd:是NFS的一个程序,用来负责远程client端创建文件后的权限问题。
quotad:用用于实现磁盘配额,当client端挂载nfs后可以限制磁盘空间的大小。
部署NFS存储服务
服务端部署:
第一个历程:下载安装NFS
[root@nfs01 ~]# rpm -qa | grep -E "nfs|rpc"
[root@nfs01 ~]# yum -y install nfs-utils rpcbind
第二个历程:编辑/etc/exports配置文件(nfs配置文件)
[root@nfs01 ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync)
第三个历程:创建NFS存储目录(/data),并将属主、属组修改为nfsnobody
[root@nfs01 ~]# mkdir /data
[root@nfs01 ~]# chown nfsnobody.nfsnobody /data
[root@nfs01 ~]# ll -d /data
drwxr-xr-x 2 nfsnobody nfsnobody 6 Mar 26 17:35 /data
注:nfsnobody用户是安装NFS自动创建的,是一个虚拟用户,不能用来登录
第四个历程:启动服务程序
先启动RPC服务
[root@nfs01 ~]# systemctl start rpcbind
[root@nfs01 ~]# systemctl enable rpcbind
[root@nfs01 ~]# netstat -lntup | grep 111
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp6 0 0 :::111 :::* LISTEN 1/systemd
udp 0 0 0.0.0.0:111 0.0.0.0:* 1/systemd
udp6 0 0 :::111 :::* 1/systemd
[root@nfs01 ~]# systemctl list-unit-files | grep rpc
var-lib-nfs-rpc_pipefs.mount static
auth-rpcgss-module.service static
rpc-gssd.service static
rpc-rquotad.service disabled
rpc-statd-notify.service static
rpc-statd.service static
rpcbind.service enabled
rpcgssd.service static
rpcidmapd.service static
rpcbind.socket enabled
rpc_pipefs.target static
rpcbind.target static
启动NFS服务
[root@nfs01 ~]# systemctl start nfs
[root@nfs01 ~]# systemctl enable nfs
[root@nfs01 ~]# ps -ef | grep nfs
root 4243 2 0 17:48 ? 00:00:00 [nfsd4_callbacks]
root 4249 2 0 17:48 ? 00:00:00 [nfsd]
root 4250 2 0 17:48 ? 00:00:00 [nfsd]
root 4251 2 0 17:48 ? 00:00:00 [nfsd]
root 4252 2 0 17:48 ? 00:00:00 [nfsd]
root 4253 2 0 17:48 ? 00:00:00 [nfsd]
root 4254 2 0 17:48 ? 00:00:00 [nfsd]
root 4255 2 0 17:48 ? 00:00:00 [nfsd]
root 4256 2 0 17:48 ? 00:00:00 [nfsd]
[root@nfs01 ~]# systemctl list-unit-files | grep nfs
proc-fs-nfsd.mount static
var-lib-nfs-rpc_pipefs.mount static
nfs-blkmap.service disabled
nfs-config.service static
nfs-idmap.service static
nfs-idmapd.service static
nfs-lock.service static
nfs-mountd.service static
nfs-rquotad.service disabled
nfs-secure.service static
nfs-server.service enabled
nfs-utils.service static
nfs.service enabled
nfslock.service static
nfs-client.target enabled
注:用netstat -lntup | grep nfs查看服务端口号,但是并查不到,因为NFS不会告知给系统,而是告知RPC
客户端部署:
第一个历程:下载安装nfs软件
[root@web01 ~]# yum -y install nfs-utils
第二个历程:实现远程挂载共享目录
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@web01 ~]# df -h
/dev/sda3 18G 1.9G 16G 11% /
/dev/sda1 297M 125M 173M 42% /boot
tmpfs 98M 0 98M 0% /run/user/0
172.16.1.31:/data 18G 1.9G 16G 11% /mnt
第三个历程:实现永久挂载共享目录(开机自动挂载)
[root@web01 ~]# echo "172.16.1.31:/data /mnt nfs defaults 0 0" >>/etc/fstab
[root@web01 ~]# cat /etc/fstab
UUID=38e0a87b-12f4-4d66-becc-c1c0e9aa8883 / xfs defaults 0 0
UUID=249a696a-e2f1-48b6-984a-fe2166796d61 /boot xfs defaults 0 0
UUID=def82324-ae92-4af6-9b5d-89d4f5c89f8d swap swap defaults 0 0
172.16.1.31:/data /mnt nfs defaults 0 0
第四个历程:测试数据是否共享
[root@nfs01 ~]# cd /data
[root@nfs01 data]# echo "123456" >/data/chenyun.txt
[root@web01 ~]# cat /mnt/nfs/chenyun.txt
123456
NFS本地挂载、远程挂载原理
NFS服务器共享与客户端挂载结构图
补充:检查NFS 服务进程与端口注册信息
没有启动nfs服务前(如果rpc服务没有启动,rpcinfo命令是不可以使用的)
[root@nfs01 ~]# systemctl status rpcbind
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
Active: inactive (dead) since Thu 2020-03-26 19:23:03 CST; 17s ago
[root@nfs01 ~]# rpcinfo -p localhost
rpcinfo: can't contact portmapper: RPC: Remote system error - Connection refused
启动rpcbind 但没启动nfs时状态 只有RPC自己的信息
[root@nfs01 ~]# systemctl start rpcbind
[root@nfs01 ~]# systemctl status nfs
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
Drop-In: /run/systemd/generator/nfs-server.service.d
└─order-with-mounts.conf
Active: inactive (dead) since Thu 2020-03-26 18:57:26 CST; 18s ago
[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
rpcbind和nfs同时启动时状态(即有RPC端口信息,也有NFS端口信息 )
[root@nfs01 ~]# systemctl start nfs
[root@nfs01 ~]# systemctl status nfs
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
Drop-In: /run/systemd/generator/nfs-server.service.d
└─order-with-mounts.conf
Active: active (exited) since Thu 2020-03-26 19:29:52 CST; 16s ago
[root@web01 ~]# rpcinfo -p 172.16.1.31
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
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100024 1 udp 53047 status
100024 1 tcp 45600 status
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 48200 nlockmgr
100021 3 udp 48200 nlockmgr
100021 4 udp 48200 nlockmgr
100021 1 tcp 39933 nlockmgr
100021 3 tcp 39933 nlockmgr
100021 4 tcp 39933 nlockmgr
nfs服务端详细配置说明
实现多网段主机进行挂载
第一种方法:
[root@nfs01 ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync) 10.0.0.0/24(rw,sync)
第二种方法:
[root@nfs01 ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync)
/data 10.0.0.0/24(rw,sync)
总结:共享目录的权限和哪些因素有关
1)和存储目录的本身权限有关 (755 nfsnobody)
2)和配置文件中的权限配置有关 rw/ro **_squash anonuid/anongid
3)和客户端挂载命令的参数有关 如果挂载时指定为ro,即使服务端全正确,也不能写入
NFS配置参数权限
rw -- 存储目录是否有读写权限
ro -- 存储目录是否是只读权限
sync -- 同步方式存储数据(直接将数据存储到磁盘)
async -- 异步方式存储数据(先把数据缓存到内存,后续再将数据存储到磁盘)
no_root_squash -- 不要将root用户身份进行转换
root_squash -- 将root用户身份进行转换
all_squash -- 将所有用户身份都进行转换
no_all_squash -- 不要将普通用户身份进行转换
anonuid -- 指定匿名用户的uid(数字)
anongid -- 指定匿名用户的gid(数字)
NFS存储服务器-sync和async对比图
第一种情况:当配置参数改为(ro,sync)时,客户端只能读取文件,无法创建
[root@nfs01 ~]# vim /etc/exports
/data 172.16.1.0/24(ro,sync)
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt/nfs
[root@web01 ~]# cd /mnt/nfs/
[root@web01 nfs]# cat chenyun.txt
123456
[root@web01 nfs]# touch chenyun1.txt
touch: cannot touch ‘chenyun1.txt’: Read-only file system
第二种情况:当配置参数改为 (rw,sync,all_squash) ,客户端所有用户创建文件的属主、属组信息都会变为nfsnobody
[root@nfs01 data]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)
[root@nfs01 data]# systemctl restart nfs
[root@web01 nfs]# mount -t nfs 172.16.1.31:/data
[root@web01 mnt]# touch /root_data.txt
[root@web01 nfs]# su - oldboy
[oldboy@web01 mnt]$ touch oldboy_data.txt
[oldboy@web01 mnt]$ ll
total 0
-rw-rw-r-- 1 nfsnobody nfsnobody 0 Mar 26 22:58 oldboy_data.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 26 23:02 root_data.txt
第三种情况:当配置参数改为 (rw,sync,no_all_squash),客户端普通用户创建文件时,不会改变属主、属组信息
[root@nfs01 data]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,no_all_squash)
[root@nfs01 data]# systemctl restart nfs
[root@web01 mnt]# touch root_data.txt
[root@web01 mnt]# ll
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 26 23:25 root_data.txt
[root@web01 mnt]# su - oldboy
[oldboy@web01 ~]$ cd /mnt/
[oldboy@web01 mnt]$ touch oldboy_data.txt
touch: cannot touch ‘oldboy_data.txt’: Permission denied 普通用户遇到权限阻止
解决方法:
1)修改nfs服务端存储目录(/data)属主信息
[root@nfs01 data]# chown oldboy.oldboy /data
2)赋予服务端存储目录(/data)o+w权限
[root@nfs01 data]# chmod o+w /data/
[oldboy@web01 mnt]$ touch oldboy_data.txt
[oldboy@web01 mnt]$ ll
total 0
-rw-rw-r-- 1 oldboy oldboy 0 Mar 26 23:39 oldboy_data.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 26 23:25 root_data.txt
第四种情况:当配置参数改为 (rw,sync,root_squash),客户端root用户创建的文件属主、属主信息会变为nfsnobody
[root@nfs01 data]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,root_squash)
[root@web01 mnt]# touch root_data.txt
[root@web01 mnt]# ll
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 26 23:54 root_data.txt
第五种情况:当配置参数改为 (rw,sync,no_root_squash),客户端root用户创建的文件属主、属主信息不会改变
[root@nfs01 data]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,no_root_squash)
[root@web01 mnt]# touch root_data.txt
[root@web01 mnt]# ll
total 0
-rw-r--r-- 1 root root 0 Mar 27 00:07 root_data.txt
数据上传时用户身份转换流程图,详见下图
企业互联网公司如何配置NFS,各种*_squash配置参数使用分析
当我们配置成no_all_squash时,普通用户会出现权限阻止,无法创建删除文件,但使用all_squash,所有用户都可以进行创建和删除数据,这样非常的不安全,所以出于安全考虑,要慎用all_squash配置参数或者不使用
[root@nfs01 ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,no_all_squash)
[root@nfs01 ~]# ll /data -d
drwxr-xr-x 2 nfsnobody nfsnobody 27 Mar 27 00:07 /data
[root@backup ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@backup mnt]# touch root.txt
[root@backup mnt]# ll
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 27 17:56 root.txt
[root@backup mnt]# su - oldboy
[oldboy@backup ~]$ cd /mnt
[oldboy@backup mnt]$ touch oldboy.txt
touch: cannot touch ‘oldboy.txt’: Permission denied
[root@nfs01 ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)
[root@nfs01 ~]# touch /data/nfs_root.txt
[root@nfs01 ~]# ll /data/
total 0
-rw-r--r-- 1 root root 0 Mar 27 18:07 nfs_root.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 27 17:56 root.txt
[root@backup mnt]# cd /mnt/
[root@backup mnt]# touch backup_root.txt
[root@backup mnt]# su - oldboy
[oldboy@backup ~]$ cd /mnt
[oldboy@backup mnt]$ touch backup_oldboy.txt
[oldboy@backup mnt]$ ll
total 0
-rw-rw-r-- 1 nfsnobody nfsnobody 0 Mar 27 18:09 backup_oldboy.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 27 18:08 backup_root.txt
-rw-r--r-- 1 root root 0 Mar 27 18:07 nfs_root.txt
[oldboy@backup mnt]$ rm -rf *
[oldboy@backup mnt]$ ll
total 0
但使用no_all_squash会出现这样一个问题,用户上传数据时,web服务器使用的是www用户,www也是普通用户,这样就无法写入数据,那么怎么解决www用户不能写入数据的问题呢???
这个时候,我们需要把NFS存储服务端创建一个和web服务器一样的www用户(两个www用户的gid,uid必须相同,否则也会被权限阻止),将NFS存储目录交由www管理(也就是将属主、属组修改为www)
[root@nfs01 data]# useradd www
[root@nfs01 data]# id www
uid=1001(www) gid=1001(www) groups=1001(www)
[root@web01 mnt]# id www
uid=1002(www) gid=1002(www) groups=1002(www)
两个用户的uid gid不相同,需要指定uid gid
[root@nfs01 data]# userdel www
[root@nfs01 data]# useradd www -u 1002
[root@nfs01 data]# id www
uid=1002(www) gid=1002(www) groups=1002(www)
[root@web01 mnt]# id www
uid=1002(www) gid=1002(www) groups=1002(www)
[root@nfs01 data]# chown -R www.www /data/
[root@nfs01 data]# ll
total 0
-rw-r--r-- 1 www www 0 Mar 27 19:52 user01.txt
-rw-r--r-- 1 www www 0 Mar 27 19:52 user02.txt
-rw-r--r-- 1 www www 0 Mar 27 19:52 user03.txt
-rw-r--r-- 1 www www 0 Mar 27 19:52 user04.txt
[root@nfs01 data]# su - www
[www@nfs01 data]$ touch www_data.txt
-rw-r--r-- 1 www www 0 Mar 27 19:52 user09.txt
-rw-r--r-- 1 www www 0 Mar 27 19:52 user10.txt
-rw-rw-r-- 1 www www 0 Mar 27 20:34 www_data.txt
这样www用户就可以写入数据了,但其它用户呢???
[root@nfs01 data]# su - oldboy
Last login: Wed Mar 11 03:44:56 CST 2020 on pts/0
[oldboy@nfs01 ~]$ cd /data/
[oldboy@nfs01 data]$ touch oldboy_data.txt
touch: cannot touch ‘oldboy_data.txt’: Permission denied
哈哈!权限不够,不能写入!!!
当我们配置成root_squash,no_all_squash时,普通用户不能创建删除文件,但root用户具备创建删除的权限
[root@nfs01 ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,root_squash,no_all_squash)
[root@web01 ~]# cd /mnt/
[root@web01 mnt]# touch web_root.txt
[root@web01 mnt]# su - oldboy
Last login: Thu Mar 26 23:26:12 CST 2020 on pts/0
[oldboy@web01 ~]$ touch /mnt/web_oldboy.txt
touch: cannot touch ‘/mnt/web_oldboy.txt’: Permission denied
当我们配置成no_root_squash,no_all_squash时,创建的文件属主、属组信息虽然还是root,但root用户仍然可以创建删除文件,使用no_root_squash,root_squash同一样不安全
[root@nfs01 ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,no_root_squash,no_all_squash)
[root@web01 mnt]# touch web_root_no_root.txt.
[root@web01 mnt]# ll
total 0
-rw-r--r-- 1 root root 0 Mar 27 19:35 web_root_no_root.txt.
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 27 18:34 web_root.txt
[root@web01 mnt]# rm -rf *
[root@web01 mnt]# ll
total 0
但这里又会出现一个新的问题,如果我们配置成no_root_squash,那么root创建删除文件时,用户身份不会改变,直接用root身份创建删除文件,root用户享有至高无上的权利,他仍然可以肆意在NFS存储目录下创建删除文件,这样也不安全,但如果配置成root_squash,那么root创建删除文件时身份就会改变nfsnobody,但此时/data目录是由www管理的,这样即使是root也无法删除
[root@nfs01 data]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,no_root_squash,no_all_squash)
[root@web01 mnt]# touch root_data.txt
[root@web01 mnt]# ll root_data.txt
-rw-r--r-- 1 root root 0 Mar 27 21:00 root_data.txt
[root@web01 mnt]# rm -rf ./*
[root@web01 mnt]# ll
total 0
这样设置root可以肆意的创建删除文件
[root@nfs01 data]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,root_squash,no_all_squash)
[root@web01 mnt]# touch web_root.txt
touch: cannot touch ‘web_root.txt’: Permission denied
如果配置成root_squash,这样root就无法创建删除文件了!!!
但是这里也有一个问题,只有www用户才能写入删除数据,但是www用户是虚拟用户,无法登录,那如果有数据需要删除怎么处理呢,当然,也可以直接登录到NFS存储服务器到/data目录下删除,但是存储服务是不能随意动的,那怎样才能在web服务器上也有这样的功能呢???
如何让root映射www
查看NFS存储的默认配置,以及nfsnobody家目录
[root@nfs01 data]# 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)
[root@nfs01 data]# grep 65534 /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@nfs01 data]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,anonuid=1002,anongid=1002)
[root@nfs01 data]# 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=1002,anongid=1002,sec=sys,rw,secure,root_squash,no_all_squash)
[root@web01 mnt]# touch root.txt
[root@web01 mnt]# ll
total 0
-rw-r--r-- 1 www www 0 Mar 27 22:41 root.txt
[root@web01 mnt]# rm -rf root.txt
[root@web01 mnt]# ll
total 0
之所以root用户不能创建删除文件是因为他映射成了nfsnobody,而/data目录已经交由www管理了,但匿名用户的uid,gid还是nfsnobody的,此时只要在配置文件里指定匿名用户uid和gid指向www (anonuid=1002,anongid=1002),即可将root映射到www用户
总结:为了保证网站存储服务器用户数据安全性:(同时这两项也是默认配置)
no_all_squash 需要进行配置 但共享目录的权限需要修改为www(但要确保客户端用户 服务端用户 uid数值一致)
root_squash 需要进行配置 因为这个选项需要将root转换为nfsnobody,而/data的权限是www,其它用户无法修改或删除数据
企业中,如何编辑nfs配置文件
-
通用方法
/data 172.16.1.0/24(rw,sync)
-
特殊情况(让部分人员不能操作存储目录,可以看目录中的数据)
/data 10.0.0.0/24(ro,sync)
-
修改默认的匿名用户
/data 172.16.1.0/24(rw,sync,anonuid=1002,anongid=1002)
NFS客户端详细配置说明
临时挂载
[root@web01 mnt]# mount -t nfs 172.16.1.31:/data /mnt
永久挂载
方法一:
[root@web01 mnt]# echo "mount -t nfs 172.16.1.31:/data /mnt" >>/etc/rc.local
方法二:
[root@web01 mnt]# vim /etc/fstab
UUID=38e0a87b-12f4-4d66-becc-c1c0e9aa8883 / xfs defaults 0 0
UUID=249a696a-e2f1-48b6-984a-fe2166796d61 /boot xfs defaults 0 0
UUID=def82324-ae92-4af6-9b5d-89d4f5c89f8d swap swap defaults 0 0
172.16.1.31:/data /mnt nfs defaults 0 0
centos 7无法实现网络存储服务自动挂载原因
主要是因为remote-fs.target没有设置成开机自启,remote-fs.target没有启动
如何查看系统里有多少个程序在开机自启
[root@nfs01 /]# ll /etc/systemd/system/multi-user.target.wants/
total 0
lrwxrwxrwx. 1 root root 37 Feb 21 15:38 crond.service -> /usr/lib/systemd/system/crond.service
lrwxrwxrwx. 1 root root 42 Feb 21 15:39 irqbalance.service -> /usr/lib/systemd/system/irqbalance.service
lrwxrwxrwx. 1 root root 37 Feb 21 15:38 kdump.service -> /usr/lib/systemd/system/kdump.service
lrwxrwxrwx 1 root root 41 Mar 26 17:24 nfs-client.target -> /usr/lib/systemd/system/nfs-client.target
lrwxrwxrwx 1 root root 42 Mar 26 17:48 nfs-server.service -> /usr/lib/systemd/system/nfs-server.service
lrwxrwxrwx. 1 root root 39 Feb 21 15:39 postfix.service -> /usr/lib/systemd/system/postfix.service
lrwxrwxrwx. 1 root root 40 Feb 21 15:38 remote-fs.target -> /usr/lib/systemd/system/remote-fs.target
lrwxrwxrwx. 1 root root 46 Feb 21 15:38 rhel-configure.service -> /usr/lib/systemd/system/rhel-configure.service
lrwxrwxrwx 1 root root 39 Feb 25 22:58 rpcbind.service -> /usr/lib/systemd/system/rpcbind.service
lrwxrwxrwx. 1 root root 39 Feb 21 15:38 sysstat.service -> /usr/lib/systemd/system/sysstat.service
lrwxrwxrwx. 1 root root 37 Feb 21 15:38 tuned.service -> /usr/lib/systemd/system/tuned.service
lrwxrwxrwx. 1 root root 40 Feb 21 15:38 vmtoolsd.service -> /usr/lib/systemd/system/vmtoolsd.service
要想实现NFS存储客户端实现开机挂载,必须remote-fs.target这个服务开机自启
总结:要想实现NFS存储客户端实现开机挂载
centos7 必须启动remote-fs.target
centos6 必须启动netfs
客户端mount命令参数
rw --- 实现挂载后挂载点目录可读可写(默认)
ro --- 实现挂载后挂载点目录只可读
suid --- 在共享目录中可以让setuid权限位生效(默认)
nosuid --- 在共享目录中可以让setuid权限位失效,提高共享目录中的安全性
exec --- 共享目录中的执行文件可以直接执行
noexec --- 共享目录中的执行文件无法直接执行 提高 共享目录安全性
auto --- 可以实现自动挂载(配合mount -a 实现加载fstab文件自动挂载)
noauto --- 不能实现自动挂载
nouser --- 禁止普通用户卸载挂载点
users --- 允许普通用户卸载挂载点
客户端umount命令
umount -lf /mnt 不退出强制卸载
-l 不退出目录进行卸载
-f 强制进行卸载操作