NFS:
Network File System,网络文件系统。能够挂载网络上NFS服务器的目录到本地主机当成卷使用
环境:
虚拟机软件:vmware workstation
系统:CentOS Linux release 7.3.1611 (Core)
服务器软件:rpcbind 0.2.0 nfs-utils 1.3.0
虚拟机:
服务器:
IP:192.168.2.20 桥接
客户端:
IP:192.168.2.30 桥接
部署:
服务器端:
1、关闭防护墙、selinux,避免干扰
# systemctl stop firewalld
# setenforce 0
2、安装rpcbind和nfs-utils软体
rpcbind:为某些应用提供端口注册服务,nfs必须用到。
# yum install rpcbind -y
nfs-utils:
# yum install nfs-utils
/etc/export: 设定可用的共享;
/usr/sbin/exports: 服务器端管理共享资源的命令;
/usr/lib/nfs/*tab: 记录资料
etab:记录共享目录的完整权限设定;
xtab:记录连接到服务器的客户端资料;
/usr/sbin/showmount:客户端用来查看NFS服务器共享资源的命令;
3、编辑/etc/exports文件:
/share 192.168.2.30(rw) 192.168.2.0/24(ro) localhost(rw) *.shxing.com(ro)
[共享目录] [可使用主机] [可使用网段] [可使用主机名] [可使用域名]
共享目录:行首写明共享目录路径;
可使用主机:共享路径后写明可使用主机,主机的表示方式:
a、IP地址,如192.168.2.30.
b、网段,如192.168.2.0/24或192.168.2.0/255.255.255.0.
c、主机名,如localhost,web-01等.
d、域名,如www.shxing.com.
注:主机名和域名可使用通配符*,主机名和域名必须能够被解析到,其他详细用法可man exports。
使用权限:紧随主机后面使用()注明主机可用权限
ro:仅读
rw:读写
sync:同步写入磁盘;
async:异步写入磁盘;
root_squash:客户端使用root权限登录时,压缩至anonymous用户权限;
no_root_squash:不进行压缩
all_squash:对所有登录用户进行压缩,即所有用户登录时仅具有anonymous用户权限;
anonuid:anonymous用户的uid和gid默认为nfsnobody的uid和gid,这里可以另行设定,如anonuid=2010.
anongid:另行设定anonymous的gid
注:多个权限设定之间用逗号隔开;
/etc/exports文件修改后,可使用exportfs -r命令重载此文件或reload服务
4、启动rpcbind服务
# systemctl start rpcbind
要首先启用rpcbind服务,因为nfs服务要向其注册端口;若rpcbind服务重启,则端口对应会清空,
需要重启向其注册端口的服务;
rpcbind监听在tcp和udp的111端口.
5、启动nfs服务
#systemctl start nfs
查看服务器上可用的nfs挂载:
#showmount -e localhost
客户端:
1、启动rpcbind服务:
#systemctl start rpcbind
此服务一般默认为开启状态,nfs服务无论客户端或者服务端都依赖于rpcbind服务,必须首先开启
2、查看服务器可用挂载:
#showmount -e 192.168.2.20
3、创建挂载路径,并进行可用的nfs挂载
#mkdir /nfs-share
#mount -t nfs -o rw,nodev,nosuid,nouser,noauto,noexec 192.168.2.20:/
挂载路径的权限:
决定用户挂载目录权限的因素:
1、/etc/exports中定义的权限,ro,rw等;
2、客户端挂载用户的ID号在服务器中对目录的权限;如客户端使用用户
user1进行挂载,user1的UID是1003,GID是1003那么他挂载服务器
上的目录时,他对目录的权限等同于服务器中UID=1003,GID=1003
的权限,不区分用户的挂载,一般使用all_squash把用户权限都压缩为
anonymous用户的权限(即nfsnobody用户),特定主机用户挂载特定
路径,则在/etc/exports中定义目录的挂载限定为目标主机,在服务器
上创建shell为/usr/sbin/nologin 、UID和GID为客户端使用客户ID的新
用户,调整新用户对服务器挂载目录的权限以符合客户端的需求。
3、客户端挂载时的挂载选项:ro,rw等
因素优先级:
1、客户端IP:
/etc/exports文件中是否定义了此客户端对该输出目录的许可权限,
有则该客户端允许挂载此目录,无则权限拒绝;
定义权限ro,则此目录挂载时仅读;定义权限rw,则继续以下权
限判定。
2、客户端挂载用户ID号:
客户端挂载用户的ID对被挂载目录的权限。
3、客户端挂载时挂载选项:
为ro,则只读;为rw,则为读写挂载。
Tip:
1、客户端IP对服务器输出目录有权限时,此客户端的任何用户都
可以挂载此目录(就算用户对输出目录无任何权限),但挂载后
会判断用户对此目录的权限,无任何权限的用户会被拒绝访问。
2、客户端挂载路径在挂载后,目录权限变更为挂载用户ID对此目
录的权限;
客户端挂载目录选项:
客户端挂载时出于安全或性能考虑,会有诸多挂载选项:
ro:仅读挂载;(以防普通挂载用户误删文件)
rw:读写挂载;
user:允许普通用户进行nfs的挂载和卸载操作;
nouser:不允许普通用户进行nfs的挂载和卸载操作;root用户统一
管理
auto:mount -a挂载时是否挂载nfs;
noauto:mount-a挂载时不挂载nfs;
exec:允许执行程序文件;
noexec:不允许执行程序文件,建议;(以免不安全的程序文件破
坏系统数据)
suid:是否允许suid权限;
nosuid:不允许suid权限,建议;
fg:在前台进行挂载操作;
bg:在后台进行挂载操作,网络不稳定时建议;(当挂载无法正常
进行一直持续时,会占据前台,此选项可释放前台)
hard:无法连接服务器时,会持续挂载直到连接上;
soft:连接服务器超时时,会重复挂载直到连上,建议(不会太占用
系统资源)
intr:当使用hard挂载选项时,加上此选项,连线是可以被中断的;
rsize:读块大小,默认为1024;(当在局域网络并且内存足够时,
可适当调整大小,比如32768)
wsize:写块大小,默认为1024;(同上)
windows挂载nfs:
windows挂载使用nfs,要在‘打开或关闭windows功能’选项中添加nfs客户端
工具,添加完成后,打开cmd使用mount或umount命令来实现挂载和卸载
nfs共享目录,如:
挂载:
mount -o mtype=soft timeout=6 casesensitive=yes
\\192.168.181.11\data m:
卸载:
umount -a :卸载所有nfs挂载
开机挂载nfs:
nfs文件系统依赖于网络设备,所以当定义在/etc/fstab中时,从系统
的启动流程分析可得出,nfs文件并不会被自动挂载,可使用下面的方法:
1、在rc.local中定义挂载;
2、使用autofs挂载;
3、也可以在/etc/fstab中定义挂载,加上bg,soft挂载选项,或
使用_netdev选项(推荐,见man mount)
/etc/fstab挂载,例:
192.168.181.11:/data /mnt nfs defaults,bg,nosuid,soft 0 0
192.168.181.11:/data /mnt nfs defaults,_netdev 0 0
当nfs服务器不能连接时,后台会生成一个mount进程重复进行
连接尝试,直到连接成功
autofs:
客户端自动nfs挂载软件,在使用到挂载路径时自动挂载,未使用一
段时间后自动断开挂载
软体:autofs.x86_64
配置文件:
1、/etc/auto.master和/etc/auto.master.d,定义本地侦
测目录和对应的挂载配置文件;
格式:
/tmp/nfs.web /etc/auto.web
本地侦测目录 该目录对应的挂载配置文件
Tip:
*auto.master.d目录下的文件命名格式为*.autofs;
*被侦测的目录如何事先未创建而由autofs自动创
建,则在autofs服务停止后会自动删除;已创建
则不会;
2、/etc/auto.web,此文件由用户自行创建,名称和上面定义
的文件名匹配即可
格式:
public -rw,noexec,nosuid,nouser,bg,soft
,intr web:/share/public
public:本地挂载目录,路径相对于/etc/auto.ma
ster或/etc/auto.master.d下的配置文件中定
义的侦测目录;
-rw....:本段标准格式以‘-’开头,定义挂载时选项;
web...lic:本段定义nfs服务器输出目录;
配置文件创建好后,启动autofs服务,可实现自动挂载:
#systemctl start autofs
命令:
exportfs:
exportfs -ar:导出/etc/exports中的 所有共享文件系统
exportfs -au:停止所有的nfs共享文件系统
exportfs -u FS:停止某个nfs共享文件系统
rpcinfo
挂载选项rsize和wsize:
读缓冲大小和写缓冲大小,设置不能超过服务器端设置的最大值;
在内存足够时,一般较大的rsize和wsize会有较快的速度体验,但
相对安全性降低;
nfs服务的请求流程:
1、nfs服务:nfs、mountd、idmapd
nfs:响应客户端的nfs请求,向内核发起调用
mountd:接受客户端的连接请求,对客户端进行IP验证
idmapd:本地账号映射服务;
rpcbind:portmapper,接受其他基于远程过程调用服务的端口注册
2、nfs响应流程:
服务器端启动rpcbind服务,向其他服务提供端口注册服务
服务器端启动nfs服务,包括nfs、mountd、idmapd;
mountd向postmapper注册随机端口(可能是多个mountd进程,注册多个端口)
客户端向服务器端rpcbind服务监听端口111发出服务请求;
rpcbind根据请求服务类型,响应对应服务注册的端口给客户端;
客户端向rpcbind返回的端口发出服务请求;
服务器端mountd接受服务请求并验证客户端IP,验证通过后,给回通过token
给客户端;
客户端向服务器端nfs监听的端口2049发出带token的服务请求;
服务器端nfs服务验证token,根据服务请求内容向内核发起调用,调用完成后
返回完成信息给客户端
Conclusion:
1、nfs不支持账户密码访问,适用于安全性较高的内部环境
2、nfs在使用showmount -e时,会清晰显示服务器的目录层级
存在安全隐患
3、nfs在实行访问控制时:
@针对ip、网段、域名进行访问控制,如:
192.168.181.10(ro);该ip仅读
192.168.181.0/24(rw);该望都可读写
*(ro);所有客户端可读
*.ijia.com(ro);ijia.com域内主机可读
@anonuid,anongid控制,一般配合all_squash,如
192.168.181.10(all_squash,anonuid=1366);
所有挂载用户压缩为anonymous,且uid为1366,在检查权限时
检查uid为1366的用户对挂载目录具有的权限
192.168.181.10(all_squash,anongid=2000);
同上,检查gid为2000的组队挂载目录具有的权限
@基于上一步所述,在针对不同客户端实现挂载权限控制时;
可以创建两个用户或组,授权用户或组分别对共享目录具有ro和rw权限;
在/etc/exports中,针对不同客户端,使用all_squash和anonudi或anongid
对应到不同权限的用户或组的uid或gid
@不同客户端在共享目录创建的目录可能属于同一用户,不方便进行
文件管理
@客户端用户在使用挂载时,如果创建文件,文件的属主属组在客户端显示
为客户端用户组,在服务器端显示存在两种情况:
1、客户端用户的ID号在服务器端存在,此时文件的属主属组为服务器端
同ID号的账户;
2、客户端用户的ID好在服务器端不存在,此时文件的属主属组为客户端
用户的UID和GID
即:NFS服务不验证用户,只验证IP,所以在其他组有写权限的共享目录
中会存在许多没有属主属组的文件,带来安全隐患
4、nfs是linux内核实现的,常用于linux系统之间的文件共享与挂载,与windows
系统兼容性一般;
ftp是应用层服务,但无法提供文件系统挂载;
samba是解决跨windows与linux平台的文件共享与挂载,是在linux平台上实现
cifs协议;
5、DAS、NAS、SAN:
DAS:directive attached storage,直接附加存储,如磁盘,阵列等;
NAS:network attached storage,基于cifs、nfs等协议实现的文件系统级别的
网络存储;
SAN:storage area network,存储区域网络,块级别的网络存储
6、nsswitch和pam:
nsswitch:network service switch,名称解析框架;
配置文件:/etc/nsswith.conf
模块:/usr/lib/libnss* ;/usr/lib64/libnss* ;
pam:pluggable authentication module,用户认证框架;
配置文件:/etc/pam.d/* ;
模块:/usr/lib64/security/*.so ;
rpc概念:
rpc:remote procedure call protocol,远程过程调用协议
一部分功能由本地程序完成
另一部分功能由远程主机上的函数完成
半结构化数据:
xml:extended mark language
json
问题:
1、客户端使用showmount -e server-hostname,提示:
‘远程系统错误RPC: 端口映射器故障 - RPC: 已超时’
使用showmount -e server-ip时正常,而ping主机名
时正常连通
解:后面莫名好了,未解!估计不是ip或主机名的问题,而是
远程RPC的问题;
2、使用autofs进行目录自动挂载时,出现以下问题:
挂载配置:/etc/auto.master.d/test1.autofs 内容
/nfs-share /etc/auto.master.d/autofs-test1
/etc/auto.master.d/autofs-test1文件内容:
web -rw,nouser,nosuid 192.168.181.11:/data
启动autofs自动挂载时,显示的挂载却是:
/etc/auto.master.d/autofs-test1 挂载于 /nfs-share
尝试:取消子配置文件,直接定义在/etc/auto.master文件中,结果同样
解:事实上autofs运行时,侦测目录的挂载格式显示就是这样的;
自寻烦恼
3、服务器端离线,客户端nfs挂载无法使用,会造成许多跟文件系统相关
的命令卡住无法执行,如df 、du、fdisk等等
解:使用umount -f或-l 或-lf卸载挂载目录;或k掉挂载进程