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_modedir_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 共享的兼容性问题和解决方案。在实际部署时,请根据具体环境调整配置参数。