Linux Samba 共享配置与故障排查指南

📋 文档概述

本文档记录了在 OpenEuler 服务器上配置 Samba 共享服务,并为 Ubuntu 11 客户端提供访问权限的完整过程。重点解决了 Samba 版本不兼容、服务启动失败和客户端连接问题。

🎯 环境信息

服务器端

  • 系统: OpenEuler
  • Samba 版本: 4.19.3
  • 共享目录: /backup/mysql_38_data_bak
  • 共享名称: mysql_backup
  • 访问用户: wcs(可读写访问)

客户端

  • 系统: Ubuntu 11
  • Samba 客户端版本: 3.5.8
  • 目标: 挂载服务器共享目录

📝 完整配置流程

第一阶段:服务器端 Samba 服务安装与配置

1.1 安装 Samba 软件包

# OpenEuler 系统
sudo dnf install samba samba-client samba-common

1.2 配置 Samba 共享

编辑配置文件 /etc/samba/smb.conf:

sudo nano /etc/samba/smb.conf

正确配置示例(注意注释格式):

[global]
    workgroup = WORKGROUP
    server string = Samba Server
    security = user
    map to guest = bad user

    # 兼容旧客户端的关键配置
    client min protocol = NT1
    server min protocol = NT1
    client max protocol = SMB3
    server max protocol = SMB3

[mysql_backup]
    comment = MySQL 38 Data Backup Directory
    path = /backup/mysql_38_data_bak
    browseable = yes
    writable = yes
    read only = no
    guest ok = yes
    # 允许匿名访问(如果需要密码访问改为 no)
    create mask = 0775
    directory mask = 0775
    force create mode = 0775
    force directory mode = 0775

⚠️ 重要提醒: - Samba 配置文件中不允许在参数值后面直接跟注释 - 错误示例:guest ok = yes # 这是注释(会导致服务启动失败) - 正确示例:guest ok = yes(注释单独一行)

1.3 设置目录权限

# 确保共享目录存在并有正确权限
sudo mkdir -p /backup/mysql_38_data_bak
sudo chmod 775 /backup/mysql_38_data_bak

# 或者设置专用用户组
sudo groupadd sambashare
sudo usermod -aG sambashare wcs
sudo chgrp sambashare /backup/mysql_38_data_bak

1.4 创建 Samba 用户(如需密码访问)

# 添加用户到 Samba(用户需已存在系统)
sudo smbpasswd -a wcs
# 输入两次 Samba 专用密码

# 启用用户
sudo smbpasswd -e wcs

第二阶段:Samba 服务启动与管理

2.1 OpenEuler 中的服务管理

# 检查可用服务
systemctl list-unit-files | grep -i samba

# 启动 NMB 服务(NetBIOS 名称服务)
sudo systemctl start nmb
sudo systemctl enable nmb

# 启动 SMB 服务(文件共享服务)
sudo systemctl start smb
sudo systemctl enable smb

2.2 服务启动失败排查

如果 smb 服务启动失败:

# 查看详细错误信息
journalctl -xeu smb.service
journalctl -u smb -f

# 常见错误:配置文件注释格式错误
# 错误信息示例:
# set_variable_helper(no # 允许匿名访问...): value is >

# 修复方法:确保注释单独成行

2.3 验证服务状态

# 检查服务运行状态
systemctl status smb
systemctl status nmb

# 检查进程
ps aux | grep -E "smbd|nmbd"

# 检查端口监听
netstat -tlnp | grep -E "139|445"

# 测试配置文件语法
sudo testparm

2.4 防火墙配置

# 开放 Samba 相关端口
sudo firewall-cmd --permanent --add-service=samba
sudo firewall-cmd --reload

# 或手动开放端口
sudo firewall-cmd --permanent --add-port=139/tcp
sudo firewall-cmd --permanent --add-port=445/tcp
sudo firewall-cmd --permanent --add-port=137/udp
sudo firewall-cmd --permanent --add-port=138/udp
sudo firewall-cmd --reload

第三阶段:客户端配置与连接

3.1 Ubuntu 客户端安装必要软件

# Ubuntu 11 等较旧系统
sudo apt-get update
sudo apt-get install smbclient cifs-utils

3.2 客户端连接测试

由于客户端 Samba 版本较旧(3.5.8),需要特殊处理:

# 方法1:指定协议版本(重要!)
smbclient -L //192.168.0.22 -U wcs -m NT1
# 或
smbclient -L //192.168.0.22 -U wcs -m SMB2

# 方法2:直接挂载测试
sudo mkdir -p /mnt/mysql_backup

# 尝试不同 SMB 版本
sudo mount -t cifs //192.168.0.22/mysql_backup /mnt/mysql_backup \
  -o username=wcs,password=密码,vers=1.0

# 或者
sudo mount -t cifs //192.168.0.22/mysql_backup /mnt/mysql_backup \
  -o username=wcs,password=密码,vers=2.0

3.3 永久挂载配置

编辑 /etc/fstab 文件:

sudo nano /etc/fstab

添加以下行(根据实际情况选择版本):

# 使用 SMBv1(最兼容旧客户端)
//192.168.0.22/mysql_backup  /mnt/mysql_backup  cifs  username=wcs,password=密码,vers=1.0,uid=1000,gid=1000,iocharset=utf8,file_mode=0775,dir_mode=0775  0  0

# 或使用凭据文件(更安全)
//192.168.0.22/mysql_backup  /mnt/mysql_backup  cifs  credentials=/etc/samba/credentials,vers=1.0,uid=1000,gid=1000  0  0

创建凭据文件:

sudo nano /etc/samba/credentials

内容:

username=wcs
password=你的密码

设置权限:

sudo chmod 600 /etc/samba/credentials

3.4 测试挂载

# 测试 fstab 配置
sudo mount -a

# 验证挂载
df -h | grep mysql_backup
ls -la /mnt/mysql_backup

🔧 故障排查指南

故障1:SMB 服务启动失败

症状:

systemctl start smb
# 提示:Job for smb.service failed because the control process exited with error code.

排查步骤: 1. 查看详细日志: bash journalctl -xeu smb.service

  1. 检查配置文件语法: bash sudo testparm

  2. 常见问题:行内注释格式错误

  3. ❌ 错误:guest ok = yes # 注释
  4. ✅ 正确:guest ok = yes(注释单独一行)

  5. 手动调试启动: bash sudo /usr/sbin/smbd -i -d 3

故障2:客户端连接失败(协议不兼容)

症状:

smbclient -L //服务器IP -U 用户名
# 提示:protocol negotiation failed: NT_STATUS_INVALID_NETWORK_RESPONSE

原因:客户端 Samba 版本太旧(如 3.5.8)与服务器版本(4.19.3)不兼容

解决方案:

  1. 服务器端配置(关键步骤): ini [global] client min protocol = NT1 # 支持最旧的 SMBv1 server min protocol = NT1 client max protocol = SMB3 server max protocol = SMB3

  2. 客户端指定协议版本: bash # 尝试不同协议 smbclient -L //IP -U user -m NT1 smbclient -L //IP -U user -m SMB2 smbclient -L //IP -U user -m SMB2_10

  3. 客户端挂载时指定版本: bash mount -t cifs //IP/share /mnt -o username=user,vers=1.0 mount -t cifs //IP/share /mnt -o username=user,vers=2.0

故障3:权限拒绝

排查步骤:

# 服务器端检查
1. 目录权限:ls -ld /backup/mysql_38_data_bak
2. SELinux 状态:sestatus
3. Samba 用户状态:sudo pdbedit -L

# 临时关闭 SELinux 测试
sudo setenforce 0

故障4:挂载成功但无法写入

检查: 1. 共享配置中的 writable = yes 2. 目录的 Linux 文件系统权限 3. 挂载选项中的 file_mode 和 dir_mode

📊 快速诊断命令集

服务器端诊断

# 服务状态
systemctl status smb nmb

# 端口监听
netstat -tlnp | grep -E "139|445"

# 活动连接
sudo smbstatus

# 配置验证
sudo testparm -s

# 日志查看
tail -f /var/log/samba/log.smbd

客户端诊断

# 网络连通性
telnet 服务器IP 445
telnet 服务器IP 139

# 共享发现
nmblookup -A 服务器IP

# 协议测试
for ver in NT1 SMB2 SMB2_10 SMB2_22 SMB3; do
    echo "测试 $ver:"
    smbclient -L //IP -U user -m $ver 2>&1 | grep -i "domain\|failed"
done

# 挂载测试
mount -t cifs //IP/share /mnt/test -o username=user,vers=1.0,password=pass

✅ 配置检查清单

服务器端

  • [ ] Samba 软件包已安装
  • [ ] /etc/samba/smb.conf 配置正确(无行内注释)
  • [ ] 共享目录存在且有正确权限
  • [ ] 防火墙端口已开放(139/tcp, 445/tcp, 137-138/udp)
  • [ ] Samba 用户已创建并启用(如需密码访问)
  • [ ] 协议兼容性配置已添加(针对旧客户端)
  • [ ] 服务已启动并运行正常

客户端

  • [ ] Samba 客户端工具已安装
  • [ ] 网络连通性正常
  • [ ] 使用正确的协议版本连接
  • [ ] 挂载点目录已创建
  • [ ] 凭据信息正确

🔄 维护与监控

日常维护命令

# 查看活动连接和文件锁
sudo smbstatus

# 查看共享使用情况
sudo smbstatus -S

# 重新加载配置(无需重启服务)
sudo smbcontrol smbd reload-config

# 查看日志
sudo tail -f /var/log/samba/log.*

性能监控

# 实时监控连接
watch -n 5 'smbstatus | head -20'

# 监控 I/O 性能
iostat -x 5 | grep -A1 "Device"

⚠️ 安全注意事项

  1. SMBv1 安全风险:
  2. NT1(SMBv1)协议存在安全漏洞
  3. 仅在必要时为旧客户端启用
  4. 考虑升级客户端系统或使用其他共享方式

  5. 密码安全:

  6. 避免在命令行或 fstab 中明文存储密码
  7. 使用凭据文件并设置 600 权限
  8. 定期更改 Samba 密码

  9. 访问控制:

  10. 最小权限原则
  11. 使用 IP 限制(hosts allow / hosts deny)
  12. 定期审计访问日志

📚 附录

Samba 协议版本对应关系

  • NT1: SMBv1(Windows NT 4.0)
  • SMB2: SMBv2(Windows Vista/Server 2008)
  • SMB2_02: SMBv2.02
  • SMB2_10: SMBv2.1(Windows 7/Server 2008 R2)
  • SMB3: SMBv3(Windows 8/Server 2012)

常见错误代码

  • NT_STATUS_ACCESS_DENIED: 权限不足
  • NT_STATUS_BAD_NETWORK_NAME: 共享名错误
  • NT_STATUS_LOGON_FAILURE: 认证失败
  • NT_STATUS_INVALID_NETWORK_RESPONSE: 协议不匹配

参考资料

  • Samba 官方文档:https://www.samba.org
  • man smb.conf - Samba 配置文件手册
  • man mount.cifs - CIFS 挂载选项手册

文档版本: 1.0
最后更新: 2026-01-09
适用环境: OpenEuler + Ubuntu 11(或其他旧版 Linux)
维护者: 金石艾特技术团队


提示:本文档基于实际故障解决过程编写,重点记录了跨版本 Samba 共享的兼容性问题和解决方案。在实际部署时,请根据具体环境调整配置参数。