NFS介绍
NFS(Network File System)网络文件系统,它的主要功能是通过网络(一般是局域
网)让不同的主机系统之间可以共享文件或目录,NFS客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务器端共享的数据目录挂载到NFS客户端本地系统中(就是某一个挂载点下)
应用场景
(1) 共享视频,图片,附件等静态资源文件
(2) 在虚拟机动态迁移过程中,数据盘共享存储减少迁移数据量,提高迁移效率
(3) 在负载均衡场景中,为负载服务器提供统一的大数据存储
NFS环境部署
主机规划
角色 | 主机名 | ip |
---|---|---|
NFS服务器端 | nfs01 | 192.168.213.129 |
http web服务器 | web01 | 192.168.213.125 |
修改主机名
NFS服务器端
hostnamectl set-hostname nfs01
su -l
http web服务器
hostnamectl set-hostname web01
su -l
处理防火墙
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i "/^SELINUX=/cSELINUX=disabled" /etc/selinux/config
NFS服务器端设置
nfs-utils:NFS服务的主程序,包括rpc.nfsd,rpc.mountd这两个daemons和相关文档说明,以及执行命令文件等
rpcbind:完成端口和功能的对应映射,在提供NFS服务之前必须先启动rpcbind服务
(1) 准备工作
rpm -qa nfs-utils rpcbind
yum install nfs-utils rpcbind -y
查看某个命令属于哪个软件包
[root@nfs01 ~]# rpm -qf /usr/sbin/rpcinfo
rpcbind-0.2.0-48.el7.x86_64
[root@nfs01 ~]# rpm -qf `which showmount`
nfs-utils-1.3.0-0.65.el7.x86_64
(2) 启动rpcbind
systemctl start rpcbind
查看NFS服务向rpc服务注册的端口信息
[root@nfs01 ~]# rpcinfo -p localhost ;111端口为rpcbind服务对外提供服务的主端口
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常见进程说明
(4) 启动NFS服务 systemctl start nfs
(5) 配置NFS服务端开机自启动
systemctl enable nfs
systemctl enable rpcbind
(6) 修改NFS服务的默认配置
NFS共享的目录 NFS客户端地址1(参1,参2...)客户端地址2(参1,参2...)
[root@nfs01 ~]# cat /etc/exports
/data 192.168.213.0/24(rw,sync)
命令说明:
/data :nfs的共享目录路径
192.168.213.0/24:允许挂载我的共享目录的IP地址段
(rw/ro):可读可写/只读
(sync/async):实时同步/异步
systemctl reload nfs ;修改配置文件后,必须重启nfs服务
(7) 创建共享目录并授权创建共享目录并授权
[root@nfs01 ~]# grep nfs /etc/passwd
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@nfs01 ~]# mkdir /data
[root@nfs01 ~]# chown -R nfsnobody:nfsnobody /data
如果不授权属主属组,那么共享目录挂载以后将不遵循配置文件exports的设定好的读写规则,虽然能正常挂载,但是会导致写入文件时提示没有权限
本地挂载测试
[root@web01 ~]# mount 192.168.213.129:/data /mnt
[root@web01 ~]# ls /mnt
[root@web01 ~]# echo "test" >/mnt/test
[root@web01 ~]# ls /mnt
test
[root@nfs01 ~]# cat /data/test
test
当配置文件exports里设定了(rw,rsync)后,表示目录可读写,并且是实时同步的,也就是说,在其中任意一个挂载目录里改变了里面的内容信息,那么所有挂载目录包含源共享目录的内容信息同步改变
配置NFS客户端实战
(1) 安装nfs-utils软件
yum install nfs-utils -y
(2) 检查远端showmount
[root@web01 ~]# showmount -e 192.168.213.129
Export list for 192.168.213.129:
/data 192.168.213.0/24
(3) 客户端挂载
[root@web01 ~]# mount 192.168.213.129:/data /mnt
(4) 进行文件读写及同步测试
[root@web01 ~]# ls /mnt
[root@web01 ~]# echo "test" >/mnt/test
[root@web01 ~]# ls /mnt
test
[root@web01 ~]# ssh [email protected] "ls /data"
[email protected]'s password:
test
(5) 配置开机自动挂载nfs共享目录(/etc/fstab)
方法一:将挂载命令放在/etc/rc.local里
echo "mount -t nfs 192.168.213.129:/data /mnt" >> /etc/rc.local
缺点:偶尔开机挂载不上,工作中除了开机自启动配置,还要对是否挂载做监控
方法二:将挂载命令放在/etc/fstab里
192.168.213.129:/data /mnt nfs defaults 0 0
缺点:在CentOS6及以前:fstab会优先于网络被Linux系统加载,网络没启动时执行fstab会导致连不上NFS服务器端,无法实现开机挂载,需要在开机自启动服务里设置并启动netfs服务
[root@web01 ~]# chkconfig --list netfs
netfs 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
[root@web01 ~]# chkconfig netfs on
[root@web01 ~]# chkconfig --list netfs
netfs 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
NFS配置权限设置常用参数说明
参数 | 说明 |
---|---|
rw | Read-write,表示可读写权限 |
ro | Read-only,表示只读权限 |
sync | 实时同步,请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回 |
async | 异步,写入时数据会先写到内存缓冲区,只到硬盘有空档才会写入磁盘,以提升写入速率 风险为若服务器挂掉或不正常关机,会损失缓冲区中未写入磁盘的数据 |
no_root_squash | 不降低root账户在共享目录的身份,身份还是root |
root_squash | 将root账户在共享目录里的身份降低为匿名者(默认nfsnobody)身份 |
all_squash | 将所有访问用户在共享目录里的身份都降低为匿名者(默认nfsnobody)身份 |
anonuid | 指定共享文件夹里文件所有者的uid号:例如:(rw,squash,anonuid=12306,anongid=12306) |
anongid | 指定共享文件夹里文件所有者的gid号:例如:(rw,squash,anonuid=12306,anongid=12306) |
详解
root_squash(NFS默认使用的参数)
(1) root用户在共享目录里创建的文件的属主属组为nobody,任何文件都不受保护,所有用户都可以读取,修改,删除
(2) root用户依然有管理者权限,能对所有共享目录里的所有文件进行查看,修改,删除操作
(3) 所有普通用户之间只能互相查看文件,但不知道是谁创建的,只能修改或删除自己创建的文件
no_root_squash
(1) root在共享目录里创建的文件的属主属组为root,不能被普通用户修改和删除
(2) 非root用户同root_squash一样,并不降低权限
all_squash
所有用户只要在共享目录里创建文件,那么文件的属主属组就是默认情况下的nfsnobody,任何访问用户都可以对共享目录里的任何文件进行查看,修改,删除操作
anonuid和anongid
这两个参数通过指定虚拟账户的uid和gid的方式修改NFS默认的虚拟账户nfsnobody
exports配置文件相关参数的说明
# 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)
上述各个列的参数含义如下:
(1)NFS共享的目录:为NFS服务端要共享的实际目录,要用绝对路径
(2)NFS客户端地址:为NFS服务端授权的可访问共享目录的NFS客户端地址
(3)权限参数集:对授权的NFS客户端的访问权限设置
nfs权限(共享权限):本地文件系统权限,挂载目录的权限
客户端地址 | 具体地址 | 说明 |
---|---|---|
授权单一客户端访问NFS | 10.0.0.30 | 一般情况,生产环境中此配置不多 |
授权整个网段可访问NFS | 10.0.0.0/24 | 配置简单,维护方便 |
授权整个网段可访问NFS | 10.0.0.* | 指定网段的另外写法(不推荐使用) |
授权某个域名客户端访问 | nfs.chensiqiedu.com | 此方法生产环境中一般不常用 |
授权整个域名客户端访问 | *.chensiqiedu.com | 此方法生产环境中一般不常用 |
练习
实例一:
共享/data目录给10.0.0.0/24整个网段可读可写
[root@nfs01 ~]# mkdir /data
[root@nfs01 ~]# chown -R nfsnobody:nfsnobody /data
[root@nfs01 ~]# cat /etc/exports
/data 10.0.0.0/24(rw,sync)
实例二:
nfs服务器:172.16.1.31
共享下面两个目录:
/app/w :要求可读可写,同步数据,所有用户压缩为匿名用户
/app/r:要求只读,同步数据,所有用户都压缩为匿名用户
客户端上面的要求:
backup服务器,把nfs服务器的/app/r挂载到/data/r
web01服务器,把nfs服务器的/app/w挂载到/data/w
NFS服务器配置:
[root@nfs01 ~]# mkdir -p /app/w
[root@nfs01 ~]# mkdir /app/r
[root@nfs01 ~]# chown -R nfsnobody:nfsnobody /app
[root@nfs01 ~]# ls -l /app
total 0
drwxr-xr-x 2 nfsnobody nfsnobody 6 Feb 18 20:32 r
drwxr-xr-x 2 nfsnobody nfsnobody 6 Feb 18 20:32 w
[root@nfs01 ~]# cat /etc/exports
/app/w 192.168.213.0/24(rw,sync,all_squash)
/app/r 192.168.213.0/24(ro,sync,all_squash)
[root@nfs01 ~]# systemctl reload nfs #重启nfs服务
NFS客户端配置:
[root@web01 ~]# mkdir -p /app/r
[root@web01 ~]# mkdir /app/w
[root@web01 ~]# mount -t nfs 192.168.213.123:/app/w /app/w
[root@web01 ~]# mount -t nfs 192.168.213.123:/app/r /app/r
```![在这里插入图片描述](https://img-blog.csdnimg.cn/20200218211247715.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDQ5NDk2,size_16,color_FFFFFF,t_70)