NFS离线部署

NFS 服务端 + 客户端离线部署

内网环境,几台机器都不通外网,rpm 包提前在外面下好拷进来的。NAS 那台和客户端都是 RHEL 7.9,用的包版本和 CentOS 7.9.2009 base 源一致,两边通用。

涉及机器:

  • NAS 服务端:10.2.200.117
  • 客户端:10.2.200.113

0. 离线包

服务端和客户端装的是同一份包,拷到每台机器的 /root/nfs_rpm 下:

复制代码
nfs-utils-1.3.0-0.68.el7.x86_64.rpm
rpcbind-0.2.0-49.el7.x86_64.rpm
libtirpc-0.2.4-0.16.el7.x86_64.rpm
libnfsidmap-0.25-19.el7.x86_64.rpm
keyutils-1.5.8-3.el7.x86_64.rpm
keyutils-libs-1.5.8-3.el7.x86_64.rpm
nfs4-acl-tools-0.3.3-21.el7.x86_64.rpm

包来源:CentOS 7.9.2009 base 源(阿里云镜像),和 RHEL 7.9 兼容。nfs4-acl-tools 是客户端查 NFSv4 ACL 用的,服务端可以不装。

装包用 yum localinstall,让它自己处理包与包之间的依赖:

复制代码
yum localinstall -y /root/nfs_rpm/*.rpm

哪台机器连 yum 都没有、或者 localinstall 报源有问题,退一步用 rpm:

复制代码
rpm -Uvh /root/nfs_rpm/*.rpm  --nodeps --force

注意:nfs-utils 还依赖 glibc、libcap、libuuid、krb5-libs 这些基础库,正常 RHEL 7.9 最小化安装都自带;万一报缺,从机器已有的 base 源里补。

1. 服务端(NAS,10.2.200.117)

1.1 建共享目录

先想好要共享哪个目录,比如新建一个:

复制代码
mkdir -p /data/nas

1.2 配置 exports

编辑 /etc/exports,加一行:

复制代码
/data/nas 10.2.200.0/24(rw,sync,no_root_squash)

字段意思:

  • 10.2.200.0/24:允许挂载的网段,只给单台就写 10.2.200.113/32
  • rw:读写;sync:数据落盘;no_root_squash:客户端的 root 保持 root 权限(内网自己人无所谓,对外别开这个)

改完加载:

复制代码
exportfs -rv

1.3 固定 NFS 相关端口

NFSv3 的 mountd、statd 默认用随机高位端口,防火墙没法放。编辑 /etc/sysconfig/nfs,把下面几行前面的 # 去掉:

复制代码
MOUNTD_PORT=892
STATD_PORT=662
RQUOTAD_PORT=875

RQUOTAD_PORT 没有就算了,那是配额服务用的,不是每台机器都有,挂载也用不上。关键的只有 MOUNTD_PORT。

1.4 启动服务

复制代码
systemctl enable --now rpcbind nfs-server nfs-lock nfs-idmap

如果是在 1.3 之后改过 /etc/sysconfig/nfs,要先重启 rpcbind 再重启 nfs-server,否则注册的还是旧端口:

复制代码
systemctl restart rpcbind
systemctl restart nfs-server

1.5 防火墙

确认 firewalld 在跑,然后放行:

复制代码
systemctl status firewalld
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=mountd
firewall-cmd --permanent --add-service=statd
firewall-cmd --reload

这几个服务名对应的端口:rpc-bind=111,nfs=2049,mountd=892,statd=662。没装 firewalld、用 iptables 的机器,手动开对应端口:

复制代码
iptables -I INPUT -p tcp --dport 111 -j ACCEPT
iptables -I INPUT -p udp --dport 111 -j ACCEPT
iptables -I INPUT -p tcp --dport 2049 -j ACCEPT
iptables -I INPUT -p tcp --dport 892 -j ACCEPT
iptables -I INPUT -p udp --dport 892 -j ACCEPT
service iptables save

1.6 SELinux

RHEL7 默认 SELinux 是 Enforcing,导出非标准目录会被拦。先看状态:

复制代码
getenforce

是 Enforcing 的话,放行导出:

复制代码
setsebool -P nfs_export_all_rw 1

1.7 服务端自检

复制代码
showmount -e localhost
rpcinfo -p localhost

showmount 能列出 /data/nas 就说明服务端好了。

2. 客户端(10.2.200.113)

2.1 装包

和上面一样:

复制代码
yum localinstall -y /root/nfs_rpm/*.rpm

2.2 启动客户端服务

复制代码
systemctl enable --now rpcbind
systemctl enable --now nfs-client.target

2.3 测试连通

先看 111 通不通,再列共享:

复制代码
rpcinfo -p 10.2.200.117
showmount -e 10.2.200.117
  • rpcinfo 通、showmount 报错:一般是 mountd 端口没放行(892),回服务端 1.5 步查
  • 都连不上:先 ping,再查防火墙是不是只开了 tcp 没开 udp

2.4 挂载

挂载点路径不是固定的,就是个空目录,建哪都行,习惯放 /mnt 下:

复制代码
mkdir -p /mnt/nas
mount -t nfs 10.2.200.117:/data/nas /mnt/nas

验证:

复制代码
df -h | grep nas
ls /mnt/nas

需要加挂载参数(超时、NFSv4 等)时:

复制代码
mount -t nfs -o rw,hard,timeo=600,retrans=2,noatime 10.2.200.117:/data/nas /mnt/nas
mount -t nfs4 10.2.200.117:/data/nas /mnt/nas

2.5 开机自动挂载

写进 /etc/fstab,挂载点要和上面实际建的一致:

复制代码
10.2.200.117:/data/nas  /mnt/nas  nfs  defaults,_netdev,nofail  0 0

_netdev 等网络起来再挂,nofail 挂不上也不影响开机。加完验证一下配置:

复制代码
mount -a

3. 卸载

复制代码
umount /mnt/nas

4. 排障记录

  • showmount 报 no route to host / Port mapper failure:先 ping。通的话查 NAS 防火墙 111 有没有放 tcp+udp 两个;不通的话查 IP 和网段
  • rpcinfo 通,showmount 空或报错:mountd 端口被挡。要么固定 MOUNTD_PORT=892 后放行 892,要么看 rpcinfo -p 里 mountd 当前端口直接放那个
  • 挂载卡住不动:2049 没放行,或两端版本协商有问题,用 dmesg 看报错
  • Permission denied:exports 里没允许这台客户端的 IP,或者共享路径写错
  • SELinux 拦截:setsebool -P nfs_export_all_rw 1 后重试
相关推荐
小羊没烦恼!3 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里3 天前
java中的继承和多态的区别
java
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
譕痕3 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖3 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时3 天前
01-06-A-JVM排查实战详解
java·jvm
vipxieliang3 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
ba_pi3 天前
mysql 查询所有表名并授权
java
ProcessOn官方账号3 天前
java函数式编程--入门基础
java·编程·函数式编程