什么是 SMB?为什么选它?
先简单科普下,SMB(Server Message Block) 是一种网络文件共享协议,最开始是微软为 Windows 系统开发的,后来被广泛支持。简单说,它能让不同操作系统的设备在局域网内像访问本地文件一样访问远程服务器的共享目录。
选择 SMB 的核心原因:
- 兼容性强:Windows 原生支持,Mac 和 Linux 也能轻松对接,不用给不同系统的用户单独培训
- 配置相对简单:相比 NFS 的复杂权限管理,SMB 对新手更友好
- 功能全面:支持用户认证、权限控制、文件锁等,满足团队共享的基本需求
环境准备与基础安装
我用的服务器是CentOS 7.9,配置 4 核 8G 内存 + 500G 硬盘,对于几十人的小团队完全够用。
安装 Samba 服务
Samba 是 Linux 系统上实现 SMB 协议的工具包,直接用 yum 安装即可:
# 先更新系统包
yum update -y
# 安装Samba主程序、客户端和通用工具
yum install -y samba samba-client samba-common
启动服务并设置开机自启
systemctl start smb # 启动SMB服务
systemctl start nmb # 启动NetBIOS名称服务(用于网络发现,很重要!)
systemctl enable smb # 设置开机自启
systemctl enable nmb
这里插一句:很多人容易漏掉nmb服务,虽然不是必须的,但启动后其他设备能在 "网络邻居" 里直接看到服务器,用起来方便很多。
Samba 配置文件详解
Samba 的主配置文件是/etc/samba/smb.conf,建议先备份再修改:
cp /etc/samba/smb.conf /etc/samba/smb.conf.bak
配置文件分两部分:全局配置和共享目录配置,下面是我实战过的可用配置。
全局配置
[global]
workgroup = WORKGROUP # 工作组名称,Windows默认是WORKGROUP
server string = File Server # 服务器描述,随便起
netbios name = FILESERVER # 网络可见的服务器名
security = user # 认证模式:用户密码认证(最常用)
map to guest = bad user # 未知用户映射为访客
dns proxy = no # 关闭DNS代理
log file = /var/log/samba/log.%m # 日志文件路径,%m表示客户端主机名
max log size = 1000 # 日志最大1000KB
server role = standalone server # 独立服务器模式
passdb backend = tdbsam # 密码数据库类型
关键参数说明:
- security = user:必须验证用户名密码才能访问
- map to guest = bad user:当输入不存在的用户名时,自动作为访客登录(适合公共目录)
共享目录配置
我创建了 3 个不同用途的共享目录,分别对应 "公共读写"、"私有访问" 和 "匿名上传" 场景,大家可以根据需求调整。
1. 先创建目录并设置权限
# 创建目录
mkdir -p /srv/samba/public # 公共目录
mkdir -p /srv/samba/private # 私有目录(仅指定用户访问)
mkdir -p /srv/samba/upload # 上传目录(所有人可写)
# 设置权限(重要!否则可能出现访问权限问题)
chmod 755 /srv/samba/public # 读权限开放,写权限仅属主
chmod 750 /srv/samba/private # 仅属主和组内用户可访问
chmod 777 /srv/samba/upload # 所有人可读写(适合临时上传)
2. 在 smb.conf 中添加共享配置
# 公共共享(任何人可访问,可读写)
[public]
comment = Public Share # 共享描述
path = /srv/samba/public # 实际目录路径
browseable = yes # 在网络中可见
writable = yes # 允许写入
guest ok = yes # 允许访客访问
create mask = 0644 # 新文件默认权限
directory mask = 0755 # 新目录默认权限
# 私有共享(仅指定用户可访问)
[private]
comment = Private Share
path = /srv/samba/private
browseable = yes
writable = yes
guest ok = no # 禁止访客访问
valid users = smbuser1, smbuser2 # 允许访问的用户
create mask = 0640
directory mask = 0750
# 上传目录(匿名可上传,适合临时文件交换)
[upload]
comment = Upload Directory
path = /srv/samba/upload
browseable = yes
writable = yes
guest ok = yes
create mask = 0666
directory mask = 0777
配置完后用testparm命令检查语法是否正确,有错误会提示具体位置。
用户管理:Samba 用户与系统用户的区别
Samba 的用户管理有点特殊:必须先创建系统用户,再添加为 Samba 用户(两者密码独立)。
创建系统用户(仅用于 Samba 认证,禁止登录系统)
# -M:不创建家目录;-s /sbin/nologin:禁止登录系统
useradd -M -s /sbin/nologin smbuser1
useradd -M -s /sbin/nologin smbuser2
useradd -M -s /sbin/nologin smbguest # 访客用户
设置 Samba 密码
smbpasswd -a smbuser1 # 为用户添加Samba密码(会提示输入两次)
smbpasswd -a smbuser2
smbpasswd -a smbguest
# 如果需要禁用某个用户,用:smbpasswd -d 用户名
# 启用用户:smbpasswd -e 用户名
注意:Samba 密码和系统用户密码是两回事,就算系统用户没密码,也必须设置 Samba 密码才能登录。
防火墙与 SELinux 配置
新手搭建时经常遇到 "服务器能 ping 通,但连接不上共享" 的问题,大概率是防火墙或 SELinux 限制了访问。
防火墙配置
# 允许Samba服务通过防火墙(永久生效)
firewall-cmd –permanent –add-service=samba
# 重新加载防火墙规则
firewall-cmd –reload
如果用的是 iptables,需要手动开放端口:
iptables -A INPUT -p tcp –dport 139 -j ACCEPT # SMB协议端口
iptables -A INPUT -p tcp –dport 445 -j ACCEPT
iptables -A INPUT -p udp –dport 137 -j ACCEPT # NetBIOS端口
iptables -A INPUT -p udp –dport 138 -j ACCEPT
SELinux 配置
# 允许Samba访问目录(-P表示永久生效)
setsebool -P samba_enable_home_dirs on
setsebool -P samba_export_all_rw on
# 如果共享目录不在默认路径(如/srv/samba),需要设置SELinux上下文
semanage fcontext -a -t samba_share_t "/srv/samba(/.*)?"
restorecon -R /srv/samba # 应用上下文设置
我当初在这里卡了半小时,一直提示 "权限被拒绝",最后发现是 SELinux 没配置好,大家一定要重视这一步!
多平台连接 SMB 共享的方法
Windows 系统连接
方法 1:通过文件资源管理器
方法 2:映射为网络驱动器
常见问题:
- Windows 10/11 连接失败:默认禁用了 SMB1 协议,需在 Samba 配置中添加 min protocol = SMB2 和 max protocol = SMB3
- 找不到网络路径:先 ping 服务器 IP,再检查 445 端口是否开放(telnet 服务器IP 445)
Mac 系统连接
方法 1:通过 Finder
方法 2:命令行挂载
# 创建挂载点
sudo mkdir /Volumes/smbshare
# 挂载共享(替换用户名、密码、IP和共享名)
sudo mount -t smbfs //smbuser1:密码@192.168.1.100/public /Volumes/smbshare
# 卸载:sudo umount /Volumes/smbshare
常见问题:
- 中文文件名乱码:在 Samba 配置中添加 unix charset = UTF-8 和 dos charset = CP936
- 连接速度慢:连接时指定协议版本,如 smb://192.168.1.100/public?protocol_vers_map=7
Linux 系统连接
需要先安装客户端工具:
# CentOS/RHEL
yum install -y samba-client cifs-utils
# Ubuntu/Debian
apt-get install -y smbclient cifs-utils
方法 1:用 smbclient
# 列出服务器共享
smbclient -L //192.168.1.100 -U smbuser1
# 连接共享(输入密码后进入交互模式)
smbclient //192.168.1.100/public -U smbuser1
交互模式常用命令:ls(列文件)、get 文件名(下载)、put 文件名(上传)、exit(退出)
方法 2:挂载为本地目录
# 创建挂载点
sudo mkdir /mnt/smbshare
# 挂载(安全起见,建议用凭据文件,避免密码明文)
sudo mount -t cifs //192.168.1.100/public /mnt/smbshare -o username=smbuser1
创建凭据文件:
sudo vim /etc/samba/credentials # 内容如下:
username=smbuser1
password=你的密码
domain=WORKGROUP
# 设置权限(仅root可见)
sudo chmod 600 /etc/samba/credentials
# 用凭据文件挂载
sudo mount -t cifs //192.168.1.100/public /mnt/smbshare -o credentials=/etc/samba/credentials
方法 3:开机自动挂载
编辑/etc/fstab添加一行:
//192.168.1.100/public /mnt/smbshare cifs credentials=/etc/samba/credentials,uid=1000,gid=1000,iocharset=utf8 0 0
uid 和 gid 替换为你的用户 ID,用id命令查看)
故障排除小技巧
遇到连接问题时,按以下步骤排查:
不同平台的典型问题:
- Windows:清除凭据管理器中的旧记录(控制面板 → 凭据管理器)
- Mac:重启 Finder(killall Finder)或清除 Keychain 中的密码
- Linux:检查 SELinux 状态(getenforce),必要时临时关闭(setenforce 0)测试
总结
SMB 确实是多平台文件共享的优选方案,配置不算复杂,但细节很多(尤其是权限和安全设置)。搭建完成后,团队内的 Windows、Mac、Linux 用户都能轻松访问共享文件,效率提升不少。
我的经验是:多测试、多记录。不同系统的行为差异可能超出预期,遇到问题先查日志,大部分坑都能通过搜索引擎解决。另外,把配置和连接方法整理成文档发给团队,能减少很多后续的支持工作。
如果大家在搭建过程中遇到特殊问题,欢迎留言讨论,一起踩坑一起进步!
评论前必须登录!
注册