linux 学习笔记-054-NFS-介绍,服务端安装配置,配置选项详解

发布于 2018-03-26  382 次阅读


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 上的一致

简单来讲就是,A 的数据有更新,B 和 C 也能通过 NFS 技术同步更新

linux 学习笔记-054-NFS-介绍,服务端安装配置,配置选项详解

无论是客户端还是服务端都需要启动一个 RPC 服务才能实现 RPC 协议的通讯,在 CentOS 5 及之前的版本中,这个服务叫做 portmap,在 CentOS 6 及之后的版本中,这个服务叫做 rpcbind,监听的是 111 端口

总结一下:

NFS 服务基于 RPC 服务提供的 RPC 协议,而 RPC 协议是由 portmap 服务或者 rpcbind 提供

linux 学习笔记-054-NFS-介绍,服务端安装配置,配置选项详解

NFS 服务端安装配置

首先准备两台机器,IP 分别为 172.17.1.240(服务端),172.17.1.241(客户端)

linux 学习笔记-054-NFS-介绍,服务端安装配置,配置选项详解

linux 学习笔记-054-NFS-介绍,服务端安装配置,配置选项详解

[root@am-01:~#] yum -y install nfs-utils.x86_64 rpcbind.x86_64

已加载插件:fastestmirror

base                                                                                                         | 3.6 kB  00:00:00    

epel/x86_64/metalink                                                                                         | 7.9 kB  00:00:00    

epel                                                                                                         | 4.7 kB  00:00:00    

extras                                                                                                       | 3.4 kB  00:00:00    

updates                                                                                                      | 3.4 kB  00:00:00    

………………省略部分输出信息………………

已安装:

  nfs-utils.x86_64 1:1.3.0-0.48.el7_4.2                                rpcbind.x86_64 0:0.2.0-42.el7                              



作为依赖被安装:

  gssproxy.x86_64 0:0.7.0-4.el7             keyutils.x86_64 0:1.5.8-3.el7                libbasicobjects.x86_64 0:0.1.1-27.el7     

  libcollection.x86_64 0:0.6.2-27.el7       libevent.x86_64 0:2.0.21-4.el7               libini_config.x86_64 0:1.3.0-27.el7       

  libnfsidmap.x86_64 0:0.25-17.el7          libpath_utils.x86_64 0:0.2.1-27.el7          libref_array.x86_64 0:0.1.5-27.el7        

  libtirpc.x86_64 0:0.2.4-0.10.el7          libverto-libevent.x86_64 0:0.2.5-4.el7       quota.x86_64 1:4.01-14.el7                

  quota-nls.noarch 1:4.01-14.el7            tcp_wrappers.x86_64 0:7.6-77.el7           



完毕!

#服务端安装 nfs-utils 和 rpcbind,其实只需要安装 nfs-utils 即可,安装 nfs-utils 的时候会自动把 rpcbind 也安装上
[root@am-02:~#] yum -y install nfs-utils.x86_64

已加载插件:fastestmirror

Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast

base                                                                                                         | 3.6 kB  00:00:00    

epel/x86_64/metalink                                                                                         | 7.9 kB  00:00:00    

epel                                                                                                         | 4.7 kB  00:00:00    

extras                                                                                                       | 3.4 kB  00:00:00    

updates                                                                                                      | 3.4 kB  00:00:00    

………………省略部分输出信息………………

作为依赖被升级:

  dracut-config-rescue.x86_64 0:033-502.el7_4.1   dracut-network.x86_64 0:033-502.el7_4.1   glib2.x86_64 0:2.50.3-3.el7           

  kmod.x86_64 0:20-15.el7_4.7                     krb5-libs.x86_64 0:1.15.1-8.el7           libgudev1.x86_64 0:219-42.el7_4.10    

  systemd.x86_64 0:219-42.el7_4.10                systemd-libs.x86_64 0:219-42.el7_4.10     systemd-sysv.x86_64 0:219-42.el7_4.10 



完毕!

#客户端也要安装 nfs-utils
[root@am-01:~#] vim /etc/exports

  /home/nfsdir

  172.17.1.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)

#编辑服务端配置文件,写入以上内容,第一行表示 nfs 需要共享的目录(这个目录需要手动创建一下),第二行表示指定哪些机器可以访问这个目录(可以是 IP 或者 IP 段等)
[root@am-01:~#] mkdir /home/nfsdir

[root@am-01:~#] chmod 777 /home/nfsdir/

[root@am-01:~#] 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      1609/nginx: master 

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1150/sshd          

tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      2396/master        

tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      1609/nginx: master 

tcp6       0      0 :::3306                 :::*                    LISTEN      5314/mysqld        

tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd          

tcp6       0      0 :::22                   :::*                    LISTEN      1150/sshd          

tcp6       0      0 ::1:25                  :::*                    LISTEN      2396/master    

[root@am-01:~#] systemctl start nfs.service

[root@am-01:~#] ps -aux | grep nfs

root      11640  0.0  0.0      0     0 ?        S<   19:32   0:00 [nfsd4]

root      11641  0.0  0.0      0     0 ?        S<   19:32   0:00 [nfsd4_callbacks]

root      11645  0.0  0.0      0     0 ?        S    19:32   0:00 [nfsd]

root      11646  0.0  0.0      0     0 ?        S    19:32   0:00 [nfsd]

root      11647  0.0  0.0      0     0 ?        S    19:32   0:00 [nfsd]

root      11648  0.0  0.0      0     0 ?        S    19:32   0:00 [nfsd]

root      11649  0.0  0.0      0     0 ?        S    19:32   0:00 [nfsd]

root      11650  0.0  0.0      0     0 ?        S    19:32   0:00 [nfsd]

root      11651  0.0  0.0      0     0 ?        S    19:32   0:00 [nfsd]

root      11652  0.0  0.0      0     0 ?        S    19:32   0:00 [nfsd]

root      11657  0.0  0.0 112676   976 pts/1    S+   19:32   0:00 grep --color=auto nfs   

[root@am-01:~#] systemctl enable rpcbind

[root@am-01:~#] systemctl enable nfs

Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

#创建需要共享的目录并赋予 777 权限(赋予 777 权限是为了方便后面的实验),使用 netstat 可以见到已经在监听 111 端口了,正如刚所说的,rpcbind 监听的是 111 端口,把 nfs 服务启动一下,最后把 rpcbind 和 nfs 设置为开机自启动

#其实在你启动 nfs 服务的时候,也会自动把支持 nfs 服务运作的 rpc 相关服务启动

NFS 配置选项

rw:读写

ro:只读

sync:同步模式,内存数据实时写入磁盘,但会降低磁盘效率

async:非同步模式,每隔一段时间同步一次

no_root_squash:客户端挂载 NFS 共享目录后,root 用户不受约束,权限很大

root_squash:与上面选项相对,客户端上的 root 用户收到约束,被限定成某个普通用户

all_squash:客户端上所有用户在使用 NFS 共享目录时都被限定为一个普通用户

anonuid/anongid:和上面几个选项搭配使用,定义被限定用户的 uid 和 gid

[root@am-02:~#] showmount -e 172.17.1.240

clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)

#客户端无法跟服务端 111 端口通讯,这有可能是网络不通或者服务端防火墙问题

关闭服务端和客户端防火墙和 SELinux

linux 学习笔记-054-NFS-介绍,服务端安装配置,配置选项详解

linux 学习笔记-054-NFS-介绍,服务端安装配置,配置选项详解

[root@am-02:/mnt#] showmount -e 172.17.1.240

Export list for 172.17.1.240:

/home/nfsdir 172.17.1.0/24

#可以见到,客户端 showmount 能看到服务端共享的目录
[root@am-02:~#] mount -t nfs 172.17.1.240:/home/nfsdir /mnt/

[root@am-02:~#] df -h

文件系统                   容量  已用  可用 已用% 挂载点

/dev/sda3                   28G  1.4G   27G    5% /

devtmpfs                   481M     0  481M    0% /dev

tmpfs                      490M     0  490M    0% /dev/shm

tmpfs                      490M  6.7M  484M    2% /run

tmpfs                      490M     0  490M    0% /sys/fs/cgroup

/dev/sda1                  197M  100M   98M   51% /boot

tmpfs                       98M     0   98M    0% /run/user/0

172.17.1.240:/home/nfsdir   28G  6.7G   22G   24% /mnt

#使用 mount 挂载服务端共享的目录,注意需要使用-t 指定文件系统类型为 nfs
[root@am-02:~#] cd /mnt/

[root@am-02:/mnt#] touch 1.txt

[root@am-02:/mnt#] ls -l

总用量 0

-rw-r--r-- 1 am am 0 3 月  26 23:34 1.txt

[root@am-02:/mnt#] id am

uid=1008(am) gid=1008(am) 组=1008(am)

[root@am-01:~#] ls -l /home/nfsdir/

总用量 0

-rw-r--r-- 1 mysql mysql 0 3 月  26 23:34 1.txt



[root@am-01:~#] id mysql

uid=1008(mysql) gid=1008(mysql) 组=1008(mysql)

#在客户端上的/mnt/目录新建一个 1.txt 文件,同时也能在服务端上的/home/nfsdir/目录下看到在客户端新建的文件

#同时可见,在客户端和服务端,相同的 1.txt 文件显示的所属者和所属组是不一样的,这是因为在服务端配置文件上定义了 anonuid 和 anongid 为本地机器的 1008,即在服务端上,id 为 1008 的是 mysql,在客户端上,id 为 1008 的是 am