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 后重试
相关推荐
OH_TPC3 小时前
HarmonyOS APP开发---“滤镜大师“图像处理App,需要用到这个库
java·图像处理·华为·harmonyos·鸿蒙
imaol15 小时前
链表 -- 环链表
java·前端·链表
imaol15 小时前
链表 -- 双向链表
java·前端·链表
2601_963869955 小时前
【计算机毕业设计】基于Java的相框定制系统的设计与实现
java·开发语言·课程设计
于烛6 小时前
为什么hasNext() 对只有一个元素的集合返回 true?90%初学者都有的疑问
java
wuminyu7 小时前
JVM利用io_uring优化堆外内存性能原理剖析
java·linux·c语言·jvm·c++
imaol17 小时前
数据结构---队列
java·数据结构·算法
半亩码田7 小时前
【.NET新特性·第11篇】C# 14 字段属性:告别手写 backing field
java·c#·.net
JAVA面经实录9178 小时前
集合框架 (六)
java·开发语言