Linux【6】-硬盘管理4-2-NFS的部署

NFS(Network File System)可以方便地将计算机上的指定文件夹共享给网络上的其它计算机。

NFS 至少有两个主要部分: 一台服务器和一台(或者更多)客户机。客户机 远程访问存放在服务器上的数据。

一、服务端(master服务器)

1.安装相应的软件

yum install -y nfs_utils
yum install rpcbind (系统默认已经有了,可查看下)

2.创建文件夹

例如准备将 /share 目录共享

# mkdir /share
# chmod 1777 /share

3.修改配置文件

通过修改配置文件 /etc/exports 来共享指定的文件夹。在该配置文件中添加以下一行内容(容许可以访问的ip地址,以及其权限):

/share	192.168.30.0/24(rw,sync,no_root_squash,no_subtree_check)  
/share	192.168.30.2/24(rw,sync,no_root_squash,no_subtree_check)
/share	192.168.30.3/255(rw,sync,no_root_squash,no_subtree_check)
/share	192.168.30.4/255(rw,sync,no_root_squash,no_subtree_check)

如果修改了/etc/exports,则需要systemctl restart nfs 来使其生效

当前主机的IP是192.168.30.1,以上配置信息表示将当前主机的 /share 目录共享给同一个局域网内指定IP段的计算机(上面是指定给192.168.30.0可以访问192.168.30.1的share文件),且其权限如下:

rw
  可读可写。
ro
  只读。
sync
  将数据同步写入到内存和磁盘中。
async
  将数据会先暂存于内存中,必要时才写入磁盘。
no_root_squash
  若客户端使用root用户操作共享文件夹的时候,具有最大权限。
root_squash(默认)
  若客户端使用root用户操作共享文件夹的时候,将其身份设定成匿名用户nfsnobody,降低权限。
no_all_squash(默认)
  访问用户先与本机用户匹配,匹配失败后再映射为匿名用户或用户组。
all_squash
  客户端的使用者用户统一被转换成匿名用户nfsnobody。
subtree_check (默认)
  若输出目录是一个子目录,则nfs服务器将检查其父目录的权限。
no_subtree_check
  即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率。

4.固定端口

固定端口nfs 2049、portmapper111 另外3个服务端口可设置为mountd 892、rquotad 875、 nlockmgr 32803、32769

由于NFS服务的目的是能对多台服务端计算机共享nfs服务器的指定目录,它需要随机取用多个小于1024的端口来传输数据。而这些端口的开放是不固定的,为了让客户端能连接上正确的端口,则需要开启nfs服务的同时开启RPC(Remote Procedure Call)服务。

具体配置:

修改/etc/sysconfig/nfs文件,将下列内容的注释去掉,如果没有则添加:

RQUOTAD_PORT=875
LOCKD_TCPPORT=32803
LOCKD_UDPPORT=32769
MOUNTD_PORT=892

5.设置防火墙

#portmap:111 #nfsd:2049 #rquotad:875 #mountd:892 #lockd:32803/tcp 32769 /udp

firewall-cmd --zone=public --add-port=111/tcp --add-port=111/udp --add-port=2049/tcp --add-port=2049/udp--add-port=875/tcp --add-port=875/udp --add-port=892/tcp --add-port=892/udp--add-port=32803/tcp --add-port=32769/udp --permanent

如果哪天要移除的话:

firewall-cmd --zone=public --remove-port=111/tcp--remove-port=111/udp --remove-port=2049/tcp --remove-port=2049/udp --remove-port=875/tcp--remove-port=875/udp --remove-port=892/tcp --remove-port=892/udp --remove-port=32803/tcp--remove-port=32769/udp --permanent

重启服务:

firewall-cmd --reload

6.启动服务

systemctl start rpcbind 
systemctl start nfs

设置开机启动:

systemctl enable rpcbind
systemctl enable nfs-server.service

查看服务状态:

netstat -lt

如果出现如下内容则配置成功

tcp       0      0 *:nfs                   *:*                     LISTEN  

二、客户端的配置

安装:

yum install -y nfs_utils
yum install rpcbind

启动服务:

systemctl start rpcbind  #centos6.5 #service rpcbind start
systemctl start nfs   #centos6.5 #service nfs start
systemctl enable rpcbind  #centos6.5 #chkconfig rpcbind on
systemctl enable nfs-server.service  #centos6.5 #chkconfignfs on    查看#chkconfig --list

挂载:

mount -t nfs 192.111.134.1:/usr/nfsShare /usr/test

查看客户端/usr/test是否已经挂载成功

设置开机自动挂载

vi /etc/fstab

添加:

192.111.134.1:/usr/nfsShare /usr/test nfs  defaults 0 0

其他:​

关闭挂载:umount /usr/shareNFS nfs

三、NFS相关

1.查看nfs版本

服务器端使用:

nfsstat -s

客户端使用:

nfsstat  -c

四、报错

1. nfs4_reclaim_open_state: Lock reclaim failed

方法一 (未验证)

这个报错的原因是啥,我到现在也没搞定,有可能是内核的冲突。反正重启电脑了,这个问题就暂时不存在了。在网上搜到一个版本,不知道好不好使,先放在这,下次遇到的时候,可以试一下。

vim /etc/fstab

将

nfsserverip:/export/homes   /home       nfs  rw      0 0
Changed to:

改成:

nfsserverip:/export/homes   /home       nfs  nfsvers=3,rw      0 0

方法二(暂时好使)

NFS 的默认传输协议是 UDP,在一些特定的情况下网络不好,或者传输文件较大时会出现这种情况。原因可能是和服务端网卡传输速率冲突,使得目标机需要大量时间复制大量数据包。

fuser -m -v -k /data/ # kill掉进程,再unmount
umount /data/
mount -t nfs -o tcp,nolock id地址:/data/ /data/

3.挂载的硬盘非常卡,都没法使用ll 等命令

查看nfS的配置跟其他的几点是否一致:

grep nfs /proc/mounts

未找到原因,将NFS的协议从4改到3,已解决

mount -t nfs -o tcp,nolock,vers=3  ***:/test /mnt/nfs

4.解决mount时发生错误wrong fs type, bad option, bad superblock

centos中安装nfs-utils:

yum install nfs-utils

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn