NFS存储服务介绍
NFS是Network File System的缩写,表示网络文件系统,它的主要功能是通过网络(一般是局域网)让不同主机系统之间可以共享文件或目录
NFS服务器的应用
1.将数据存储到另一台机器上,实现数据统一,共享访问
2.NFS服务器上主要存储:用户上传图片,音频,视频,附件等信息
3.NFS服务器分为服务端与客户端,服务端为NFS存储服务器,客户端一般为web服务器
NFS实现共享存储的好处
1.实现数据统一一致
2.节省网站磁盘资源
3.节省网站带宽
NFS共享存储服务原理
1.nfs服务端创建共享存储目录
2.nfs服务端创建远程挂载点目录
3.nfs客户端进行远程挂载
4.实现数据统一一致
共享文件系统的工作原理
服务端:
1.启动rpcbind服务
2.启动nfs服务
3.将创建的共享存储目录信息注册到rpc服务中
客户端:
1.启动rpcbind服务(可选)
2.确保客户端与服务端的网络是通的
2.使用mount进行网络存储挂载
NFS服务的重要概念之RPC服务
RPC服务主要用来统一管理NFS服务启动的服务与进程
NFS服务参数说明
NFS服务部署进程说明
[root@oldboy ~]# ps -ef|egrep "rpc|nfs"
rpc 1564 1 0 09:32 ? 00:00:00 rpcbind
rpc 1065 1 0 09:32 ? 00:00:00 rpc statd <- 检查数据存储一致性
root 4736 2 0 21:31 ? 00:00:00 [rpciod/0]
root 5363 1 0 21:47 ? 00:00:00 rpc.rquotad <- 磁盘配额进程(remote quote server)
root 5368 1 0 21:47 ? 00:00:00 rpc.mountd <- 权限管理验证等(NFS mount daemon)
root 5375 2 0 21:47 ? 00:00:00 [nfsd4]
root 5376 2 0 21:47 ? 00:00:00 [nfsd4_callbacks]
root 5377 2 0 21:47 ? 00:00:00 [nfsd] <- NFS主进程
root 5378 2 0 21:47 ? 00:00:00 [nfsd] <- NFS主进程
root 5379 2 0 21:47 ? 00:00:00 [nfsd] <- NFS主进程,管理登入,ID身份判别等。
root 5380 2 0 21:47 ? 00:00:00 [nfsd]
root 5381 2 0 21:47 ? 00:00:00 [nfsd]
root 5382 2 0 21:47 ? 00:00:00 [nfsd]
root 5383 2 0 21:47 ? 00:00:00 [nfsd]
root 5384 2 0 21:47 ? 00:00:00 [nfsd] <- NFS主进程
root 5415 1 0 21:47 ? 00:00:00 rpc.idmapd <- name mapping daemon 用户压缩/用户映射(记录)
root 5512 4670 0 22:02 pts/0 00:00:00 egrep rpc|nfs
NFS共享文件系统配置文件格式说明,使用man exports来查看
/data 172.16.1.0/24(rw,sync)
/data:表示本地NFS服务需要共享的目录
172.16.1.0/24:表示可以远程访问客户机IP地址或网段
rw:表示读写权限,ro:表示只读权限
sync:表示同步数据到磁盘中(async:表示写入缓存,属于异步方式)
括号中参数以逗号分隔
示例:
EXAMPLE
# sample /etc/exports file
/ *(rw,no_root_squash) <--表示所有主机都可以访问
/projects 172.16.1.0/24(rw,sync) <--表示某一个网段可以进行访问
/usr 172.16.1.8(rw,sync) <--表示某一台主机可以进行访问
/home/joe pc001(rw,all_squash,anonuid=500,anongid=500) <-- 表示客户端在写入文件时,会以anonuid与anonuid指定的用户写入到共享目录中
/foo 2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw) <--表示可以使用mac地址
共享目录注意事项
NFS共享目录:
为NFS服务器端要共享的实际目录,要用绝对路径,如(/data)。
注意共享目录的本地权限,如果需要读写共享,一定要让本地目录可以被NFS客户端的用户(nfsnobody)读写。
NFS客户端地址:
为NFS服务器端授权的可访问共享目录的NFS客户端地址,可以为单独的IP地址或主机名、域名等,也可以为整个网段地址。
还可以用“*”来匹配所有客户端服务器,这里所谓的客户端一般来说是前端的业务的业务服务器,例如:web服务。具体说明见表10-3
权限参数
1)NFS服务器/etc/exports设置需要开放可写入的权限,即服务器端的共享权限。
2)NFS服务器实际要共享的NFS目录权限具有可写入w的权限,即服务器端本地目录的安全权限。
3)每台机器对应存在和NFS默认配置UID的相同UID 65534的nfsnobody用户(确保所有客户端的访问权限统一,否则每个机器需要同时建立相同UID的用户,并覆盖NFS的默认用户配置)
同步与异步的区别
同步方式:存入硬盘中
优点:传输数据可靠,不易丢失数据
缺点:数据传输慢
异步方式:写入内存中
优点:数据传输快
缺点:传输数据不可靠,容易丢失数据
NFS共享文件系统配置文件案例说明
配置例一
/data 10.0.0.0/24(rw,sync)
说明:允许客户端读写,并且数据同步写入到服务器端的磁盘里
注意:24和“(”之间不能有空格
配置案例二
/data 10.0.0.0/24(rw,sync,all_squash,anonuid=2000,anongid=2000)
说明:允许客户端读写,并且数据同步写到服务器端的磁盘里,并且指定客户端的用户UID和GID。
早期生产环境的一种配置,适合多客户端共享一个NFS服务单目录,
如果所有服务器的nfsnobody账户UID都是65534,则本例没什么必要了。
早期centos5.5的系统默认情况下nfsnobody的UID不一定是65534,此时如果这些服务器共享一个NFS目录,就会出现访问权限问题。
配置案例三
/home/oldboy 10.0.0.0/24(ro) <-- 是为开发人员想查看线数据准备配置方式
说明:只读共享
用途:例如在生产环境中,开发人员有查看生产服务器日志的需求,但又不希望给开发生产服务器的权限,那么就可以给开发提供从某个测试服务器NFS客户端上查看某个生产服务器的日志目录(NFS共享)的权限,当然这不是唯一的方法,例如可以把程序记录的日志发送到测试服务器供开发查看或者通过收集日志等其它方式展现
NFS共享文件系统配置文件参数设置
参数 |
参数说明 |
ro |
read-only,表示只读权限 |
rw |
read-write,表示读写权限 |
async |
写入数据是会先写到内存中,等到磁盘有空档才会写入到硬盘中,这样可以提升效率!风险:若服务器宕机或不正常关机,会损失缓存区中未入写到硬盘中的数据(解决方法:服务器主板电池加ups,AB(双路电源)不间断电源!) |
sync |
写入数据时,同步写入到NFS server硬盘中才返回。优点:数据不易丢失;缺点:数据传输慢 |
no_root_squash |
保持root用户不进行压缩;访问NFS服务器的共享目录的用户如果是root用户,它对该共享目录具有root权限,这个配置原本是为无盘客户端准备的。用户应避免使用 |
root_squash |
如果访问NFS服务器是root用户,则它的权限会被压缩成匿名用户,同时,它的UID与GID通常会变成nfsnobody用户 |
all_squash |
不管访问的用户是谁,都会被压缩成匿名用户,同时,它的UID与GID都会变成nfsnobody账号身份;在生产环境中配置NFS的重要技巧:1.确保所有客户端服务器对NFS共享目录具备相同的访问权限(a.all_squash把所有的客户端都压缩成固定的匿名用户(UID相同)就是anonuid与anongid指定的UID与GID用户)2.所有的客户端与服务端都需要有一个相同的UID与GID用户,即nfsnobody(UID必须相同) |
anonuid |
指定的匿名用户的UID号,参数以anon*开头的即指定的anonymous匿名用户,当然也可以自行设置这UID值,但是UID必须存在于/etc/passwd文件中,在多NFS客户端时,如多台web server共享一个目录,通过这个参数可以使用不同的NFS客户端写入的数据对所有的NFS客户端保持同样的权限,即为配置的匿名UID对应的用户,一般默认即可 |
anongid |
指定的匿名用户的GIG号 |
案例1:no_root_squash
#NFS服务端
[root@nfs01 data]# cat /etc/exports
/data 172.16.1.7(rw,sync,no_root_squash)
[root@nfs01 data]# /etc/init.d/nfs reload
[root@nfs01 data]# ll
total 4
-rw-r--r-- 1 root root 0 Feb 14 16:51 123.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 14 14:00 aa.txt
#NFS客户端
[root@web01 mnt]# touch 123.txt
[root@web01 mnt]#
案例2:root_squash
#NFS服务端
[root@nfs01 data]# cat /etc/exports
/data 172.16.1.7(rw,sync,root_squash)
[root@nfs01 data]# /etc/init.d/nfs reload
[root@nfs01 data]# ll
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 14 16:56 a.txt
[root@nfs01 data]#
#NFS客户端
[root@web01 mnt]# touch a.txt
[root@web01 mnt]# ll
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 14 16:56 a.txt
案例3:all_squash
#NFS服务端
[root@nfs01 data]# vim /etc/exports
[root@nfs01 data]# /etc/init.d/nfs reload
[root@nfs01 data]# cat /etc/exports
/data 172.16.1.7(rw,sync,all_squash)
#NFS客户端
[oldboy@web01 mnt]$ touch aa.txt
[oldboy@web01 mnt]$ ll
total 0
-rw-rw-r-- 1 nfsnobody nfsnobody 0 Feb 14 17:01 aa.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 14 16:56 a.txt
[oldboy@web01 mnt]$
案例4:no_all_squash
#NFS远程服务器
[root@nfs01 data]# vim /etc/exports
[root@nfs01 data]# /etc/init.d/nfs reload
[root@nfs01 data]# cat /etc/exports
/data 172.16.1.7(rw,sync,no_all_squash,root_squash)
[root@nfs01 data]#
#NFS客户端,除了root用户,其它用户都不能往NFS服务器存储数据
[oldboy@web01 mnt]$ touch test.txt
touch: cannot touch `test.txt': Permission denied
[oldboy@web01 mnt]$ logout
[root@web01 ~]# touch test.txt
[root@web01 mnt]# ll
total 0
-rw-rw-r-- 1 nfsnobody nfsnobody 0 Feb 14 17:01 aa.txt
-rw-r--r-- 1 nfsnobody nfsnobody 0 Feb 14 16:56 a.txt
案例4:anonuid与anongid
#NFS服务端,如需指定UID用户,需要在服务器与客户端中都建立相同权限的用户,并在服务端的共享目录所属组与所属更改为指定用UID用户,否则NFS客户端会没有权限进行写入
[root@nfs01 data]# useradd oldboy -M -u 500 -s /sbin/nologin
[root@nfs01 data]# id oldboy
uid=500(oldboy) gid=500(oldboy) groups=500(oldboy)
[root@nfs01 data]# chown -R odlboy. /data
chown: invalid user: `odlboy.'
[root@nfs01 data]# chown -R odlboy. /data
chown
[root@nfs01 data]# chown -R oldboy. /data
[root@nfs01 data]# ll
total 0
-rw-rw-r-- 1 oldboy oldboy 0 Feb 14 17:01 aa.txt
-rw-r--r-- 1 oldboy oldboy 0 Feb 14 16:56 a.txt
[root@nfs01 data]#
# NFS客户端
[root@web01 mnt]# id oldboy
uid=500(oldboy) gid=500(oldboy) groups=500(oldboy)
[root@web01 mnt]# su - oldboy
[oldboy@web01 ~]$ cd /mnt
[oldboy@web01 mnt]$ touch 123
touch: cannot touch `123': Permission denied #此处报错就是因为在服务端没有将共享目录权限更改为oldboy用户
[oldboy@web01 mnt]$ touch 123
[oldboy@web01 mnt]$ ll
total 0
-rw-rw-r-- 1 oldboy oldboy 0 Feb 14 17:12 123
-rw-rw-r-- 1 oldboy oldboy 0 Feb 14 17:01 aa.txt
-rw-r--r-- 1 oldboy oldboy 0 Feb 14 16:56 a.txt
[oldboy@web01 mnt]$ logout
[root@web01 mnt]# touch 1234.txt
[root@web01 mnt]# ll
total 0
-rw-rw-r-- 1 oldboy oldboy 0 Feb 14 17:12 123
-rw-r--r-- 1 oldboy oldboy 0 Feb 14 17:13 1234.txt
-rw-rw-r-- 1 oldboy oldboy 0 Feb 14 17:01 aa.txt
-rw-r--r-- 1 oldboy oldboy 0 Feb 14 16:56 a.txt
[root@web01 mnt]#
NFS共享文件系统相关重要文件说明
/etc/exports nfs服务主配置文件
/usr/sbin/showmount 查看nfs服务共享目录信息
/usr/sbin/rpcinfo 查看rpc服务中是否有房源注册信息
/var/lib/nfs/etab 用于查看nfs服务默认配置信息
/proc/mounts nfs客户端mount挂载参数(可以查看默认挂载参数信息)