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上的一致
- 例如: 一个站点,上面传输了很多图片,用户访问一个图片时,需要从A机器调用,但A机器负载高,所以就弄多两台B机器C机器同时提供服务;正常的话,需要到A机器上才能拿到数据,但是B机器和C机器做了负载均衡,分担了相同的服务器,那么用户也有可能到B机器或者C机器上;那么用户请求到B机器上的时候,如何才能获取到A机器上的数据呢;要么把A机器的数据传输到B机器上,但是这个不能时时更新,(用户上传的数据是存放在A机器上,但用户请求的时候数据是请求到B机器上)这样就会导致用户请求获取的数据访问不到;那么NFS服务就可以解决这个问题,将A机器的数据共享到B机器、C机器。有NFS服务以后,上传到A机器上的数据,B机器或C机器上就能马上看到和调用
- NFS原理图: 服务端需要启动一个NFS服务,服务端要想给客户端提供服务,需要借助RPC协议,RPC协议是由rpcbind服务实现;在centos 5或者之前的版本叫portmap服务;之后的版本叫rpcbind服务;NFS服务默认不会监听任何端口;最终实现NFS服务,需要借助rpcbind服务产生的RPC协议,RPC协议默认监听的端口是111; 整个流程为:服务端的NFS服务监听一个端口通过RPC协议监听的端口,告诉客户端RPC协议,然后客户端通过本机的RPC端口回传数据信息到服务端NFS监听的端口,最终实现通信
14.2 NFS服务端安装配置
- 步骤如下
- yum install -y nfs-utils rpcbind
- vim /etc/exports //加入如下内容
- /home/nfstestdir 192.168.133.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)
- 保存配置文件后,执行如下准备操作
- mkdir /home/nfstestdir
- chmod 777 /home/nfstestdir
- systemctl start rpcbind
- systemctl start nfs
- systemctl enable rpcbind
- systemctl enable nfs
- 首先要准备俩台机器,一台服务端,一台客户端
- 在客户端 192.168.202.132 安装 nfs-utils yum install -y nfs-utils
- 在服务端 192.168.202.131 上安装 nfs-utils ,rpcbind yum install -y nfs-utils rpcbind
- 首先服务端上安装nfs-utils ,rpcbind,客户端安装 nfs-utils
``` [[email protected] ~]# yum install -y nfs-utils rpcbind 已加载插件:fastestmirror 已安装: nfs-utils.x86_64 1:1.3.0-0.48.el7_4 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 完毕! [[email protected] ~]# 刚刚改了下主机名 hostname [[email protected] ~]# yum install -y nfs-utils rpcbind 已加载插件:fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.btte.net * epel: ftp.riken.jp * extras: mirrors.163.com * updates: mirrors.163.com 软件包 1:nfs-utils-1.3.0-0.48.el7_4.x86_64 已安装并且是最新版本 软件包 rpcbind-0.2.0-42.el7.x86_64 已安装并且是最新版本 无须任何处理 [[email protected] ~]# ``` - 客户端安装 ``` [[email protected] ~]# yum install -y nfs-utils 已安装: nfs-utils.x86_64 1:1.3.0-0.48.el7_4 作为依赖被安装: 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 rpcbind.x86_64 0:0.2.0-42.el7 tcp_wrappers.x86_64 0:7.6-77.el7 完毕! [[email protected] ~]# ``` - 安装完了之后在服务端 编辑 vim /etc/exports - 创建一个/home/nfstestdir 目录 把它的权限改为777 ``` [[email protected] ~]# vim /etc/exports /home/nfstestdir 192.168.202.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000) ~ :wq [[email protected] ~]# vim /etc/exports [[email protected] ~]# mkdir /home/nfstestdir [[email protected] ~]# chmod 777 /home/nfstestdir [[email protected] ~]# ``` - 在启动rpcbind之前 来看下 现在启动的服务 - 发现rpnbind安装完之后就自动帮你起来 ``` [[email protected] ~]# 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 954/nginx: master p tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 953/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1774/master tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 954/nginx: master p tcp6 0 0 :::3306 :::* LISTEN 1480/mysqld tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::22 :::* LISTEN 953/sshd tcp6 0 0 ::1:25 :::* LISTEN 1774/master [[email protected] ~]# ``` - 看看客户端的开启的服务 ``` [[email protected] ~]# 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:22 0.0.0.0:* LISTEN 832/sshd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1385/master tcp6 0 0 :::3306 :::* LISTEN 1161/mysqld tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::22 :::* LISTEN 832/sshd tcp6 0 0 ::1:25 :::* LISTEN 1385/master [[email protected] ~]# [[email protected] ~]# ps aux |grep rpc rpc 2426 0.0 0.1 64964 1052 ? Ss 22:16 0:00 /sbin/rpcbind -w root 2547 0.0 0.0 112680 980 pts/0 S+ 22:29 0:00 grep --color=auto rpc [[email protected] ~]# ``` - 既然已经启动了rpcbind 就开始启动nfs - 实际上在启动nfs的时候 它会自动帮你启动rpc ``` [[email protected] ~]# systemctl start nfs [[email protected] ~]# ps aux | grep nfs root 2457 0.0 0.0 0 0 ? S< 22:31 0:00 [nfsd4_callbacks] root 2463 0.0 0.0 0 0 ? S 22:31 0:00 [nfsd] root 2464 0.0 0.0 0 0 ? S 22:31 0:00 [nfsd] root 2465 0.0 0.0 0 0 ? S 22:31 0:00 [nfsd] root 2466 0.0 0.0 0 0 ? S 22:31 0:00 [nfsd] root 2467 0.0 0.0 0 0 ? S 22:31 0:00 [nfsd] root 2468 0.0 0.0 0 0 ? S 22:31 0:00 [nfsd] root 2469 0.0 0.0 0 0 ? S 22:31 0:00 [nfsd] root 2470 0.0 0.0 0 0 ? S 22:31 0:00 [nfsd] root 2474 0.0 0.0 112680 980 pts/0 R+ 22:31 0:00 grep --color=auto nfs [[email protected] ~]# [[email protected] ~]# ps aux | grep rpc root 376 0.0 0.0 0 0 ? S< 22:02 0:00 [rpciod] rpc 2431 0.0 0.1 64964 1432 ? Ss 22:30 0:00 /sbin/rpcbind -w rpcuser 2445 0.0 0.1 42380 1752 ? Ss 22:31 0:00 /usr/sbin/rpc.statd root 2446 0.0 0.0 19324 652 ? Ss 22:31 0:00 /usr/sbin/rpc.idmapd root 2447 0.0 0.0 42564 948 ? Ss 22:31 0:00 /usr/sbin/rpc.mountd root 2476 0.0 0.0 112680 980 pts/0 R+ 22:31 0:00 grep --color=auto rpc [[email protected] ~]# ``` - 如果想要开机就启动,还需要执行这个命令systemctl enable nfs systemctl enable rpcbind ``` [[email protected] ~]# systemctl enable nfs Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service. [[email protected] ~]# [[email protected] ~]# cat /etc/exports /home/nfstestdir 192.168.202.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000) [[email protected] ~]# ```
14.3 NFS配置选项
- rw 读写
- ro 只读
- sync 同步模式,内存数据实时写入磁盘
- async 非同步模式
- no_root_squash 客户端挂载NFS共享目录后,root用户不受约束,权限很大
- root_squash 与上面选项相对,客户端上的root用户收到约束,被限定成某个普通用户
- all_squash 客户端上所有用户在使用NFS共享目录时都被限定为一个普通用户
- anonuid/anongid 和上面几个选项搭配使用,定义被限定用户的uid和gid
- 客户端挂载
- yum install -y nfs-utils
- showmount -e 192.168.133.130 //该ip为NFS服务端ip
- mount -t nfs 192.168.133.130:/home/nfstestdir /mnt
- df -h
- touch /mnt/aminglinux.txt
- ls -l /mnt/aminglinux.txt //可以看到文件的属主和属组都为1000
- 先去客户端,shwomount -e 192.168.202.131 该ip为NFS服务端ip
``` [[email protected] ~]# show showconsolefont showkey showmount [[email protected] ~]# showmount -e 192.168.202.131 clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host) [[email protected] ~]# ``` - 报错了,看下防火墙是否开启,报错找不到指定的主机 之前已经确认过了111端口已经被监听,但是还是访问不了;那就可能是防火墙导致 关闭防火墙, - 先去服务端把防火墙关掉,还有selinux ``` [[email protected] ~]# systemctl stop firewalld [[email protected] ~]# setenforce 0 [[email protected] ~]# getenforce Permissive [[email protected] ~]# ``` - 在把客户端防火墙,selinux 关掉 - 因为NFS服务比较特殊,虽然rpc可以通信,就算iptables把111端口放行但NFS也不一定能正常通信;因为他们用了一个不固定的端口 ``` [[email protected] ~]# systemctl stop firewalld [[email protected] ~]# getenforce Enforcing [[email protected] ~]# setenforce 0 [[email protected] ~]# getenforce Permissive [[email protected] ~]# showmount -e 192.168.202.131 Export list for 192.168.202.131: /home/nfstestdir 192.168.202.0/24 [[email protected] ~]# ``` - 现在就可以去挂载了 ``` [[email protected] ~]# mount -t nfs 192.168.202.131:/home/nfstestdir /mnt/ [[email protected] ~]# df -h 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda3 28G 4.2G 24G 15% / devtmpfs 479M 0 479M 0% /dev tmpfs 489M 0 489M 0% /dev/shm tmpfs 489M 6.7M 482M 2% /run tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/sda1 197M 109M 88M 56% /boot tmpfs 98M 0 98M 0% /run/user/0 192.168.202.131:/home/nfstestdir 28G 4.4G 24G 16% /mnt [[email protected] ~]# ``` - 这就是远程服务端nfs共享的目录 ``` [[email protected] ~]# cd /mnt/ [[email protected] mnt]# ls [[email protected] mnt]# touch aminglinux.111 [[email protected] mnt]# ls -l 总用量 0 -rw-r--r--. 1 mysql mysql 0 10月 31 23:16 aminglinux.111 [[email protected] mnt]# ```
- 先来看下服务端这边有没有更新
[[email protected] ~]# ls -l /home/nfstestdir/总用量 0 -rw-r--r--. 1 mysql mysql 0 10月 31 23:16 aminglinux.111 [[email protected] ~]#
- 原因是配置 /etc/export 文件时,配置了anonuid=1000,anongid=1000 客户端显示 1000 用户 是因为客户端机器上并没有1000权限的用户 同样,服务端显示mysql,是因为服务端上的机器mysql 就是1000权限的用户
时间: 2024-10-18 10:45:22