NFS网络文件系统实战
NFS网络文件系统实战
1.NFS基本概述
NFS
是Network File System
的缩写及网络文件格式,NFS
主要功能是通过局域网络让不同的主机之间可以共享文件或者目录
NFS
系统和Windows
网络共享、网络驱动器类似,只不过Windows
用于局域网,NFS
用于企业集群架构中,如果是大型网站,会用到更复杂的分布式系统FastDFS
、glusterfs
、HDFS
那为什么要是用数据存储共享服务?
1.实现多台服务器之间数据共享;
2.实现多台服务器之间数据一致;
2.NFS应用场景
下面通过图解展示集群需要共享存储服务的理由
1.A用户
上传图片经过负载均衡,负载均衡将上传请求调度至web1
服务器上
2.B用户
访问A用户
上传的图片,此时B用户
被负载均衡调度至web2
上,因为web2
上没有这张图片,所以B用户
无法看到A用户
上传的图片
如果有共享存储的情况
1.A用户
上传图片无论是被负载均衡调度至web1
还是web2
,最终数据都会被写入共享存储
2.B用户
访问A用户
上传的图片,无论调度至web1
还是web2
,最终都会被上共享存储访问的对应文件,这样就可以访问到资源了
3.NFS实现原理
本地文件操作方式
1.当用户执行mkdir
命令, 该命令会调用shell
解释器翻译给内核。
2.内核解析完成后会驱动对应的硬件设备,完成相应的操作。
NFS实现原理(需要先了解[程序|进程|线程])
1.用户进程访问NFS客户端,使用不同的函数对数据进行处理
2.NFS
客户端通过TCP/IP
的方式传递给NFS
服务端。
3.NFS
服务端接收到请求后,会先调用portmap
进程进行端口映射。
4.nfsd
进程用于判断NFS
客户端是否拥有权限连接NFS
服务端。
5.Rpc.mount
进程判断客户端是否有对应的权限进行验证。
6.idmap
进程实现用户映射和压缩
7.最后NFS
服务端会将对应请求的函数转换为本地能识别的命令,传递至内核,由内核驱动硬件。
注意:
rpc
是一个远程过程调用,那么使用nfs
必须有rpc
服务
4.NFS服务安装
服务端
安装
[root@nfs ~]# yum install nfs-utils -y
配置
配置nfs
服务,nfs
服务程序的配置文件在/etc/exports
,需要严格按照共享目录的路径
允许访问的NFS客户端(共享权限参数)
格式书写,定义要共享的目录与相应的权限,具体书写方式如下图所示。
模拟配置
配置场景,将nfs
服务端的/data
目录共享给172.16.1.0/24
网段内的所有主机
1)所有客户端主机都拥有读写权限;
2)在将数据写入到NFS
服务器的硬盘中后才会结束操作,最大限度保证数据不会丢失;
3)将所有用户映射为本地的匿名用户(nfsnobody)
#NFS客户端地址与权限之间没有空格
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)
#NFS服务器上建立用于NFS文件共享的目录,并设置对应权限
[root@nfs ~]# mkdir /data
[root@nfs ~]# chown -R nfsnobody.nfsnobody /data/
#NFS共享会记录在/var/lib/nfs/etab,如果该目录不存在共享信息,请检查/etc/exports是否错误
启动
在使用NFS服务进行文件共享之前,需要使用RPC(Remote Procedure Call)远程过程调用服务将NFS服务器的IP地址和端口号信息发送至客户端。因此,在启动NFS之前,需要先重启并启用rpcbind服务程序,同时都加入开机自启
[root@nfs ~]# systemctl status rpcbind.service
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2021-03-03 01:27:47 CST; 21min ago
Process: 688 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS)
Main PID: 698 (rpcbind)
CGroup: /system.slice/rpcbind.service
└─698 /sbin/rpcbind -w
Mar 03 01:27:47 nfs systemd[1]: Starting RPC bind service...
Mar 03 01:27:47 nfs systemd[1]: Started RPC bind service.
[root@nfs ~]# systemctl start rpcbind nfs-server
[root@nfs ~]# systemctl enable rpcbind nfs-server
检查
[root@nfs ~]# cat /var/lib/nfs/etab
/data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,all_squash)
查端口
[root@nfs ~]# netstat -lnutp | grep 2049
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp6 0 0 :::2049 :::* LISTEN -
udp 0 0 0.0.0.0:2049 0.0.0.0:* -
udp6 0 0 :::2049 :::* -
5.NFS挂载卸载
客户端
NFS
客户端的配置步骤也十分简单。先使用showmount
命令,查询NFS
服务器的远程共享信息,其输出格式为“共享的目录名称 允许使用客户端地址”
1.安装客户端工具,仅启动rpcbind
服务
[root@web01 ~]# yum install nfs-util rpcbind -y
[root@web01 ~]# systemctl start rpcbind
[root@web01 ~]# systemctl enable rpcbind
2.客户端使用showmount -e
查看远程服务器rpc
提供的可挂载nfs
信息
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
3.在NFS
客户端创建一个挂载目录,使用mount
命令并结合-t
参数,指定要挂载的文件系统的类型,并在命令后面写上服务器的IP
地址,以及服务器上的共享目录,最后需要写上挂载到本地系统(客户端)的目录。
[root@web01 ~]# mkdir /nfsdir
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /nfsdir/
#查看挂载信息(mount也可以查看)
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 20M 1.9G 2% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 47G 1.9G 46G 4% /
/dev/sda1 1014M 190M 825M 19% /boot
tmpfs 378M 0 378M 0% /run/user/0
172.16.1.31:/data 47G 2.0G 46G 5% /nfsdir
4.挂载成功后可以进行增删改操作
#使用客户端往nfs存储写入
[root@web01 ~]# echo "nfs-client" >> /nfsdir/test.txt
#服务端查看
[root@nfs ~]# cat /data/test.txt
nfs-client
5.如果希望NFS
文件共享服务一直有效,则需要将其写入到fstab
文件中
[root@web01 ~]# cat /etc/fstab
172.16.1.31:/data /nfsdir nfs default 0 0
#检查
[root@web01 ~]# mount -a
6.如果不希望使用NFS
共享,可进行卸载
[root@web01 ~]# umount /nfsdir
#注意:如果卸载的时候提示"umount.nfs /nfsdir: device is busy"
#1.切换至其他目录,然后进行卸载
#2.NFS Server宕机,强制卸载umount -lf /nfsdir
7.在企业工作场景,通常情况NFS
服务器共享的只是普通静态数据(图片、附件、视频),不需要执行suid
、exec
等权限,挂载的这个文件系统只能作为数据存取之用,无法执行程序,对于客户端来说增加了安全性。例如:很多木马篡改站点文件都是由上传入口上传的程序到存储目录,然后执行的。
#通过mount -o指定挂载参数,禁止使用suid,exec,增加安全性
[root@web01 ~]# mount -t nfs -o nosuid,noexec,nodev 172.16.1.31:/data /nfsdir
8.有时也需要考虑性能相关参数【可选】
#通过mount -o 指定挂载参数,禁止更新目录及文件时间戳挂载
[root@web01 ~]# mount -t nfs -o noatime,nodiratime 172.16.1.31:/data /nfsdir
6.NFS配置详解
执行man exports
命令,然后切换到文件结尾,可以快速查看如下样例格式:
nfs共享参数 | 参数作用 |
---|---|
ro | 只读权限 |
root_squash | 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户(不常用) |
no_root_squash | 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员(不常用) |
no_all_squash | 无论NFS客户端使用什么账户访问,都不进行压缩 |
async | 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据 |
rw* | 读写权限 |
sync* | 同时将数据写入到内存与硬盘中,保证不丢失数据 |
all_squash | 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户(常用) |
anonuid* | 配置all_squash使用,指定NFS的用户UID,必须存在系统 |
anongid* | 配置all_squash使用,指定NFS的用户UID,必须存在系统 |
1.验证ro
权限
1)服务端修改rw
为ro
参数
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(ro,sync,all_squash)
[root@nfs ~]# systemctl restart nfs-server
2)客户端验证
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /nfsdir/
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
172.16.1.31:/data 47G 2.0G 46G 5% /nfsdir
[root@web01 ~]# touch /nfsdir/test
touch: cannot touch ‘/nfsdir/test’: Read-only file system #通常这样的错误都是设定的ro权限导致
2.验证all_squash
、anonuid
、anongid
权限
1)服务端配置
[root@nfs ~]# vim /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
[root@nfs ~]# groupadd -g 666 www
[root@nfs ~]# useradd -u 666 -g666 www
[root@nfs ~]# id www
uid=666(www) gid=666(www) groups=666(www)
[root@nfs ~]# chown -R www:www /data/
[root@nfs ~]# systemctl restart nfs-server.service
2)客户端验证
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /nfsdir/
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
172.16.1.31:/data 47G 2.0G 46G 5% /nfsdir
[root@web01 ~]# touch /nfsdir/file1
[root@web01 ~]# ls /nfsdir/file1
/nfsdir/file1
[root@web01 ~]# ll /nfsdir/file1
-rw-r--r-- 1 666 666 0 Mar 3 2021 /nfsdir/file1
客户端如果觉得666不好看,建议在客户端上创建同名的用户以及uid
[root@web01 ~]# groupadd -g 666 zxm
[root@web01 ~]# useradd -u 666 -g 666 zxm
[root@web01 ~]# id zxm
uid=666(zxm) gid=666(zxm) groups=666(zxm)
[root@web01 ~]# touch /nfsdir/file2
[root@web01 ~]# ll /nfsdir/file2
-rw-r--r-- 1 zxm zxm 0 Mar 3 2021 /nfsdir/file2
[root@web01 ~]# ll /nfsdir
total 4
-rw-r--r-- 1 zxm zxm 0 Mar 3 2021 file1
-rw-r--r-- 1 zxm zxm 0 Mar 3 2021 file2
7.NFS存储小结
1.NFS
存储优点
1.NFS
文件系统简单易用、方便部署、数据可靠、服务稳定、满足中小企业需求。
2.NFS
文件系统内存放的数据都在文件系统之上,所有数据都是能看得见。
2.NFS
存储局限
1.存在单点故障, 如果构建高可用维护麻烦web->nfs(sersync)->backup
2.NFS
数据明文, 并不对数据做任何校验。
3.客户端挂载NFS
服务没有密码验证, 安全性一般(内网使用)
3.NFS
应用建议
1.生产场景应将静态数据尽可能往前端推, 减少后端存储压力
2.必须将存储里的静态资源通过CDN
缓存jpg\png\mp4\avi\css\js
3.如果没有缓存或架构本身历史遗留问题太大, 在多存储也无用
8.NFS案例实践
准备3
台虚拟机服务器,并且按照要求搭建配置NFS
服务。
NFS
服务端(A)
NFS
客户端(B)
NFS
客户端C)
1.在NFS
服务端(A)
上共享/data/w
(可写)及/data/r
(只读)
2.在NFS
客户端(B/C)
上进行挂载
服务器系统 | 角色 | IP |
---|---|---|
CentOS 7.5 | NfsServer(A) | 172.16.1.31 |
CentOS 7.5 | NfsServer(B) | 172.16.1.41 |
CentOS 7.5 | NfsServer(C) | 172.16.1.7 |