一、什么是nfs服务器?
NFS是network file sytem的缩写,他最大的特点就是可以通过网络,让不
同的机器,不同的系统实现文件共享。NFS客户端可以将NFS服务器共享的
目录挂载在本地的文件系统中,访问目录就如同访问自己本地目录一样。
二、原理解读
- 首先NFS服务器端开启rpcbind;
- 然后服务端开启NFS服务,这时NFS的各项功能都需要向RPC服务注
册,这时rpc会通知portmap模块将可用的端口分配给statd,rquotad
等; - 然后NFS客户端RPC服务就会通过网络向NFS服务端的RPC服务的111端
口发出NFS文件存取功能的询问请求。 - NFS服务端的RPC服务找到对应的已注册的NFSdaemon端口后,通知
NFS客户端的RPC服务。 - 此时NFS客户端就可获取到nfs服务端各个进程的正确端口,然后通过客
户端rpc就直接与NFS服务器的rpc进行存取数据了(rpc知道了nfs的具
体端口,就可以实现远程调用,即传输)。
三、搭建nfs服务器
- 环境说明
1、服务安装
服务器和客户端都关闭防火墙,装好nfs服务组件:
# 关闭防火墙:
systemctl stop firewalld && systemctl disable firewalld
# 临时关闭selinux:
setenforce 0
# 永久关闭selinux:
sed -i ‘s/=enforcring/=disabled/’ /etc/selinux/config
# 安装nfs服务组件:
yum intall nfs-utils -y
2、服务端配置
134 上编辑/etc/exports 文件,
[root@node1 nfs]# vi /etc/exports
/data/nfs 192.168.10.135(rw,sync)
# 格式:
# /data/jfedu 要共享的目录,需要存在
# 192.168.10.135 谁能挂载使用,可以是具体IP,也可以指定网段,192.168.75.0/24 24表示192.168.75.xx 网段
# (rw,sync) 挂载的一些参数,rw表示挂载为可读可写,sync表
示同步
启动rpcbind服务、nfs服务、广播export文件:
[root@node1 ~]# systemctl start rpcbind
[root@node1 ~]# systemctl start nfs
[root@node1 ~]# exportfs -r
[root@node1 ~]# netstat -ntlp
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:37607 0.0.0.0:* LISTEN 7462/rpc.statd
tcp 0 0 0.0.0.0:44815 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 7443/rpcbind
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 7515/rpc.mountd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 6652/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 6800/master
tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
tcp6 0 0 :::43148 :::* LISTEN -
tcp6 0 0 :::111 :::* LISTEN 7443/rpcbind
tcp6 0 0 :::20048 :::* LISTEN 7515/rpc.mountd
tcp6 0 0 :::22 :::* LISTEN 6652/sshd
tcp6 0 0 ::1:25 :::* LISTEN 6800/master
tcp6 0 0 :::34235 :::* LISTEN 7462/rpc.statd
tcp6 0 0 :::2049 :::* LISTEN -
3、客户端配置
- 用showmount搜索网络中可用的共享文件:
[root@node2 ~]# showmount -e 192.168.10.134
Export list for 192.168.10.134:
/data/nfs 192.168.10.135
说明134上的export生效了,接着创建135主机上与/data/nfs 挂载(映射)的目录,并挂载:
[root@node2 ~]# mkdir /mnt/nfs
[root@node2 ~]# mount -t nfs 192.168.10.134:/data/nfs /mnt/nfs
[root@node2 ~]# cd /mnt/nfs
[root@node2 nfs]# ll
总用量 0
当前的目录为空。
- 推荐使用:
mount -t nfs -o soft,timeo=1 192.168.75.130:/data/jfedu
/mnt/nfs
soft: 软挂载,遇到报错会终止挂载,并返回信息,默认是硬挂载,一直尝试
挂载。
timeo: 超时时间,如果不设置,一直链接,可以设置小点
4、测试
134 主机上/data/nfs 目录创建aa.txt 文件,看是否会同步到135主机的/mnt/nfs 目录:
[root@node1 ~]# cd /data/nfs
[root@node1 nfs]# ls -ltr
总用量 0
[root@node1 nfs]# touch aa.txt
135主机检查,有同步:
[root@node2 ~]# cd /mnt/nfs
[root@node2 nfs]# ll
总用量 0
[root@node2 nfs]# ll
总用量 0
-rw-r--r-- 1 root root 0 4月 25 01:07 aa.txt
那么在135主机上创建文件,是否会同步呢?
[root@node2 nfs]# touch bb.txt
touch: 无法创建"bb.txt": 权限不够
[root@node2 nfs]#
发现135客户端上没有权限创建文件,这主要是因为客户端访问服务器时,身份被压缩成nobody,相对服务器文件系统来说,就是其他用户。所以要想编辑,需要在服务端对文件授权或者更改exports文件,设置no_root_squash(不压缩客户端root身份):
134服务端修改export文件,增加权限控制:
[root@node1 nfs]# vi /etc/exports
/data/nfs 192.168.10.135(rw,sync,no_root_squash)
[root@node1 nfs]# exportfs -r
135 客户端再次测试,权限生效:
[root@node2 nfs]# touch bb.txt
[root@node2 nfs]# ll
总用量 0
-rw-r--r-- 1 root root 0 4月 25 01:07 aa.txt
-rw-r--r-- 1 root root 0 4月 25 01:26 bb.txt
[root@node2 nfs]#
5、export文件其他选项:
[root@localhost ~]# exportfs -v
/data/jfedu
192.168.75.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,
rw,secure,no_root_squash,no_all_squash)
其中:
rw:可读可写
ro:仅可读
sync:是指数据同步写入内存和磁盘
root_squash:如果客户端用root身份访问,则被压缩成nobody,权限也将受
到限制。
no_root_squash:也就是不压缩,客户端使用root身份登录,全有所有权限,
很危险。
all_squash:不管访问者是什么身份,包括root,全部压缩至匿名用户。
no_all_squash:保留访问用户的身份uid以及gid,一般只能查看,不能修
改,权限问题,但是可以强制保存。
6、其他报错处理
6.1 客户端挂载时报错bad superblock:
[root@node2 ~]# mount 192.168.75.121:/data/jfedu /mnt
mount: wrong fs type, bad option, bad superblock on
192.168.75.121:/data/jfedu,
missing codepage or helper program, or other error
(for several filesystems (e.g. nfs, cifs) you might
need a /sbin/mount. helper program)
# 解决办法:
yum install nfs-utils -y
6.2 客户端挂载时报错access denied:
[root@node2 ~]# mount 192.168.75.121:/data/jfedu /mnt
mount.nfs: access denied by server while mounting
192.168.75.121:/data/jfedu
ps: 客户端IP不在/etc/exports文件中,会报此错。
6.3 卸载时报错:
umount.nfs4: /data/jfedu: device is busy
# 解决办法:
umount -l /data/jfedu 强行解除挂载
或者使用
fuser -m /data/jfedu 将会显示使用这个模块的pid
fuser -mk /data/jfedu 将会直接kill那个pid