centos7 nfs安装

0 / 615

server端安装

  • 下载
#centos7自带了rpcbind,rpc监听在111端口。
yum -y install nfs-utils rpcbind
  • 配置
#创建配置文件
vim /etc/exports
cat /etc/exports
/data/hab_data	172.16.20.0/24(rw,no_root_squash,async,fsid=0)
#/data/hab_data 为共享目录
#再次修改后,执行exportfs –rv让配置立即生效
  • 启动server端
#启动顺序一定是rpcbind->nfs
systemctl start rpcbind.service
systemctl enable rpcbind.service
systemctl start nfs.service
systemctl enable nfs.service

权限说明

  • 1、普通用户

当设置all_squash时:访客时一律被映射为匿名用户(nfsnobody)

当设置no_all_squash时:访客被映射为服务器上相同uid的用户,因此在客户端应建立与服务端uid一致的用户,否则也映射为nfsnobody。root除外,因为root_suqash为默认选项,除非指定了no_root_squash

  • 2、root用户

当设置root_squash时:访客以root用户访问NFS服务端时,被映射为nfsnobody用户

当设置no_root_squash时:访客以root用户访问NFS服务端时,被映射为root用户。以其他用户访问时同样映射为对应uid的用户,因为no_all_squash是默认选项

选项说明
ro:共享目录只读
rw:共享目录可读可写
all_squash:所有访问用户都映射为匿名用户或用户组
no_all_squash(默认):访问用户先与本机用户匹配,匹配失败后再映射为匿名用户或用户组
root_squash(默认):将来访的root用户映射为匿名用户或用户组
no_root_squash:来访的root用户保持root帐号权限
anonuid=:指定匿名访问用户的本地用户UID,默认为nfsnobody(65534)
anongid=:指定匿名访问用户的本地用户组GID,默认为nfsnobody(65534)
secure(默认):限制客户端只能从小于1024的tcp/ip端口连接服务器
insecure:允许客户端从大于1024的tcp/ip端口连接服务器
sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性
async:将数据先保存在内存缓冲区中,必要时才写入磁盘
wdelay(默认):检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率
no_wdelay:若有写操作则立即执行,应与sync配合使用
subtree_check(默认) :若输出目录是一个子目录,则nfs服务器将检查其父目录的权限
no_subtree_check :即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率

以nfsuser(uid=1000)创建共享目录,参数默认rw

  • exportfs参数说明
-a 全部挂载或卸载 /etc/exports中的内容
-r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab
-u 卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录)
-v 输出详细的共享参数

client安装

  • 下载
yum install -y nfs-utils rpcbind
# 此处nfs-utils 只安装不启动,方便执行查看命令。
  • 启动
systemctl start rpcbind
systemctl enable rpcbind
  • 挂载
1,直接挂载
mount -t nfs -o nolock,intr,soft,retry=3,nfsvers=4,rsize=2048,wsize=2048,timeo=15 172.16.20.17:/data/hab_data /data
也可将挂载配置写入fstab文件中,与普通磁盘挂载一样,挂载时同样可以指定权限,只是类型为nfs。
2,autofs挂载
yum -y install autofs
vim /etc/auto.master
#添加一行
/-    /etc/auto.mount
vim /etc/auto.mount
#添加一行
/data -fstype=nfs,rw  172.16.20.17:/data/hab_data

#启动服务
systemctl start autofs 
systemctl enable autofs

故障

1. nfs只能挂载为nobody

同时修改服务端、客户端/etc/idmapd.conf中的Domain为一样的值,随后重启rpcidmapd服务,或重启所有服务

2. 客户端无法卸载nfs目录

umount.nfs4: /var/nfs: device is busy

执行fuser -km /var/nfs/,然后再执行umount

3. 卸载
sudo fuser -m -v -i -k /app/file
sudo umount /app/file
# 直接使用 umount /app/file 可能会报“Device is busy”错误。

4. 在网络或服务器不稳定的情况下时卸载
sudo umount -f -l -t nfs 172.16.20.17:/data/hab_data

客户端探测脚本

使用脚本定时探测后,如果服务器正常,则挂载;如果服务器异常,则卸载。

#!/bin/bash

# config

NFS_SERVER_IP="172.16.20.17"
NFS_SHARE_DIR="/data/hab_data"
NFS_SHARE_FULL_PATH="${NFS_SERVER_IP}:${NFS_SHARE_DIR}"

# 日志文件路径

LOG_PATH="/root/nfs.log"

# 本地挂载目录

LOCAL_MOUNT_PATH="/data/"

# 卸载

doUmount() {
 umount -f -l -t nfs ${NFS_SHARE_FULL_PATH} >>${LOG_PATH} 2>&1
 echo "卸载结果: $?" >>${LOG_PATH}
}

# 检测nfs 服务器状态

checkServerStatus() {
 exportList=$(showmount -e ${NFS_SERVER_IP} 2>>${LOG_PATH} )
 exportTargetCount=$(echo "${exportList}" | grep -c ${NFS_SHARE_DIR})
 if [ "${exportTargetCount}" -ge 1 ]; then
  return 0
 else
  echo "在showmount 结果中找不到指定目录,exportList:" "${exportList}" >>${LOG_PATH}
  return 1
 fi
}

# 挂载

doMount() {
 mount -t nfs -o rw,intr,soft,timeo=30,retry=3 ${NFS_SHARE_FULL_PATH} ${LOCAL_MOUNT_PATH} >>${LOG_PATH} 2>&1

 if [ $? -eq 0 ]; then
  echo "NFS [${NFS_SHARE_FULL_PATH}] 自动挂载成功" >>${LOG_PATH}
 else
  echo "NFS [${NFS_SHARE_FULL_PATH}] 挂载失败" >>${LOG_PATH}
 fi
}

# 检测并挂载

checkAndMount() {

 # 是否已经挂载
 shareCount=$(df -h | grep -c ${NFS_SHARE_FULL_PATH})
 if [ "${shareCount}" -ge 1 ]; then
  echo "NFS  [${NFS_SHARE_FULL_PATH}] 已挂载,无需重复挂载" >>${LOG_PATH}
 else
  doMount
 fi
}

main() {
 echo "NFS 检测开始:$(date +"%F %T")" >>${LOG_PATH}

 checkServerStatus
 # server 状态正常
 if [ $? -eq 0 ]; then
  checkAndMount
 else
  echo "请检查server运行情况" >>${LOG_PATH}
  doUmount
 fi

 echo "NFS 检测结束:$(date +"%F %T")" >>${LOG_PATH}
 exit 0
}

main