NFS(Network FileSystem)--由Sun公司开发的,用于通过网络分享文件给其他系统使用。功能:将服务器端的分享目录挂载到客户端中使用,像使用本地的文件。
NFS使用的端口随机的,NFS基于RPC服务开启。
RPC(Remote Rpocedure Call)服务:指定NFS功能对应的端口,并反馈给客户端,让客户端能正确连接到服务端的端口。服务器启动NFS时会随机使用多个端口,并主动向RPC注册,所以RPC标注了每个端口对应的NFS功能。客户端只要通过111端口(111是RPC固定端口)向服务器申请需要的服务器端口,就可以正确连接使用NFS了。

(图片来源:http://linux.vbird.org/linux_server/0330nfs.php#What_NFS_daemons)
NFS启动的基本进程:
1、rpc.nfsd:必要,这是nfs服务提供进程,用于判断客户端是否能登入服务器端,包括UID判断;
2、rpc.mountd:必要,管理nfs文件系统,用于读取/etc/exports设定,并判断用户端的各种操作权限;
3、rpc.lockd:可选,用于文件的锁定,防止多个客户端同时对同一文件的写入。需客户端和服务器端都开启才生效。
4、rpc.statd:可选,用于检查文件一致性,当多个客户对同一文件写入造成数据不一致而尝试修复该文件。该进程常与rpc.lockd同时使用。该进程也需客户端和服务器端同时开启。
NFS文件存取权限:
客户端访问nfs的文件时,服务器端会用户端的使用者UID, GID等身份来尝试读取服务器端的文件系统,那么有以下几种情形:
(1)NFS服务端有相同的账号和群组:这种情况则能直接存取;
(2)客户端的使用者UID与服务器端存在,但账号名称不一致:
假设客户端使用用户为dmtsai用户,该用户UID为501,则nfs服务端也有501的用户但名称为vbird,则服务端用的是vbird账号来存取文件;
(3)NFS服务器不存在此账号:
如果用户端的使用者UID在服务器端找不到,则使用匿名用户来访问,一般UID为65534, centOS则取名为nfsnobody。
(4)使用者身份为root:
默认情况下,如果使用root账号访问,则会降为匿名用户访问。
需要安装的软件:
PRC程序:rpcbind,nfs依赖RPC服务,则必须存在rpcbind服务。
NFS程序:nfs-utils,提供rpc.nfsd和rpc.mountd这两个进程服务和其他说明文件。
安装:
centos下,使用 yum install nfs-utils 安装。
检查有无安装: rpm -qa | grep nfs 和 rpm -qa | grep rpcbind。
NFS软件结构:
/etc/exports:nfs的主要设置文件,该文件可能一开始不存在,需手动建立。
/usr/sbin/exportfs:维护nfs分享资源程序,用于修改/etc/exports的目录分享。
/var/lib/nfs/*tab:有两个文件, etab记录nfs分享目录的完整权限设置;xtab记录访问nfs服务器的用户端日志。
/usr/sbin/showmout:用于客户端,察看分享的目录资源。
/etc/exports文件结构:
每行为分享的目录和设置给不同主机的不同权限:
vim /etc/exports /tmp 192.168.100.0/24(ro) localhost(rw) *.ev.edu.tw(ro.sync)
以上面的内容为例,每行最前面写明要分享的目录,注意,是目录非文件。然后依次分享给三种不同的主机,主机后紧跟的小括号内为权限参数,参数间用逗号间隔,主机名与括号间紧挨无空格。
主机名格式:
(1)可以是完整IP或网域,如上192.168.100.0/24;
(2)可以用主机名称,但必须在/etc/hosts内,或DNS能找到。主机名称可用星号*或?。
常见权限参数格式:
ro\rw:表示该目录可读(ro)或可写(rw),不过最终能否读写还要依赖文件的rwx和身份;
sync\async:sync表示文件同步写入到内存和硬盘;async则先暂存到内存不立即写到硬盘;
no_root_squash\root_squash:客户端用root账号访问nfs,默认情况为root_squash, 表示会降级为nfsnobody用户访问nfs,要解开这样的设定则需使用no_root_squash;
all_squash:不论用什么使用者访问nfs,都降为匿名用户(即nobody或(nfsnobody))访问;
anonuid/anongid:当权限参数有使用到如上*_squash的参数,则可以使用anonuid自定义设定UID值,该值存在于/etc/passwd当中;anongid自定义群组GID。
例1:让root用户有root访问权限
/tmp *(rw,no_root_squash)
上例主机名用*号,代表所有用户访问/tmp时,都将使用root权限访问。
例2:同一目录针对不同范围开放不同权限
mkdir /home/public setfacl -m g:vbirdgroup:rwx /home/public vim /etc/exports /home/public 192.168.100.0/24(rw) *(ro)
当客户端IP为192.168.100.0/24网段时,则访问nfs的/home/public目录有读写权限;否则不在此网段的只有只读权限。
例3:开放匿名登录
groupadd -g 45 nfsanon useradd -u 45 -g nfsanon nfsanon mkidr /home/linux setfacl -m u:nfsanon:rwx /home/linux vim /etc/exports /home/linux *.centos.vbird(rw,all_squash,anonuid=45,anongid=45)
上例在使用通用后缀centos.vbird名称的主机访问/home/linux目录,则改用uid为45,gid45的账户对其目录进行读写。
修改好/etc/exports文件后,执行exportfs命令重新加载exports文件:
exportfs -arv -a:全部重加载(或卸载)exports文件的配置; -r:重新加载 -v:显示执行后的加载内容 -u:与r参数相反,用于卸载配置
在客户端(或服务器内)使用showmount命令可查看服务器当前分享的目录:
showmount -e [IP] -e: 查看某个服务器分享的目录信息 -a: 查看客户端与某个服务器的连线状态
防火墙设置:
首先要固定nfs的随机端口:
vi /etc/sysconfig/nfs
#添加或修改
LOCKD_TCPPORT=41889 #nfs-lock的tcp固定端口
LOCKD_UDPPORT=40220 #nfs-lock的udp固定端口
MOUNTD_PORT=20048 #mountd的固定端口
centos7中,要在/etc/sysctl.conf中添加以下配置:
vi /etc/sysctl.conf #添加以下配置: fs.nfs.nlm_tcpport = 41889 fs.nfs.nlm_udpport = 40220
保存后,执行以下命令使以上配置生效。
sysctl -p
重启nfs相关服务:
systemctl restart rpcbind systemctl restart nfs-server systemctl restart nfs-lock systemctl restart nfs-idmap
用rpcinfo命令查看各服务注册情况:
rpcinfo -p [localhost|其他IP]
-p : 显示所有注册的rpc服务和端口
添加以下规则,允许某Ip可使用Nfs服务:
#以客户端192.168.1.100为例: firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="111,2049,20048,41889" protocol="tcp" accept' firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="111,2049,20048,40220" protocol="udp" accept' firewall-cmd --reload
#如果以上命令出现invalid port提示错误,则可以按服务方式添加:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="nfs" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="rpc-bind" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="mountd" accept'
# 若 nlockmgr 用了固定端口 41889和40220,需单独添加
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="103.212.48.251" port port="41889" protocol="tcp" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="103.212.48.251" port port="40220" protocol="udp" accept'
#查看已添加的富规则:
firewall-cmd --list-rich-rules
#如需要删除某条富规则,将add-rich-rule改为remove-rich-rule再执行一次
autofs自动挂载服务:
自动挂载服务,能在需要访问Nfs资源时才会动态挂载,长时间不用时会自动卸载,节省资源。
安装:
yum install -y autofs
自动配置文件:/etc/auto.master
autofs有两种映射模式,一种是直接映射,一种是间接映射模式:
| 映射模式 | 核心特点 | auto.master 第一列格式 | *.misc 文件中的内容格式 |
|---|---|---|---|
直接映射(/-) |
挂载点是绝对路径(如 /a/b/c),不依赖父目录 |
/- |
/绝对挂载点路径 选项 NFS 服务器:共享路径 |
| 间接映射 | 挂载点是父目录的子路径(如父目录 /a/b 下的 c) |
/父目录路径(如 /a/b) |
子目录名 选项 NFS 服务器:共享路径 |
一、间接映射示例:
#将Nfs服务器192.168.0.1下的/home/www目录挂载到客户端192.168.0.10下的/home/linux/www下: #auto.master文件:定义父目录,并用子配置文件定义要挂载的子目录 /home/linux /etc/subdir/www.misc #www.misc文件:书写子目录 www -rw,bg,soft 192.168.0.1:/home/www
注意:间接映射会让原本的父目录被nfs共享机制覆盖,所以原来的目录(如上示例/home/linux)中的文件和子目录将看不到。
二、直接映射示例:
#将Nfs服务器192.168.0.1下的/home/www目录挂载到客户端192.168.0.10下的/home/linux/www下: #auto.master文件(第 /- /etc/subdir/www.misc #www.misc文件:书写绝对目录 /home/linux/www -rw,bg,soft 192.168.0.1:/home/www
注意:/-表示 “没有固定的父挂载目录”,所有的挂载点都由后续的*.misc文件中的“绝对路径”来定义。所以直接映射不会挂载父目录。
手动挂载命令mount:
mount -t nfs -o nosuid,noexec,nodev,rw 192.168.100.254:/home/public /home/nfs/public #-t: 指定挂载的文件系统类型,这里用nfs; #-o: 挂载时需指定的一些必要参数,见下图。
一些必要的参数:
| 參數 | 参数代表意义 | 预设值 |
| suid nosuid |
对具有suid的执行文件,可以定义其是否能使用suid的权限。 | suid |
| rw ro |
设置是否只读(ro)或可读写(rw)。 | rw |
| dev nodev |
是否保留设备文件的特殊功能,一般只有/dev目录才有效。 | dev |
| exec noexec |
是否能执行二进制文件的权限。 | exec |
| user nouser |
是否允许使用者进行挂载或卸载功能。 | nouser |
| auto noauto |
auto 指的是『mount -a』时,是否可自动挂载。 | auto |
对于nfs,还有一些额外的有用参数:
| 参数 | 功能 | 预设值 |
| fg bg |
挂载时在地前景还是后置进行. fg代表前景,即会持续尝试挂载操作,直到成功或超时为止;bg代表后置操作,不会影响前景的程序。如果网络不稳定或需要常开关机,建议用bg。 | fg |
| soft hard |
hard:如果两机通讯时任一主机下线,则rpc会一直尝试连线,直到恢复通讯为止;soft: rpc在超时后重复呼叫,但不会一直通讯,系统的延迟不会这么明显。如果系统经常开关机,建议用soft. | hard |
| intr | 与上方的hard一起用。当使用intr参数,则rpc呼叫过程可被中断(interrupted)。 | 沒有 |
| rsize wsize |
定义读区块(rsize)和写区块(wsize)大小 (block size),设定通讯传输的缓冲内存。如果服务器有足够的内存,可将此值设定大些,如 32768 (bytes) 等,提高缓冲传输能力! | rsize=1024 wsize=1024 |
设定开机即挂载:
可以/etc/rc.d/rc.local文件中添加mount命令。
示例:
vim /etc/rc.d/rc.local mount -t nfs -o nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768 \ 192.168.100.254:/home/public /home/nfs/public
注意: 不要在/etc/fstab文件中配置,因为nfs需要网络服务,而fstab文件在挂载时还未启动网络。
浙公网安备 33010602011771号