欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【11.4】NFS、exportfs

程序员文章站 2022-04-13 11:43:59
...

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 架构
    【11.4】NFS、exportfs
    A/B/C三台主机数据一致,仅仅将A上数据拷贝到B/C上的话,B/C上数据无法实现和A的实时同步

  • NFS 原理图
    【11.4】NFS、exportfs
    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