NFS:Network File System 网络文件系统,基于内核的文件系统。Sun公司开发,通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件,基于RPC(Remote Procedure Call Protocol远程过程调用)实现。
RPC采用C/S模式:客户机请求程序调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
NFS优势:节省本地存储空间,将常用的数据,如home目录,存放在NFS服务器上且可以通过网络访问,本地终端将可减少自身存储空间的使用。
NFS文件系统
RPC与NFS通讯原理:
因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能对应的端口并不固定,客户端要知道NFS服务器端的相关端口才能建立连接进行数据传输,而RPC就是用来统一管理NFS端口的 服务,并且统一对外的端口是111,RPC会记录NFS端口的信息,如此我们就能够通过RPC实现服务端和客户端沟通端口信息。PRC最主要的功能就是指定每个NFS功能所对应的port number,并且通知客户端,记客户端可以连接到正常端口上去。
那么RPC又是如何知道每个NFS功能的端口呢?
首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口,RPC就会记录下这些端口,并且RPC会开启111端口,等待客户端RPC的请求,如果客户端有请求,那么服务器端的RPC就会将之前记录的NFS端口信息告知客户端。如此客户端就会获取NFS服务器端的端口信息,就会以实际端口进行数据的传输了。
NFS工作原理
首先服务器端启动RPC服务,并开启111端口 服务器端启动NFS服务,并向RPC注册端口信息 客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口 服务端的RPC(portmap)服务反馈NFS端口信息给客户端。 客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
注意:在启动NFS SERVER之前,首先要启动RPC服务(即portmap服务,下同)否则NFS SERVER就无法向RPC服务区注册,另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。特别注意:一般修改NFS配置文档后,是不需要重启NFS的,直接在命令执行systemctl reload nfs或exportfs –r即可使修改的/etc/exports生效。
centos7中的rpcbind服务启动后又停止,此时重启nfs-server服务,会自动将rpcbind服务,而centos6重启nfs服务,不会自动启动依赖的rpcbind服务。
NFS各个版本的对比
NFS服务介绍
- 软件包:nfs-utils
- Kernel支持:nfs.ko
- 端口:2049(nfsd), 其它端口由portmap(111)分配
- 配置文件:/etc/exports,/etc/exports.d/*.exports
- CentOS7不支持同一目录同时用nfs和samba共享,因为使用锁机制不同
- 相关软件包:rpcbind(必须),tcp_wrappers
- CentOS6开始portmap进程由rpcbind代替
- NFS服务主要进程:
rpc.nfsd 最主要的NFS进程,管理客户端是否可登录 rpc.mountd 挂载和卸载NFS文件系统,包括权限管理 rpc.lockd 非必要,管理文件锁,避免同时写出错 rpc.statd 非必要,检查文件一致性,可修复文件
- 日志:/var/lib/nfs/
NFS配置文件
导出的文件系统的格式:
/dir 主机1(opt1,opt2) 主机2(opt1,opt2)...
#开始为注释
主机格式:
•单个主机:ipv4,ipv6,FQDN •IP networks:两种掩码格式均支持 172.18.0.0/255.255.0.0 172.18.0.0/16 •wildcards:主机名通配,例如*.magedu.com,IP不可以 •netgroups:NIS域的主机组,@group_name •anonymous:表示使用*通配所有客户端
每个条目指定目录导出到的哪些主机,及相关的权限和选项
•默认选项:(ro,sync,root_squash,no_all_squash) •ro,rw 只读和读写 •async 异步,数据变化后不立即写磁盘,性能高 •sync(1.0.0后为默认)同步,数据在请求时立即写入共享 •no_all_squash (默认)保留共享文件的UID和GID •all_squash 所有远程用户(包括root)都变成nfsnobody •root_squash (默认)远程root映射为nfsnobody,UID为65534,早期版本是4294967294 (nfsnobody) •no_root_squash 远程root映射成root用户 •anonuid和anongid 指明匿名用户映射为特定用户UID和组GID,而非nfsnobody,可配合all_squash使用
实验:共享特定的文件
环境准备:
A主机:192.168.34.100 (nfs服务端)
B主机:192.168.34.101 (客户端)
(1)A主机上安装nfs-server服务在data目录下新建目录,并在nfsdir1目录下创建f1-f4文件
[root@centos7~]#yum install nfs-utils -y [root@centos7~]#systemctl start nfs-server rpcbind [root@centos7~]#mkdir /data/nfsdir1 [root@centos7~]#mkdir /data/nfsdir2 [root@centos7data]#cd nfsdir1 [root@centos7nfsdir1]#touch f1 f2 [root@centos7nfsdir1]#ls f1 f2 [root@centos7nfsdir1]#cd .. [root@centos7data]#touch nfsdir1/{f3,f4}
(2)A主机上在exports配置文件中加入指定要共享的目录
[root@centos7data]#vim /etc/exports /data/nfsdir1 *(sync) /data/nfsdir2 *(rw) 将此nfsdir2目录有读写权限(即文件系统有读写权限) [root@centos7data]#chmod 777 * 给nfsdir1和nfsdir2目录全部是777权限 [root@centos7data]#setfacl -m u:nfsnobody:rwx nfsdir2/ 给用户指定的acl权限也可以在客户端新建文件 [root@centos7data]#exportfs -r 或者使用systemctl reload nfs-server 不要使用重启nfs-server,这样会重新注册端口号 [root@centos7ftproot]#exportfs -v 可以查看当前要被共享的目录属性,此时nfsdir2目录属于读写属性 /data/nfsdir1 <world>(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash) /data/nfsdir2 <world>(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
(3)在B主机(客户端)安装nfs-utils和rpcbind包,启动并新建两个目录,作为临时挂载点
[root@centos7 ~]# yum install rpcbind nfs-utils -y # 安装nfs-utils和rpcbind包 [root@centos7~]#systemctl start nfs-server rpcbind [root@centos7~]#mkdir /mnt/nfs{1,2}
(4)此时B主机要挂载的目录还不清楚,需要查看此时A主机共享的目录,并将A主机指定的目录挂载到nfs1目录下
[root@centos7~]#showmount -e 192.168.34.100 查看nfs服务器共享的目录文件 Export list for 192.168.34.100: /data/nfsdir2 * /data/nfsdir1 * [root@centos7~]#mount 192.168.34.100:/data/nfsdir1 /mnt/nfs1 将A主机的目录挂载到nfs1目录上 [root@centos7~]#ls /mnt/nfs1 挂载完之后查看此时nfs1目录下就有A主机共享的f1-f4文件 f1 f2 f3 f4
(5)我们在B主机可以查看当前挂载的版本型号,并挂载指定的版本号
[root@centos7~]#mount 只写入了最后一行,可以看到此时挂载的是4版本(vers=4.1) 192.168.34.100:/data/nfsdir1 on /mnt/nfs1 type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.34.101,local_lock=none,addr=192.168.34.100) [root@centos7~]#mount -o vers=3 192.168.34.100:/data/nfsdir2 /mnt/nfs2 指定挂载到3版本 [root@centos7~]#mount 此时就可以看到vers=3版本 192.168.34.100:/data/nfsdir2 on /mnt/nfs2 type nfs (rw,relatime,vers=3,rsize=262144,wsize=262144,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.34.100,mountvers=3,mountport=20048,mountproto=udp,local_lock=none,addr=192.168.34.100)
(6)由于上面给nfsdir1和nfsdir2目录都有777权限或者给nfsnobody用户指定权限,可以在B客户端指定的nfs2目录下新建文件
[root@centos7~]#touch /mnt/nfs2/f11
配合all_squash,映射用户为指定的UID和GID
在NFS服务器端修改nfs服务配置文件
vim /etc/exports 修改配置文件 /data/nfsdir1 *(sync) /data/nfsdir2 192.168.34.0/24(rw,all_squash,anonuid=1000,anongid=1000) 映射用户为指定的UID和GID [root@centos7~]#exportfs -r 重新加载 [root@centos7~]#exportfs -v 查看修改文件的具体内容 /data/nfsdir2 192.168.34.0/24(sync,wdelay,hide,no_subtree_check,anonuid=1000,anongid=1000,sec=sys,rw,secure,root_squash,all_squash) /data/nfsdir1 <world>(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
在客户端进行新建一个文件
[root@centos7~]#cd /mnt/nfs2 [root@centos7nfs2]#touch tom 在挂载的目录下新建一个tom文件 [root@centos7nfs2]#ll total 0 -rw-r--r-- 1 nfsnobody nfsnobody 0 Dec 4 11:00 f11 -rw-r--r-- 1 nfsnobody nfsnobody 0 Dec 4 11:03 f12 -rw-r--r-- 1 liu liu 0 Dec 4 14:28 tom 此时由于客户端有1000ID的用户,就会映射为指定的名称,如果没有此账号,就会显示1000的UID和GID
rpcinfo
rpcinfo -p hostname rpcinfo –s hostname 查看RPC注册程序
exportfs
-v 查看本机所有NFS共享 -r 重读配置文件,并共享目录 -a 输出本机所有共享 启动共享 -au 停止本机所有共享 临时停止共享
showmount -e hostname 显示NFS服务器上所有共享的目录
mount.nfs 挂载工具
NFSv4支持通过挂载NFS服务器的共享“根”,从而浏览NFS服务器上的共享目录列表
想永久挂载nfs服务器,此时需要写在fstab配置文件中
[root@centos7nfs2]#vim /etc/fstab UUID=38dd5f68-4f30-411c-b80a-0f4a60b06c6f / xfs defaults 0 0 UUID=4357cc0e-6ee7-4a8f-8064-d1a54bdbf17f /boot xfs defaults 0 0 UUID=eb4bf5e6-2645-4b1c-bda8-12c5831b81c2 /data xfs defaults 0 0 UUID=b8c37e0b-3628-40b6-ac44-c36ca09b448f swap swap defaults 0 0 192.168.34.100:/data/nfsdir1 /mnt/nfs1 nfs defaults 0 0 永久挂载到nfs1目录下 [root@centos7nfs2]#mount -a 启动所有的挂载点 [root@centos7nfs2]#df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 104806400 4808676 99997724 5% / devtmpfs 740204 0 740204 0% /dev tmpfs 756008 0 756008 0% /dev/shm tmpfs 756008 10412 745596 2% /run tmpfs 756008 0 756008 0% /sys/fs/cgroup /dev/sda3 52403200 32992 52370208 1% /data /dev/sda1 1038336 166960 871376 17% /boot tmpfs 151204 12 151192 1% /run/user/42 192.168.34.100:/data/nfsdir2 52403200 33024 52370176 1% /mnt/nfs2 192.168.34.100:/data/nfsdir1 52403200 33024 52370176 1% /mnt/nfs1 此时查看永久挂载到/mnt/nfs1
客户端NFS挂载
基于安全考虑,建议使用nosuid,nodev,noexec挂载选项
NFS相关的挂载选项:
fg(默认)前台挂载,bg后台挂载 hard(默认)持续请求,soft 非持续请求 intr 和hard配合,请求可中断 rsize和wsize 一次读和写数据最大字节数,rsize=32768 _netdev 无网络不挂载
示例:
mount -o rw,nosuid,fg,hard,intr 172.16.0.1:/testdir /mnt/nfs/
开机挂载: /etc/fstab 172.16.0.1:/public /mnt/nfs nfs defaults 0 0
自动挂载
可使用autofs按需要挂载NFS共享,在空闲时自动卸载 由autofs包提供 系统管理器指定由/etc/auto.master自动挂载器守护进程控制的挂载点 自动挂载监视器访问这些目录并按要求挂载文件系统 文件系统在失活的指定间隔5分钟后会自动卸载 为所有导出到网络中的NFS启用特殊匹配 -host 至“browse” 参看帮助:man 5 autofs 支持含通配符的目录名 * server:/export/&
实现访问/misc/nfs目录后就可以自动挂载共享目录(相对路径法)
(1)在客户端的/etc/auto.master子配置文件(/etc/auto.misc)中修改要挂载nfs服务目录(/data/nfsdir2)
[root@centos777~]#yum install autofs -y [root@centos777~]#systemctl start autofs [root@centos777~]#vim /etc/auto.misc nfs -fstype=nfs,vers=3,rw,nosuid,nodev 192.168.34.100:/data/nfsdir2 (192.168.34.100是nfs服务端IP地址)
(2)启动nfs服务和rpcbind
[root@centos7nfsdir2]#systemctl start nfs-server rpcbind
(3)在客户端验证效果,此时访问nfs目录文件,就会自动挂载目录
[root@centos777~]#ls /misc/nfs 访问misc/nfs目录 f11 f12 tom [root@centos777~]#df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 104806400 4787296 100019104 5% / devtmpfs 740204 0 740204 0% /dev tmpfs 756008 0 756008 0% /dev/shm tmpfs 756008 10400 745608 2% /run tmpfs 756008 0 756008 0% /sys/fs/cgroup /dev/sda3 52403200 32992 52370208 1% /data /dev/sda1 1038336 166960 871376 17% /boot tmpfs 151204 12 151192 1% /run/user/42 /dev/sr0 10491772 10491772 0 100% /misc/cd 192.168.34.100:/data/nfsdir2 52403200 33024 52370176 1% /misc/nfs /misc/nfs目录已经被挂载
实现自动挂载共享目录(绝对路径法)
(1)在客户端autofs主配置中新建一个主配置测试文件,并重启autofs配置文件
[root@centos777~]#vim /etc/auto.master 在autofs主配置文件中新建一个要挂载的配置文件 /- /etc/test.auto
(2)修改要挂载的目录,并重启autofs服务
[root@centos777~]#vim /etc/test.auto /d1/d2/d3/nfs2 -fstype=nfs 192.168.34.100:/data/nfsdir2 将nfs服务器/data/nfsdir2目录挂载到/d1/d2/d3/nfs2目录下 [root@centos777~]#systemctl restart autofs
重启完autofs服务就会自动创建一个要挂载的目录
(4)查看绝对路径挂载结果
[root@centos777~]#df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 104806400 4787820 100018580 5% / devtmpfs 740204 0 740204 0% /dev tmpfs 756008 0 756008 0% /dev/shm tmpfs 756008 10400 745608 2% /run tmpfs 756008 0 756008 0% /sys/fs/cgroup /dev/sda3 52403200 32992 52370208 1% /data /dev/sda1 1038336 166960 871376 17% /boot tmpfs 151204 12 151192 1% /run/user/42 192.168.34.100:/data/nfsdir2 52403200 33024 52370176 1% /d1/d2/d3/nfs2
autofs配置文件中的默认配置也可以挂载到网络nfs服务上(此方法比较方便)
(1)切换到nfs服务器的IP地址下共享的目录文件中
[root@centos777~]#cd /net/192.168.34.100 [root@centos777192.168.34.100]#ls data [root@centos777192.168.34.100]#cd data [root@centos777data]#cd nfsdir2 [root@centos777nfsdir2]#ls f11 f12 tom [root@centos777nfsdir2]#df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 104806400 4787332 100019068 5% / devtmpfs 740204 0 740204 0% /dev tmpfs 756008 0 756008 0% /dev/shm tmpfs 756008 10400 745608 2% /run tmpfs 756008 0 756008 0% /sys/fs/cgroup /dev/sda3 52403200 32992 52370208 1% /data /dev/sda1 1038336 166960 871376 17% /boot tmpfs 151204 12 151192 1% /run/user/42 192.168.34.100:/data/nfsdir2 52403200 33024 52370176 1% /d1/d2/d3/nfs2 192.168.34.100:/data/nfsdir2 52403200 33024 52370176 1% /net/192.168.34.100/data/nfsdir2 此时可以看到已经挂载到nfsdir2目录下
autofs配置文件的默认选项
切换到目录下挂载的结果:
all_squash