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 后重试