跳转至

16. 网络文件系统与共享

本章介绍 RHEL 9 上 NFS 和 Samba 两种主流网络文件共享服务的完整配置:服务端与客户端部署、权限与 SELinux 上下文配置、防火墙规则,以及 /etc/fstab 永久挂载。NFS 用于 Linux/Unix 节点间的高效共享,Samba 用于与 Windows 客户端的跨平台共享,两者适用场景互补,共同构成企业网络存储共享体系。

本章环境说明

本章将 linuxdc192.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 条目含 _netdevsystemctl 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 实践任务

  1. 登录 linuxdc(SecureCRT 端口 2222,ops 用户,密钥认证,sudo -i 切换 root)。
  2. 完整配置 NFS 服务端(安装 → 创建目录 → 配置导出 → SELinux → 防火墙),验证:

    showmount -e localhost
    
  3. 在本机或客户端挂载 NFS,写入 fstab(含 _netdev),执行 mount -a 验证。

  4. 完整配置 Samba 服务端(安装 → 创建用户 → 配置 smb.conf → SELinux → 防火墙),验证:

    testparm
    pdbedit -L
    
  5. 使用凭证文件方式挂载 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 密码数据库,两者须通过 passwdsmbpasswd 分别管理。


16.8 章节总结

本章完成了 RHEL 9 上 NFS(Linux 原生高效共享)和 Samba(跨平台 Windows 兼容共享)的完整服务端与客户端配置,核心要点包括:SELinux 布尔值与文件上下文的协同配置、firewalld 服务规则的开放、fstab _netdev 参数的必要性,以及 Samba 独立密码管理机制。两种协议互为补充,共同构成企业级网络存储共享架构的核心,也为第 17 章的远程增量备份提供网络存储基础。