一、概述
工作中经常会出现不同服务器、不同操作系统之间文件夹互相挂载的情形,例如文件服务器或数据备份服务器。
挂载一般来说就是以下四种类型:
同类型操作系统
a. linux挂载linux文件夹
b. windows挂载windows文件夹
不同类型操作系统
c. linux挂载windows文件夹
d. windows挂载linux文件夹
linux挂载linux文件夹采用nfs(Network File System),本文将介绍此种类型。
二、搭建
实验的环境 两台Linux:CentOS7.3
Server端:192.168.56.77 文件实际存放的服务器
Client端:192.168.56.88 挂载的服务器,即将server端的共享文件夹挂载到client端
两端都安装nfs服务
# yum install -y nfs-utils
【Server端】
关闭防火墙以及Selinux
# systemctl stop firewalld
# systemctl disable firewalld
# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
创建共享目录
# mkdir /opt/test
# chmod 777 /opt/test
修改nfs配置
# vi /etc/exports
/opt/test 192.168.56.88(rw,all_squash,anonuid=1001,anongid=1002,async) # anonuid和anongid表示所有在Client端创建的文件,最后的所属用户和组为1001、1002,而不是匿名用户nfsnobody。
启动nfs服务
# service nfs start
【Client端】
创建挂载目录,并挂载远程文件夹
# mkdir /u01
# mount -t nfs 192.168.56.77:/opt/test /u01
查看该目录的使用情况
# df -h /u01
Filesystem Size Used Avail Use% Mounted on
192.168.56.77:/opt/test 25G 16G 8.1G 66% /u01
创建文件,可以看到文件的所属用户和所属组分别为1001、1002,这个其实就是对应的server端/etc/exports设置
# touch abc
# ll
-rw-r--r--. 1 1001 1002 0 Dec 22 05:41 abc
如果想让系统自动挂载,可以设置crontab开机挂载,但不建议加到/etc/fstab中,因为如果server端的nfs有问题,client端的服务器重启将会启动很长时间。
配置文件/etc/exports注意事项
- 192.168.56.88(rw...)表示只共享给192.168.56.88这个ip,还可以写成192.168.56.*表示共享给这个网段,写成*(rw...)表示共享给所有网段。
- 如果配置文件/etc/exports中没有anonuid和anongid,新建的文件,用户和组将会变成nfsnobody,具体all_squash这个参数的解释,请看文章的后面的内容。
三、问题汇总
问题1:server端nfs服务关闭,导致client端无法访问共享目录
【Server端】
关闭nfs服务
# service nfs stop
【Client端】
执行ls /卡死,df也卡死,即所有涉及到/u01的操作都会卡死。执行以下命令查看所有nfs挂载
# mount -l |grep nfs
192.168.56.77:/opt/test on /u01 type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.56.88,local_lock=none,addr=192.168.56.77)
同时查看操作系统后台日志/var/log/message,可以定位到是192.168.56.77这台服务器的nfs出了故障。重新启动server端的nfs服务,client端等待一段时间就可正常操作了。
Dec 30 05:01:42 localhost kernel: nfs: server 192.168.56.77 not responding, still trying
如果因为nfs服务的问题导致执行命令一直卡死,这不太友好。因为nfs在挂载的时候,默认采用的硬挂载的方式,如果采用软挂载的方式,执行命令超时前端会有报错提示,而不是一直堵塞。
测试:
重新启动server端的nfs服务service nfs start
client重新挂载mount -t nfs -o soft,timeo=10,retry=2 192.168.56.77:/opt/test /u01
关闭Server端的nfs服务service nfs stop
client端执行命令不会一直堵塞,而是会报错误。
# df -h
df: ‘/u01’: Input/output error
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg-lvroot 25G 1.2G 23G 6% /
devtmpfs 910M 0 910M 0% /dev
tmpfs 920M 0 920M 0% /dev/shm
tmpfs 920M 8.4M 912M 1% /run
tmpfs 920M 0 920M 0% /sys/fs/cgroup
/dev/sda1 988M 110M 812M 12% /boot
tmpfs 184M 0 184M 0% /run/user/0
问题2:权限问题
在配置文件/etc/exports中
all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody),除非在配置中有指定uid和gid
no_all_squash:不将远程访问的所有普通用户及所属组都映射为匿名用户或用户组,即使用文件创建者本身的uid和gid号(默认设置)
root_squash:将root用户及所属组映射为匿名用户或用户组(默认设置)
no_root_squash:不将root用户及所属组映射为匿名用户或用户组
这里面不同的参数设置,都会对文件的权限产生影响,你有时会发现即使是root用户也没有权限去删除文件的时候,就可以看看这些参数,是否是将root权限映射成了匿名用户。基于篇幅,这里就不做演示了。
[root@localhost /u01]# rm -rf yangdir/yangsub
rm: cannot remove ‘yangdir/yangsub’: Permission denied
问题3:nfs端口问题
上面我们搭建nfs的时候,直接关闭了server端的防火墙,但是如果防火墙打开,是否还能正常挂载呢,如果不行,那又需要开通什么端口呢?
server端打开防火墙
# systemctl start firewalld
client端挂载,命令会一直卡死。
# mount -t nfs 192.168.56.77:/opt/test /u01
server端开通端口2049
开端口命令:firewall-cmd --zone=public --add-port=2049/tcp --permanent
重启防火墙:systemctl restart firewalld
查看开通端口:firewall-cmd --list-ports
PS:看到有的文章中写还需要开通111端口,但是实际测试下来,只开通2049端口就可以正常挂载了。
四、总结
- nfs挂载可以采用软挂载的方式
- nfs文件权限可以通过/etc/exports设置
- nfs端口为2049