NFS文件共享服务
NFS是network file sytem的缩写,他最大的特点就是可以通过网络,让不同的机器,不同的系统实现文件共享。NFS客户端可以将NFS服务器共享的目录挂载在本地的文件系统中,访问目录就如同访问自己本地目录一样。
NFS工作原理
1. 首先NFS服务端开启rpcbind;
2. 然后服务端开启NFS服务,这时NFS的各项功能都需要向RPC服务注册,这时rpc会通知portmap模块将可用的端口分配给statd,rquotad等;
3. 然后NFS客户端RPC服务就会通过网络向NFS服务端的RPC服务的111端口发出NFS文件存取功能的询问请求。
4. NFS服务端的RPC服务找到对应的已注册的NFSdaemon端口后,通知NFS客户端的RPC服务。
5. 此时NFS客户端就可获取到nfs服务端各个进程的正确端口,然后通过客户端rpc就直接与NFS服务器的rpc进行存取数据了(rpc知道了nfs的具体端口,就可以实现远程调用,即传输)。
环境如下:
server1 | 192.168.179.99 | nfs客户端 |
Server2 | 192.168.179.100 | nfs服务端 |
环境部署
[root@localhost ~]# yum install nfs-utils -y --在192.168.179.99/100客户端服务端都安装上软件包
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld --在服务端客户端两边关闭禁用防火墙
[root@localhost ~]# cat /etc/selinux/config --服务端客户端两边关闭selinux
SELINUX=disabled
临时关闭selinux:
setenforce 0
永久关闭selinux:
sed -i 's/=enforcring/=disabled/' /etc/selinux/config
服务端的操作
[root@localhost ~]# mkdir -p /data/jfedu --创建共享出去的目录
[root@localhost ~]# vim /etc/exports --修改配置文件
/data/jfedu 192.168.179.0/24(ro,sync )
共享出去的目录 共享给哪台服务器,如果给192.168.179网段使用192.168.179.0/24
(里面是参数,ro只读,sync写入的内存数据直接同步到磁盘,这样速度慢一点,但是数据是安全的)
ro 只读权限
rw读写权限
sync数据同步写入内存硬盘
[root@localhost ~]# systemctl start rpcbind
[root@localhost ~]# systemctl enable rpcbind
[root@localhost ~]# systemctl start nfs
[root@localhost ~]# systemctl enable nfs
[root@localhost ~]# exportfs -r --导出(广播)编辑的文件,并重启rpc和nfs服务
[root@localhost ~]# rpcinfo -p
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
.............................................................................
[root@localhost ~]# exportfs -v
/data/jfedu 192.168.179.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
客户端的操作
[root@localhost ~]# showmount -e 192.168.179.100
Export list for 192.168.179.100: --这里可以有多个列表,服务端可以将多个目录共享给不同的机器
/data/jfedu 192.168.179.0/24
[root@localhost ~]# mkdir -p /mnt/nfs --创建挂载点
[root@localhost ~]# mount -t nfs 192.168.179.100:/data/jfedu /mnt/nfs --将服务端192.168.179.100:的共享目录/data/jfedu挂载到/mnt/nfs
推荐使用
mount -t nfs -o soft,timeo=1 192.168.179.100:/data/jfedu /mnt/nfs soft:
软挂载,遇到报错会终止挂载,并返回信息,默认是硬挂载,一直尝试挂载。
timeo: 超时时间,如果不设置,一直链接,可以设置小点
[root@localhost ~]# df --查看挂载是否成功
Filesystem 1K-blocks Used Available Use% Mounted on
192.168.179.100:/data/jfedu 25164800 1575808 23588992 7% /mnt/nfs
测试
[root@localhost ~]# cp /etc/fstab /data/jfedu/ --在服务端将fstab copy到共享目录
[root@localhost ~]# cd /mnt/nfs/ --客户端查看共享目录的fstab
[root@localhost nfs]# ls
fstab
[root@localhost nfs]# cat fstab
[root@localhost nfs]# touch a.txt --来自nfs提示,客户端不能创建文件,因为在nfs的exports文件里面只设置了读权限
touch: cannot touch ?..txt?. Read-only file system
[root@localhost ~]# vim /etc/exports --修改服务端配置文件
/data/jfedu 192.168.179.0/24(rw,sync)
[root@localhost ~]# exportfs -r --服务端重新加载配置文件
[root@localhost nfs]# touch a.txt --来自文件系统提示,客户端发现权限还是不够
touch: cannot touch ?..txt?. Permission denied
怎么解决?
(1)服务端单独创建一个目录,授予该目录rwx权限
[root@localhost nfs]# ls -ld /mnt/nfs/ --可以看到客户端的nfs目录只有r-w权限,但是客户端的身份相当于nfsnobody,被压缩了相当于others
drwxr-xr-x 3 root root 44 Apr 13 2020 /mnt/nfs/
[root@localhost nfs]# chmod o+w /mnt/nfs/ --客户端修改该目录的权限就可以在该目录下创建文件了
或者
[root@localhost jfedu]# mkdir test --在服务端共享目录里单独创建一个目录如test
[root@localhost jfedu]# chmod o+w test/ --修改权限,那么这个目录共享给服务端可以让服务端root用户在里面自由活动
[root@localhost nfs]# cd test/ --客户端进入服务端创建的test目录
[root@localhost test]# touch a.txt --看到可以正常创建文件
[root@localhost test]# echo a > a.txt --可以对文件进行修改
[root@localhost test]# ll --可以看到客户端的身份是nfsnobody的身份
total 4 -rw-r--r--. 1 nfsnobody nfsnobody
(2)找到根源,为什么客户端root用户不能对服务端提供的目录里面文件进行操作,因为是虽然使用root用户去挂载了,但是身份被压缩了,是others
[root@localhost jfedu]# exportfs -v --客户端执行,查看配置信息
/data/jfedu 192.168.179.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
root_squash:如果客户端用root身份访问,则被压缩成nobody,权限也将受到限制。
no_root_squash:也就是不压缩,客户端使用root身份登录,全有所有权限,很危险。
all_squash:不管访问者是什么身份,包括root,全部压缩至匿名用户。
no_all_squash:保留访问用户的身份uid以及gid,一般只能查看,不能修改,权限问题,但是可以强制保存。
可以看服务端root_squash参数使得客户端root用户身份被压缩了为nfsnobody,所以对目录没有权限Permission denied
[root@localhost jfedu]# vi /etc/exports --修改服务端配置解决问题
/data/jfedu 192.168.179.0/24(rw,sync,no_root_squash)
[root@localhost jfedu]# exportfs -r
[root@localhost nfs]# cd /mnt/nfs/ --客户端再去重新测试,可以看到正常了,最好不要使用这个参数,权限太大,可以删除共享出去所有的文件
[root@localhost nfs]# touch a.txt
[root@localhost nfs]# ll a.txt --可以看到是管理员身份创建的
-rw-r--r--. 1 root root 0 Mar 2 16:43 a.txt
最后说一下no_all_squash参数
[root@localhost jfedu]# cat /etc/exports --服务端配置
/data/jfedu 192.168.179.0/24(rw,sync,root_squash,no_all_squash)
[root@localhost jfedu]# exportfs -r
[root@localhost nfs]# su - jerry --客户端切换普通用户
[jerry@localhost ~]$ cd /mnt/nfs/test
[jerry@localhost test]$ touch b.txt
[jerry@localhost test]$ ll b.txt --可以看到保留了当前用户的身份
-rw-rw-r--. 1 jerry jerry0 Mar 2 17:07 b.txt
卸载
[root@localhost ~]# umount.nfs4 /mnt/nfs/
umount.nfs4: /mnt/nfs/: device is busy
umount -l /mnt/jfedu 强行解除挂载
或者使用(这个命令容易变为背锅侠,慎用!!!!!!!!!!!!!)
fuser -m /mnt/data 将会显示使用这个模块的pid
fuser -mk /mnt/data 将会直接kill那个pid
客户端希望NFS文件共享服务一直有效开机自动挂载,需要修改fstab
[root@localhost ~]# tail -1 /etc/fstab
192.168.179.100:/data/jfedu /mnt/nfs nfs defaults 0 0