Linux基础27 NFS原理, 搭建, NFS挂载卸载, NFS参数

发布时间 2023-07-13 16:31:19作者: 战斗小人

一、什么是NFS

共享存储,文件服务器

1.NFS基本概述
NFS是Network File System的缩写及网络文件系统。NFS主要功能是通过局域网让不同的主机系统之间可以共享文件或目录
NFS系统和windows网络共享、网络驱动器类似,只不过windows用于局域网,NFS用于企业集群架构中 如果是大型网页,会用到更复杂的
分布式文件系统FastDFS(音频、小说、视频),glusterfs(iso镜像,因为文件比较大),HDFS(存数据,配合消息队列), NFS(图片、静态页)解决共享前端web共享

2.为什么使用NFS
1.为了实现多台服务器之间数据共享
2.实现多台服务器之间数据一致

 

二、NFS应用
1.没有NFS时
A用户上传图片经过负载均衡,上传请求调度至WEB01服务器
B用户访问A上传的图片时,被负载均衡调度到了WEB02上,犹豫WEB02没有A用户上传的图片,所以B用户无法看到。

2.有NFS共享存储的时候
1、A用户上传图片无论被负载均衡调度至WEB01还是WEB02,最终数据都被写入至共享存储;
2、B用户访问A用户上传的图片时,无论被调度至WEB01还是WEB02,最终都会上共享存储访问对应的文件,这样就可以访问到资源了。

 

三、NFS原理

1.用户进程访问NFS客户端,使用不同的函数对数据进行处理
2.NFS客户端通过TCP/IP连接服务端
3.NFS服务端接受请求后,会先调用portmap进程进行端口映射
4.Rpc.nfsd进程用于判断NFS客户端能否连接服务端
5.Rpc.mount进程用于判断客户端可以对服务端进行哪些操作
6.最后如果允许操作,客户端可以对服务端磁盘进行修改
注意:rpcbind是一个远程调用,使用NFS时必须有rpcbind

 

四、NFS实践

主机      外网IP          内网IP          角色
nfs      10.0.0.31       172.16.1.31    NFS服务端
web01    10.0.0.7        172.16.1.7     NFS客户端
1.服务端
1)关闭防火墙和selinux
# 关闭firewalld防火墙
[root@nfs ~]# systemctl stop firewalld
[root@nfs ~]# systemctl disable firewalld

# 关闭selinux
[root@nfs ~]# sed -i '/^SELINUX=/c SELINUX=disabled' /etc/seliunx/config
[root@nfs ~]# setenforce 0
setenforce: SELinux is disabled
2)安装NFS和rpcbind
yum install -y nfs-utils rpcbind    # centos7实际上只要装nfs-utils就行,rpcbind会一起安装
注意:
如果是Centos6系统,一定要手动下载rpcbind,启动时一定县启动rpcbind,再启动nfs
3)配置NFS
配置NFS服务,配置文件为 /etc/exports,书写格式为:
/data 172.16.1.0/24(rw,sync,all_squash)
语法    |    /data    |    172.16.1.0/24    |    (rw,sync,all_squash)
语法含义    |  NFS共享的目录    |   NFS允许连接的客户端    |    允许的操作(参数1,参数2)
# 服务端配置
vim /etc/exports
/data 172.16.1.0/24    (rw,sync,all_squash)    # 0/24表示172.16.1这个网段都允许
4)创建共享目录
[root@nfs ~]# mkdir /data
5)启动nfs
[root@nfs ~]# systemctl start rpcbind nfs-server
# 验证启动
[root@nfs ~]# ps -ef |grep nfs
root      83009      2  0 23:28 ?        00:00:00 [nfsd4_callbacks]
root      83015      2  0 23:28 ?        00:00:00 [nfsd]
root      83016      2  0 23:28 ?        00:00:00 [nfsd]
root      83017      2  0 23:28 ?        00:00:00 [nfsd]
root      83018      2  0 23:28 ?        00:00:00 [nfsd]
root      83019      2  0 23:28 ?        00:00:00 [nfsd]
root      83020      2  0 23:28 ?        00:00:00 [nfsd]
root      83021      2  0 23:28 ?        00:00:00 [nfsd]
root      83022      2  0 23:28 ?        00:00:00 [nfsd]
root      83329  94603  0 23:29 pts/0    00:00:00 grep --color=auto nfs
6)验证nfs配置
[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)

2.客户端操作
1)关闭防火墙和selinux
# 关闭firewalld防火墙
[root@nfs ~]# systemctl stop firewalld
[root@nfs ~]# systemctl disable firewalld

# 关闭selinux
[root@nfs ~]# sed -i '/^SELINUX=/c SELINUX=disabled' /etc/seliunx/config
[root@nfs ~]# setenforce 0
setenforce: SELinux is disabled

2)安装NFS和rpcbind(因需要showmount命令,该命令在nfs中)
yum install -y nfs-utils rpcbind
3)查看挂载点
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
4)挂载
[root@web01 ~]# systemctl start rpcbind    # centos7自动启动,6里才需要手动启动(客户端不需要启动nfs)
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /backup    # -t指定nfs文件类型
[root@web01 backup]# df -h        # 查询是否挂载成功
文件系统           容量  已用  可用 已用% 挂载点
/dev/sda3           18G  1.8G   17G   10% /
devtmpfs           476M     0  476M    0% /dev
tmpfs              487M     0  487M    0% /dev/shm
tmpfs              487M  7.7M  479M    2% /run
tmpfs              487M     0  487M    0% /sys/fs/cgroup
/dev/sda1         1014M  127M  888M   13% /boot
tmpfs               98M     0   98M    0% /run/user/0
172.16.1.31:/data   18G  1.8G   17G   10% /backup

5)写入数据到挂载目录测试
# 进入挂载目录,创建文件或目录
[root@web01 backup]# touch 1.txt
touch: 无法创建"1.txt": 权限不够

# 服务端需要操作
[root@nfs ~]# chown -R nfsnobody.nfsnobody /data/

# 客户端再测试
[root@web01 backup]# mkdir 123
[root@web01 backup]# touch 1.txt
[root@web01 backup]# ll
总用量 0
drwxr-xr-x 2 nfsnobody nfsnobody 6 7月  13 01:23 123
-rw-r--r-- 1 nfsnobody nfsnobody 0 7月  13 01:23 1.txt

#nfsnobody
该用户在安装nfs之后自动创建,是NFS使用的用户,该用户没有特殊权限,只能操作所有用户都可以读写的文件

3.NFS挂载卸载

挂载
NFS客户端的配置步骤也十分简单,先试用showmount -e命令,查询NFS服务器的远程共享信息,其输出格式为"共享的目录名称允许使用客户端地址"
NFS挂载:客户端当前的目录仅仅是NFS服务端共享目录的一个入口文件,客户端写入的任何东西还是传出在服务端的

注意:
1.挂载目录后,原来目录下的文件不会丢失,取消挂载后数据仍然存在
2.取消目录挂载的时候不要在该目录里面,退出该目录再取消挂载
3.挂载时如果在挂载的目录下,还是可以暂时看到原来目录下的文件,重新进入后才显示挂载点的文件

1)安装客户端工具
yum install -y nfs-utils rpcbind    # 客户端安装nfs-utils是为了使用showmount命令
systemctl start rpcbind

2)客户端查看挂载点
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24

3)挂载命令
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /backup    # -t指定nfs文件类型
mount    # 挂载命令
-t    # 指定挂载的文件类型
172.16.1.31    #  远端NFS服务器地址
:date    # NFS服务器可提供挂载的目录
/backup    # 本地要挂载的目录

# 使用df -h可以查看已挂载的目录
[root@web01 backup]# df -h        # 查询是否挂载成功
172.16.1.31:/data   18G  1.8G   17G   10% /backup

4)卸载
[root@web01 ~]# umount /backup
[root@web01 ~]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda3        18G  1.8G   17G   10% /
devtmpfs        476M     0  476M    0% /dev
tmpfs           487M     0  487M    0% /dev/shm
tmpfs           487M  7.7M  479M    2% /run
tmpfs           487M     0  487M    0% /sys/fs/cgroup
/dev/sda1      1014M  127M  888M   13% /boot
tmpfs            98M     0   98M    0% /run/user/0

# 取消目录挂载的时候不要在该目录里面,退出该目录再取消挂载
# 或者强制取消挂载
umount -Lf /backup

5.开机挂载
# 挂载,重新启动服务器会取消,想要一直挂载
# 编辑fstab文件
vim /etc/fstab
172.16.1.31:/data /backup nfs defaults 0 0

# 验证fstab是否写正确
mount -a

 

五、NFS配置详解

NFS共享参数      |    参数作用
rw            |    读写权限
ro            |    只读权限(无法创建文件,一般不用)
root_squash     |    当NFS客户端以root访问时,修改权限为NFS服务器的匿名用户(不常用)
no_root_squash   |    当NFS客户端以root访问时,修改权限为NFS服务器的root用户(几乎不用)
all_squash      |    当NFS客户端以任意用户访问时,修改权限为NFS服务器的匿名用户(常用)
no_all_squash    |    当NFS客户端以任意用户访问时,不修改权限(不常用)
sync           |    同时将数据写入内存和磁盘(保证数据不丢失)
async          |    优先将数据写入内存,再写入硬盘;效率高,但是会丢失数据
anonuid         |    配合all_squash,指定匿名用户的uid,用户为系统用户,必须存在
anongid         |    配合all_squash,指定匿名用户的gid

 

六、NFS案例

1.安装http和php服务
[root@web01 backup]# yum install -y httpd php

2.上传代码
rpm -ql httpd|grep html    # 查找站点目录
cd /var/www/html
rz kaoshi.zip    # 把网页文件压缩包放在站点目录下
unzip kaoshi.zip

3.修改上传作业代码
vim upload_file.php
$wen="/backup";

4.启动httpd
systemctl start httpd
netstat -lntp    # 检查端口是否启动

5.测试提交作业代码

1)访问10.0.0.7
2)测试上传文件
3)常见错误
1.文件名字有误
2.显示上传成功,服务器没有文件,一般为权限错误
chown -R apache.apache /backup/    # httpd启动权限为apache,/backup/目录无挂载,为root权限时无法修改,给文件夹赋权apache
6)测试(没有挂载时)
在10.0.0.7的服务器上传 1_nfs.gif
在10.0.0.8的服务器上传 2_nfs.jpg
访问测试
10.0.0.7/pic/1_nfs.gif    访问成功
10.0.0.7/pic/2_nfs.jpg    访问失败

7)挂载共享目录后访问测试
mount -t nfs 172.16.1.31:/data /var/www/html/pic

# 重新上传图片
在10.0.0.7的服务器上传 1_nfs.gif
在10.0.0.8的服务器上传 2_nfs.jpg

访问测试
10.0.0.7/pic/1_nfs.gif    访问成功
10.0.0.7/pic/2_nfs.jpg    访问成功