【11.4】NFS、exportfs
【11.4】NFS、exportfs
14.1 NFS 介绍
-
NFS 是 Network File System 的缩写
NFS 最早由 Sun 公司开发,分2,3,4三个版本,2和3由 Sun 起草开发,4.0开始 Netapp 公司参与并主导开发,最新为4.1版本
NFS 数据传输基于 RPC 协议,RPC 为 Remote Procedure Call 的简写。 -
NFS 应用场景是: A,B,C 三台机器上需要保证被访问到的文件是一样的,A 共享数据出来,B 和 C 分别去挂载 A 共享的数据目录,从而B和C访问到的数据和 A 上的一致
-
NFS 架构
A/B/C三台主机数据一致,仅仅将A上数据拷贝到B/C上的话,B/C上数据无法实现和A的实时同步 -
NFS 原理图
CentOS 5 及之前的版本为 portmap,6之后之后为 rpcbind,这是同一种,启动了这个服务,实现RPC 协议通信rpcbind 服务产生的 RPC 协议进行通信(rpcbind服务默认监听111端口),NFS服务会在RPC注册一个端口,并告知RPC,PRC通过和用户PRC数据传输,告诉用户主机端口号,用户主机通过端口号访问
NFS服务需要借助RPC协议实现通信。
14.2 NFS 服务端安装配置
1、准备两台机器,一台服务端,一台客户端
服务端 ip:192.168.194.130
客户端 ip:192.168.194.132
2、服务端上安装两个包 nfs-utils、rpcbind
[aaa@qq.com ~]# yum install -y nfs-utils rpcbind
3、客户端上安装包 nfs-utils
[aaa@qq.com ~]# yum install -y nfs-utils
其实写不写 rpcbind,安装 nfs-utils 时都会默认安装上 rpcbind
4、服务端编辑 /etc/exports 文件
[aaa@qq.com ~]# vim /etc/exports
/home/nfstestdir 192.168.194.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)
共享目录、要和那个机器共享目录(特殊选项)
5、服务端因为目录不存在,首先创建共享的目录,改 777 权限
[aaa@qq.com ~]# mkdir /home/nfstestdir/
[aaa@qq.com ~]# chmod 777 /home/nfstestdir/
6、此时 rpcbind 实际已经启动了,监听 111 端口
[aaa@qq.com ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 7485/nginx: master
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 7463/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 7794/master
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 7485/nginx: master
tcp6 0 0 :::3306 :::* LISTEN 7727/mysqld
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 :::22 :::* LISTEN 7463/sshd
tcp6 0 0 ::1:25 :::* LISTEN 7794/master
7、服务端启动 nfs 服务(启动 nfs 服务的同事,会自动启动 rpc 相关的服务)
[aaa@qq.com ~]# systemctl start nfs
[aaa@qq.com ~]# ps aux |grep nfs
root 8365 0.0 0.0 0 0 ? S< 10:23 0:00 [nfsd4_callbacks]
root 8371 0.0 0.0 0 0 ? S 10:23 0:00 [nfsd]
root 8372 0.0 0.0 0 0 ? S 10:23 0:00 [nfsd]
root 8373 0.0 0.0 0 0 ? S 10:23 0:00 [nfsd]
root 8374 0.0 0.0 0 0 ? S 10:23 0:00 [nfsd]
root 8375 0.0 0.0 0 0 ? S 10:23 0:00 [nfsd]
root 8376 0.0 0.0 0 0 ? S 10:23 0:00 [nfsd]
root 8377 0.0 0.0 0 0 ? S 10:23 0:00 [nfsd]
root 8378 0.0 0.0 0 0 ? S 10:23 0:00 [nfsd]
root 8396 0.0 0.0 112724 988 pts/0 R+ 10:24 0:00 grep --color=auto nfs
[aaa@qq.com ~]# ps aux |grep rpc
rpc 8315 0.1 0.1 69264 1540 ? Ss 10:23 0:00 /sbin/rpcbind -w
root 8316 0.0 0.0 0 0 ? S< 10:23 0:00 [rpciod]
rpcuser 8317 0.0 0.1 42432 1768 ? Ss 10:23 0:00 /usr/sbin/rpc.statd
root 8343 0.0 0.0 42624 948 ? Ss 10:23 0:00 /usr/sbin/rpc.mountd
root 8360 0.0 0.0 45956 544 ? Ss 10:23 0:00 /usr/sbin/rpc.idmapd
root 8398 0.0 0.0 112724 988 pts/0 R+ 10:24 0:00 grep --color=auto rpc
8、服务端设置开机启动
[aaa@qq.com ~]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service
14.3 NFS 配置选项
-
rw 读写
-
ro 只读
-
sync 同步模式,内存数据实时写入磁盘
-
async 非同步模式,无需实时写入,每隔一段时间,将内存数据刷入磁盘
-
no_root_squash 客户端挂载NFS共享目录后,root用户不受约束,权限很大
-
root_squash 与上面选项相对,客户端上的root用户收到约束,被限定成某个普通用户
-
all_squash 客户端上所有用户在使用NFS共享目录时都被限定为一个普通用户
-
anonuid/anongid 和上面几个选项搭配使用,定义被限定用户的uid和gid
-
关闭客户端和服务端的防火墙
systemctl stop firewalld
setenforce 0
不关闭防火墙,可能会出现错误
[aaa@qq.com ~]# showmount -e 192.168.194.130
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
– showmount -e 查看对某台做了nfs服务的机器,有没有权限
[aaa@qq.com ~]# showmount -e 192.168.194.130
Export list for 192.168.194.130:
/home/nfstestdir 192.168.133.0/24
- 客户端上挂载: 192.168.194.132
- mount -t 类型 远程ip:共享目录 挂载点
[aaa@qq.com ~]# mount -t nfs 192.168.194.130:/home/nfstestdir /mnt
- 客户端上 /mnt 目录下创建一个新文件 20191104.txt,到服务端共享目录查看
[aaa@qq.com ~]# touch /mnt/20191104.txt
[aaa@qq.com ~]# ll /home/nfstestdir/
总用量 0
-rw-r--r-- 1 arslinux arslinux 0 11月 04 11:29 20191104.txt
在NFS配置选项设置了anonuid和anongid为1000,所以一旦挂载了nfs共享目录,无论客户端上用什么用户去创建文件,在服务端上都显示为uid为1000,gid为1000
14.4 exportfs 命令
exportfs 这个命令是和 nfs-utils 这个包一起安装的
- 更改 nfs 配置文件后,重启 nfs 服务,那么此时如果有远程客户端正在挂载共享目录,那么先停止 nfs 服务,就会导致远程客户端挂起
- NFS 服务不能随便重启,如果想重启,先将挂载的客户端先 umount 掉再重启服务端
- 但是服务器过多,就太麻烦了,那么 exportfs 命令就很方便了。
exportfs:
-a 全部挂载或者全部卸载
-r 重新挂载
-u 卸载某一个目录
-v 显示共享目录
-arv 一般同时使用
- 在 /etc/exports 里增加一行
[aaa@qq.com ~]# vim /etc/exports
/tmp 192.168.194.132(rw,sync,no_root_squash)
- 执行 exportfs
[aaa@qq.com ~]# exportfs -arv
exporting 192.168.194.132:/tmp
exporting 192.168.194.0/24:/home/nfstestdir
- 挂载到客户端上
[aaa@qq.com ~]# showmount -e 192.168.194.130
Export list for 192.168.194.130:
/home/nfstestdir 192.168.194.0/24
/tmp 192.168.194.132
[aaa@qq.com ~]# mount -t nfs 192.168.194.130:/tmp/ /mnt
[aaa@qq.com ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda3 28G 1.2G 27G 5% /
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 197M 105M 93M 54% /boot
tmpfs 98M 0 98M 0% /run/user/0
192.168.194.130:/tmp/ 28G 4.2G 24G 15% /mnt
- 客户端 /mnt 中创建新文件,看服务端共享目录中是否有变化
[aaa@qq.com ~]# echo "asdfafdfa" > /mnt/20190526.log
[aaa@qq.com ~]# ll /mnt/20190526.log
-rw-r--r-- 1 root root 10 11月 04 11:51 /mnt/20190526.log
[aaa@qq.com ~]# cat /tmp/20191104.log
asdfafdfa
[aaa@qq.com ~]# ll /tmp/20191104.log
-rw-r--r-- 1 root root 10 11月 04 11:51 /tmp/20191104.log
客户端和服务端上的属主和属组都是 root,是因为在 nfs 配置文件中,定义了对 /tmp 共享目录下,no_root_squash 不限制 root
一般不限制root的情况比较多
14.5 NFS 客户端问题
- NFS 4 版本会有该问题
- 客户端挂载共享目录后,不管是 root 还是普通用户,创建新文件时属主、属组为 nobody
- 要解决问题有2种方法:
1、客户端挂载时加上 -o nfsvers=3 (指定 nfs 版本为3)
mount -t nfs -o nfsvers=3 192.168.65.128:/tmp/ /mnt
mount -t nfs -oremount,nfsvers=3 192.168.65.128:/tmp/ /mnt (须在挂载后才能remount)
2、客户端和服务端都需要
vim /etc/idmapd.conf //
把“#Domain = local.domain.edu” 改为 “Domain = xxx.com” (这里的xxx.com,随意定义吧),然后再重启 rpcidmapd 服务,CentOS 7 中没有 rpcidmapd 服务,需重启 rpcbind
上一篇: 用BIOS的13号功能,显示彩色字符
推荐阅读
-
PHP和Shell实现检查SAMBA与NFS Server是否存在,sambanfs_PHP教程
-
Access入门教程 11.4 调整标签的位置和大小
-
nginx负载功能+nfs服务器功能解析
-
nginx负载功能+nfs服务器功能解析
-
Linux NFS 共享
-
kubernetes(k8s) 学习 (十) k8s存储之 Volumes (简介+emptyDir卷+hostpath卷+nfs卷)
-
OpenCV3学习(11.4)斑点检测 SimpleBlobDetector
-
Windows 2019下安装PostgreSQL11.4
-
力扣-11.4-417
-
11.4 Selenium+Chromedriver获取动态数据--scrapy爬虫初学者学习过程