简介
- NFS 是 Network File System 的缩写,即网络文件系统。功能是让客户端通过网络访问不同主机上磁盘里的数据,主要用在类Unix系统上实现文件共享的一种方法
- NFS 的基本原则是
容许不同的客户端及服务端通过一组RPC分享相同的文件系统
,容许不同硬件及操作系统的系统共同进行文件的分享。 - NFS在文件传送或信息传送过程中依赖于RPC协议
NFS Server安装与配置
-
查看系统
$ cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
-
机器准备
名称 IP 描述 Server 10.100.22.160 服务端 Client 10.100.22.161 客户端 -
服务端安装:在 CentOS 5.x 以前这个软件称为 portmap,在 CentOS 6.x 之后才称为 rpcbind 的
$ yum install nfs-utils -y # 设置开机启动 $ systemctl enable nfs $ systemctl enable rpcbind # 启动 $ systemctl start rpcbind $ systemctl start nfs # 查看NFS开放的端口 $ netstat -tulnp| grep -E '(rpc|nfs)'
-
服务端配置:主要配置文件时
/etc/exports
# 配置一个共享目录 $ mkdir -p /home/data/nfs $ chmod 755 /home/data/nfs # 设置导出目录 $ vim /etc/exports /home/data/nfs 10.100.22.0/24(rw,sync,no_root_squash,no_all_squash) # 重启nfs $ systemctl restart nfs # 检查一下服务端本地的共享目录 $ showmount -e localhost Export list for localhost: /home/data/nfs 10.100.22.0/24
-
/etc/exports
配置说明-
/home/data/nfs
: 共享目录位置 -
10.100.0.0/24
: 客户端 IP 范围,* 代表所有,即没有限制 -
rw
: 权限设置,可读可写 -
sync
: 将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性; -
no_root_squash
: 可以使用 root 授权 -
no_all_squash
: 可以使用普通用户授权
-
-
如果重新处理
/etc/exports
,不需要重启NFS(如果重启nfs,要再向RPC注册)# 重新挂载一次 /etc/exports 的设定 $ exportfs -arv # 将已经分享的 NFS 目录资源,通通都卸除 $ exportfs -auv $ showmount -e localhost 看不到任何资源
NFS Server配置说明
-
主要配置文件:/etc/exports,配置文件并没有默认值,也不一定会存在此文件(需手动创建)。格式:<输出目录> [客户端1 选项(访问权限,用户映射,其他)]
- 输出目录:NFS系统中需要共享给客户机使用的目录
- 客户端:网络中可以访问这个NFS输出目录的计算机,指定方式
- 指定ip地址的主机:192.168.0.200
- 指定子网中的所有主机:192.168.0.0/24 192.168.0.0/255.255.255.0
- 指定域名的主机:david.bsmart.cn
- 指定域中的所有主机:*.bsmart.cn
- 所有主机:*
- 选项:设置输出目录的访问权限、用户映射等
- 访问权限选项:只读ro,读写rw
- 用户映射选项:
- all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
- no_all_squash:与all_squash取反(默认设置);
- root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置);
- no_root_squash:与rootsquash取反;
- anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
- anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);
- 其它选项
- secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
- insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
- sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
- async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
- wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
- no_wdelay:若有写操作则立即执行,应与sync配合使用;
- subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
- no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;
-
NFS 文件系统维护指令:/usr/sbin/exportfs可以利用这个指令重新分享 /etc/exports 变更的目录资源、将 NFS Server 分享的目录卸除或重新分享等等
选项与参数: -a :全部挂载(或卸除) /etc/exports 档案内的设定 -r :重新挂载 /etc/exports 里面的设定,此外,亦同步更新 /etc/exports 及 /var/lib/nfs/xtab 的内容! -u :卸除某一目录 -v :在 export 的时候,将分享的目录显示到屏幕上!
-
分享资源的登录文件:/var/lib/nfs/*tab,NFS 服务器的登录文件都放置到此目录里面
-
客户端查询服务器分享资源的指令:/usr/sbin/showmount。exportfs 是用在 NFS Server 端,而 showmount 则主要用在 Client 端
NFS Client安装与配置
-
查看系统
$ cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
-
安装,客户端不需要启动NFS服务
$ yum install nfs-utils -y # 设置开机启动 $ systemctl enable rpcbind # 启动 $ systemctl start rpcbind # 查看服务端的共享目录 $ showmount -e 10.100.22.160 Export list for 10.100.22.160: /home/data/nfs 10.100.0.0/24 # 创建客户端目录 $ mkdir -p /home/client $ chmod 755 /home/client # 挂载目录 $ mount -t nfs 10.100.22.160:/home/data/nfs /home/client # 卸载目录 $ umount /home/client # 如果NFS Server宕机,需要强制卸载(umount:/mnt:device is busy) $ umount -lf /mnt
-
如果挂载出现错误,可以在服务端查看日志
$ cat /var/log/messages | grep mount
-
测试NFS
# 在客户端共享目录创建一个文件 $ cd /home/client && touch a.txt # 在服务端 $ cd /home/data/nfs && touch b.txt $ ll # 查看NFS的共享状态 $ showmount -e 10.100.22.160 Export list for 10.100.22.160: /home/data/nfs 10.100.22.0/24
客户端自动挂载
-
设置自动挂载方法一:缺点是可能偶尔开机挂载不上,除了开机自启动配置,还要对是否挂载进行监控。
$ chmod +x /etc/rc.local $ echo "#mount by oldboy" >> /etc/rc.local $ echo "/bin/mount -t nfs nfs 10.100.22.160:/home/data/nfs /home/client" >> /etc/rc.local $ tail -2 /etc/rc.local
-
设置自动挂载方法二:理论上开机启动过程中,fstab会优先于网络被Linux系统加载。网络没启动时执行fstab会导致连不上NFS服务器端,无法实现开机挂载。而且,即使是本地的文件系统,也要注意fstab中最后两列要设置0 0。否则有可能导致无法启动服务器的问题。因此,NFS网络文件系统最好不要放到fstab里实现开机挂载
$ vim /etc/fstab /dev/mapper/centos-root / xfs defaults 0 0 UUID=39bc8e0d-efbd-4915-ae40-83402394aedc /boot xfs defaults 0 0 /dev/mapper/centos-home /home xfs defaults 0 0 /dev/mapper/centos-swap swap swap defaults 0 0 # 末尾新增配置 10.100.22.160:/home/data/nfs /home/client nfs defaults 0 0 $ systemctl daemon-reload 查看 $ mount ...省略... 10.100.22.160:/home/data/nfs on /home/client type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.100.22.161,local_lock=none,addr=10.100.22.160) # 可以重启客户端,查看是否生效 $ reboot $ df -h |grep /home/client 10.100.22.160:/home/data/nfs 78G 357M 78G 1% /home/client
-
NFS服务端宕机后给NFS客户端带来的问题,NFS服务器宕机后,在客户端访问挂载点会处于挂掉状态,甚至早期系统执行Ctrl+C都无法退出,CentOS7客户端还可能无法重启,这个问题的解决方法有以下几种
-
在
cat /proc/mounts |grep nfs
找到挂载点,然后执行umount -lf /客户端目录
方式卸载即可 -
在mount挂载时增加soft或者intr,不让客户端持续呼叫NFS服务器。
-
如果是fstab里实现的挂载即可在第4列defaults后面增加soft或者intr
$ tail -2 /etc/fstab 10.100.22.160:/home/data/nfs /home/client nfs defaults,soft 0 0 #10.100.22.160:/home/data/nfs /home/client nfs defaults,intr 0 0
-
客户端优化
-
查看挂载配置
# 查看NFS服务器端配置参数的细节 $ cat /var/lib/nfs/etab /home/data/nfs 10.100.22.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,no_root_squash,no_all_squash) # 查看客户端mount的挂载参数细节 $ cat /proc/mounts |grep nfs sunrpc /var/lib/nfs/rpc_pipefs rpc_pipefs rw,relatime 0 0 10.100.22.160:/home/data/nfs /home/client nfs4 rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.100.22.161,local_lock=none,addr=10.100.22.160 0 0
-
mount参数说明
- fg/bg:默认[fg],在客户端执行挂载时,可以选择在前台(fg)执行还是在后台(bg)执行
- soft/hart:默认[hart]当网络和server出问题时,soft参数会在超时后停止挂载,hard参数会一直挂载直到成功(但可能造成客户端无响应,常配合intr参数使用)
- intr:当hard挂载资源timeout后,若使用intr参数可在超时后终端挂载,防止NFS锁死
- resize/wsize:读出和写入的区块大小,影响客户端与服务器段传输数据的缓冲存储量
- proto=tcp:默认[tcp]传输使用的协议,跨internet建议tcp有较好的纠错能力,内网建议用udp提高性能
-
挂载建议
noatime,nodiratime 减少更新访问时间戳产生的磁盘I/O.本地文件系统挂载时不能加odiratime选项,会报错 $ mount -t nfs -o noatime,nodiratime,intr,rsize=131072,wsize=131072 \ 10.100.22.160:/home/data/nfs /home/client
-
NFS内核优化
cat >>/etc/sysctl.conf<<EOF net.core.wmem_dafault = 8388608 net.core.rmem_dafault = 8388608 net.core.wmem_max = 16777216 net.core.rmem_max = 16777216 EOF sysctl -p
-
Linux NFS 客户端对于同时发起的NFS请求数量进行了控制,若该参数配置较小,会降低 IO 性能。默认系统为2,最大值为256。可以使用root用户执行以下命令来提高该参数的值,取得较好的性能。
$ echo "options sunrpc tcp_slot_table_entries=128" >> /etc/modprobe.d/sunrpc.conf $ echo "options sunrpc tcp_max_slot_table_entries=128" >> /etc/modprobe.d/sunrpc.conf $ sysctl -w sunrpc.tcp_slot_table_entries=128 $ cat /proc/sys/sunrpc/tcp_slot_table_entries