16. 网络文件系统与共享
本章介绍 RHEL 9 上 NFS 和 Samba 两种主流网络文件共享服务的完整配置:服务端与客户端部署、权限与 SELinux 上下文配置、防火墙规则,以及 /etc/fstab 永久挂载。NFS 用于 Linux/Unix 节点间的高效共享,Samba 用于与 Windows 客户端的跨平台共享,两者适用场景互补,共同构成企业网络存储共享体系。
本章环境说明
本章将 linuxdc(192.168.1.100)同时作为 NFS 和 Samba 的服务端进行配置演示。客户端操作以同网段主机(192.168.1.101)为例;若无第二台主机,可在 linuxdc 本机回环地址执行客户端命令进行验证。
16.1 前提条件
- 已完成磁盘与存储管理配置(第 15 章),
/data/disk1已挂载(XFS 分区)。 - 通过 SecureCRT(SSH 端口 2222)以
ops用户、密钥认证方式登录192.168.1.100,执行sudo -i切换至 root 环境。 - SELinux 处于 Enforcing 模式(第 12 章),firewalld 已启用。
- 官方仓库已启用(第 7 章)。
本章全局参数
| 参数 | 值 |
|---|---|
| 服务端主机名 / IP | linuxdc / 192.168.1.100 |
| 客户端 IP | 192.168.1.101 |
| 允许访问网段 | 192.168.1.0/24 |
| NFS 共享目录 | /data/nfs_share |
| Samba 共享目录 | /data/samba_share |
| Samba 共享组 | smbgroup |
| Samba 访问用户 | sambauser |
16.2 NFS 配置
NFSv4 是 RHEL 9 默认版本,基于 TCP,安全性和性能均优于 NFSv3,是 Linux 集群节点间文件共享的首选协议。
16.2.1 NFS 服务端配置
第一步:安装并启动服务
dnf install -y nfs-utils
systemctl enable --now nfs-server
systemctl status nfs-server
第二步:准备共享目录
mkdir -p /data/nfs_share
# nfsnobody 是 NFS 匿名访问的默认映射账户(root_squash 模式)
chown -R nobody:nobody /data/nfs_share
chmod 755 /data/nfs_share
第三步:配置导出规则
vim /etc/exports
添加:
# 允许 192.168.1.0/24 网段以读写方式挂载,同步写入
/data/nfs_share 192.168.1.0/24(rw,sync,no_subtree_check)
导出参数说明:
| 参数 | 含义 |
|---|---|
rw |
读写权限 |
ro |
只读权限 |
sync |
同步写入(数据安全,性能略低) |
async |
异步写入(性能高,断电可能丢数据) |
no_subtree_check |
禁用子树检查(提升性能,减少竞争条件) |
root_squash |
将客户端 root 映射为 nfsnobody(默认启用,安全推荐) |
no_root_squash |
保留客户端 root 权限(仅受信任环境使用) |
all_squash |
所有客户端用户映射为 nfsnobody(公共只读共享) |
应用导出配置:
exportfs -arv
# 查看当前生效的导出列表
exportfs -s
第四步:配置 SELinux(Enforcing 模式下必须执行)
# 允许 NFS 导出读写
setsebool -P nfs_export_all_rw on
setsebool -P nfs_export_all_ro on
# 若共享目录不在默认 NFS 路径,需手动设置文件上下文
semanage fcontext -a -t nfs_t "/data/nfs_share(/.*)?"
restorecon -Rv /data/nfs_share
# 验证上下文
ls -lZ /data/nfs_share
第五步:配置防火墙
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=mountd
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --reload
firewall-cmd --list-services | grep -E "nfs|mountd|rpc"
验证服务端
showmount -e localhost
检查点
showmount -e localhost 输出应包含 /data/nfs_share 192.168.1.0/24。
16.2.2 NFS 客户端配置
在客户端主机(192.168.1.101)上执行:
# 安装客户端工具
dnf install -y nfs-utils
# 查看服务端导出列表(验证服务端可达)
showmount -e 192.168.1.100
# 创建挂载点
mkdir -p /mnt/nfs_share
# 临时挂载验证
mount -t nfs -o vers=4 192.168.1.100:/data/nfs_share /mnt/nfs_share
df -hT /mnt/nfs_share
# 验证读写权限
echo "NFS test" > /mnt/nfs_share/test.txt
cat /mnt/nfs_share/test.txt
永久挂载(写入 fstab):
cp /etc/fstab /etc/fstab.bak
vim /etc/fstab
追加:
192.168.1.100:/data/nfs_share /mnt/nfs_share nfs vers=4,defaults,_netdev 0 0
umount /mnt/nfs_share
mount -a
df -hT /mnt/nfs_share
_netdev 参数的必要性
_netdev 告知 systemd 此挂载依赖网络,须在 network.target 就绪后才尝试挂载。若缺少此参数,系统启动时可能因网络尚未就绪而挂载失败,严重时进入急救模式。NFS、CIFS 等所有网络文件系统挂载条目必须包含 _netdev。
16.3 Samba 配置
Samba 实现 SMB/CIFS 协议,使 RHEL 9 服务器能够与 Windows 客户端、macOS 及其他 Linux 客户端共享文件,是混合环境中不可或缺的跨平台共享方案。
16.3.1 Samba 服务端配置
第一步:安装并启动服务
dnf install -y samba samba-common samba-client
systemctl enable --now smb nmb
systemctl status smb nmb
smb 与 nmb 的分工
smb 提供 SMB/CIFS 文件共享服务(核心);nmb 提供 NetBIOS 名称解析服务(使 Windows 能通过计算机名访问共享)。生产中通常两者均启用。
第二步:准备共享目录
mkdir -p /data/samba_share
# 创建 Samba 专用组和系统账户
groupadd smbgroup
useradd -M -s /sbin/nologin -G smbgroup sambauser
# 设置目录权限(2770 = SGID + rwxrws---)
# SGID 确保新建文件继承所属组 smbgroup
chown -R root:smbgroup /data/samba_share
chmod 2770 /data/samba_share
# 验证权限
ls -ld /data/samba_share
第三步:设置 Samba 账户密码
Samba 维护独立的密码数据库,与系统 /etc/shadow 密码分离。
smbpasswd -a sambauser # 添加并设置 Samba 密码
smbpasswd -e sambauser # 启用账户
# 验证账户已添加
pdbedit -L
第四步:配置 smb.conf
# 备份原始配置
cp /etc/samba/smb.conf /etc/samba/smb.conf.orig
vim /etc/samba/smb.conf
在文件末尾追加以下共享节:
[samba_share]
comment = linuxdc Samba Share
path = /data/samba_share
valid users = @smbgroup
writable = yes
browseable = yes
create mask = 0660
directory mask = 0770
Samba 共享参数说明:
| 参数 | 含义 |
|---|---|
comment |
共享描述(浏览时显示) |
path |
共享目录路径 |
valid users |
允许访问的用户或组(@组名) |
writable |
是否可写 |
browseable |
是否在网络浏览中可见 |
create mask |
新建文件的权限掩码 |
directory mask |
新建目录的权限掩码 |
验证配置语法:
testparm
检查点
testparm 输出中无 ERROR,最后显示已加载的共享列表,包含 [samba_share]。
第五步:配置 SELinux
# 允许 Samba 导出读写
setsebool -P samba_enable_home_dirs on
setsebool -P samba_export_all_rw on
# 设置共享目录的 SELinux 文件上下文
semanage fcontext -a -t samba_share_t "/data/samba_share(/.*)?"
restorecon -Rv /data/samba_share
# 验证上下文(应显示 samba_share_t)
ls -lZ /data/samba_share
第六步:配置防火墙
firewall-cmd --permanent --add-service=samba
firewall-cmd --reload
firewall-cmd --list-services | grep samba
重启服务使配置全部生效:
systemctl restart smb nmb
本地验证服务端
smbclient //localhost/samba_share -U sambauser -L
16.3.2 Samba 客户端配置(Linux)
# 安装 CIFS 工具
dnf install -y cifs-utils
# 创建凭证文件(避免密码明文写入 fstab)
tee /etc/samba/linuxdc-creds << 'EOF'
username=sambauser
password=<sambauser的Samba密码>
domain=WORKGROUP
EOF
chmod 600 /etc/samba/linuxdc-creds
# 创建挂载点
mkdir -p /mnt/samba_share
# 临时挂载验证
mount -t cifs //192.168.1.100/samba_share /mnt/samba_share \
-o credentials=/etc/samba/linuxdc-creds,uid=ops,gid=ops
df -hT /mnt/samba_share
# 验证读写
echo "Samba test" > /mnt/samba_share/cifs_test.txt
cat /mnt/samba_share/cifs_test.txt
永久挂载(写入 fstab):
vim /etc/fstab
追加:
//192.168.1.100/samba_share /mnt/samba_share cifs credentials=/etc/samba/linuxdc-creds,uid=ops,gid=ops,_netdev 0 0
umount /mnt/samba_share
mount -a
df -hT /mnt/samba_share
16.4 NFS 与 Samba 选型对比
| 维度 | NFS | Samba |
|---|---|---|
| 协议标准 | NFSv4(TCP) | SMB3 / CIFS |
| 适用客户端 | Linux、Unix | Linux、Windows、macOS |
| 性能 | 高(原生 Linux 协议) | 中(协议转换有开销) |
| 权限模型 | Unix UID/GID 映射 | Windows ACL 兼容 |
| 传输加密 | 需额外配置(Kerberos/stunnel) | SMB3 原生支持 AES 加密 |
| 身份认证 | UID/GID 匹配(NFSv4 支持 Kerberos) | 独立账户数据库(NTLM/Kerberos) |
| 典型场景 | Linux 集群节点间共享 | 混合环境(Linux + Windows)共享 |
16.5 常见问题与排查
| 问题现象 | 排查步骤 |
|---|---|
NFS 挂载报 Permission denied |
ausearch -m avc -ts recent 检查 SELinux;exportfs -s 确认导出规则 |
| NFS 挂载超时 | ping 192.168.1.100 测试网络;firewall-cmd --list-services 确认防火墙 |
| Samba 认证失败 | pdbedit -L 确认用户已启用;smbpasswd sambauser 重置密码 |
| Samba 权限拒绝 | ls -lZ /data/samba_share 检查 SELinux 上下文;执行 restorecon -Rv |
| 启动时网络挂载失败 | 确认 fstab 条目含 _netdev;systemctl status remote-fs.target |
# NFS 诊断工具集
journalctl -u nfs-server -n 30
showmount -e localhost
exportfs -v
# Samba 诊断工具集
journalctl -u smb -n 30
testparm -s
smbstatus
16.6 实践任务
- 登录
linuxdc(SecureCRT 端口 2222,ops用户,密钥认证,sudo -i切换 root)。 -
完整配置 NFS 服务端(安装 → 创建目录 → 配置导出 → SELinux → 防火墙),验证:
showmount -e localhost -
在本机或客户端挂载 NFS,写入 fstab(含
_netdev),执行mount -a验证。 -
完整配置 Samba 服务端(安装 → 创建用户 → 配置 smb.conf → SELinux → 防火墙),验证:
testparm pdbedit -L -
使用凭证文件方式挂载 Samba 共享,测试读写,写入 fstab 持久化。
16.7 自测问题
Q1:NFS 执行了 exportfs -arv 但客户端仍报 Permission denied,最可能的原因是什么?
最常见原因是 SELinux 阻止了 NFS 服务访问共享目录。执行 ausearch -m avc -ts recent 查看拒绝记录,通常需要执行 setsebool -P nfs_export_all_rw on 并为非默认路径的共享目录设置正确的 nfs_t 类型上下文(semanage fcontext + restorecon)。
Q2:NFS 和 Samba 的 fstab 条目为什么都必须加 _netdev?
_netdev 告知 systemd 此挂载依赖网络,须在 network.target 之后才尝试挂载。若缺少,系统启动时可能在网络就绪前尝试挂载,导致挂载失败并进入急救模式,严重时需本地登录修复 fstab。
Q3:Samba 密码与 Linux 系统密码为何必须分开管理?
Samba 使用 NT Hash 格式存储密码(存于 /var/lib/samba/private/passdb.tdb),与 /etc/shadow 中的系统密码格式完全不同。Samba 需要 NT Hash 与 Windows NTLM 认证协议兼容,因此修改系统密码不会自动同步到 Samba 密码数据库,两者须通过 passwd 和 smbpasswd 分别管理。
16.8 章节总结
本章完成了 RHEL 9 上 NFS(Linux 原生高效共享)和 Samba(跨平台 Windows 兼容共享)的完整服务端与客户端配置,核心要点包括:SELinux 布尔值与文件上下文的协同配置、firewalld 服务规则的开放、fstab _netdev 参数的必要性,以及 Samba 独立密码管理机制。两种协议互为补充,共同构成企业级网络存储共享架构的核心,也为第 17 章的远程增量备份提供网络存储基础。