简介:这份资源面向需要在 Windows 与 Linux/Unix 之间搭建文件与打印共享环境的运维人员和嵌入式开发者,核心是 Samba 3.0 的安装包与配套工具,同时包含 SAM-BA 微控制器烧录辅助程序,可用于固件更新与硬件调试。压缩包共 89 个文件,约 23.62MB,以 html 文档、dll 动态库、qml 界面描述文件为主,另有 txt 说明、bin 固件、js 脚本、exe 主程序及 conf 配置示例,覆盖程序运行、界面渲染与文档查阅等用途。目前已有 734 人学习下载。通过包内文档与配置示例,读者可理解 smb.conf 的共享权限、用户访问控制与 NTLMv2 身份验证等设置,掌握将 Linux 服务器接入 Windows 网络、提供文件与打印机共享的方法,并借助 SAM-BA 工具完成设备连接与固件烧录,适合作为跨平台共享与嵌入式调试的参考材料。
1. Samba 3.0:老版本为什么还在生产环境里跑
一台跑了十几年的老业务系统,前端是 Windows 客户端,后端是某台 Linux 服务器,中间靠 SMB 协议共享目录读写文件。运维想升级,发现新版本 Samba 在这套环境里认证过不去,回退到 Samba 3.0 反而一切正常。这不是段子,是我这两年帮人排查共享目录问题时反复遇到的场景。Samba 3.0 发布于 2003 年前后,它实现了 SMB/CIFS 协议,让 Linux/Unix 主机能以文件服务器身份出现在 Windows 网络邻居里,核心能力是共享目录、用户认证、打印服务和域控模拟。今天还在用它的人,多半是被老客户端、老应用或老认证方式绑住了。这篇笔记不讲历史,只讲怎么把它跑起来、参数怎么设、坑在哪,以及什么情况下该换、什么情况下继续用。
2. 把 Samba 3.0 跑起来:从编译到最小共享
2.1 为什么有人还在用 3.0 而不是 4.x
先说选型理由,不然读者会觉得这是开倒车。Samba 4.x 默认走 SMB2/SMB3,认证模型和 AD 域集成更现代,但代价是对老客户端兼容性收紧。一些基于 SMB1 的老应用、老扫描仪、老工控软件,在 4.x 上要么连不上,要么需要额外打开server min protocol = NT1这类降级开关,而 3.0 天生就是 SMB1 时代的产物,协议栈简单,行为可预测。
另一个现实原因是依赖。Samba 3.0 的编译依赖少,./configure一把过,不需要 Python、不需要 GnuTLS 新版本、不需要 LDAP 库。在一些内核和 glibc 都很老的发行版上,4.x 根本编不过,3.0 反而能跑。我一般会先问一句:客户端能不能改?能改就上 4.x,不能改再考虑 3.0。这个判断顺序很重要,别一上来就装老版本。
2.2 源码编译的最小命令序列
假设你拿到的是samba-3.0.x.tar.gz,放在/usr/local/src下。下面是我常用的编译流程,每一步都带注释。
# 解压源码包,进入目录 tar -zxvf samba-3.0.37.tar.gz -C /usr/local/src cd /usr/local/src/samba-3.0.37/source # 配置:指定安装前缀,关闭不需要的组件减少依赖 ./configure \ --prefix=/usr/local/samba \ --with-configdir=/usr/local/samba/lib \ --with-lockdir=/usr/local/samba/var/locks \ --with-logfilebase=/usr/local/samba/var \ --without-ldap \ --without-ads \ --without-krb5 # 编译并安装,老机器上 make -j2 就够,别开太高 make make install--prefix决定安装根目录,我习惯放/usr/local/samba,和系统包管理器隔离,避免和发行版自带的 Samba 冲突。--without-ldap、--without-ads、--without-krb5是关掉域控相关功能,如果你只是做独立文件服务器,这些用不上,关掉能少一堆编译错误。--with-lockdir和--with-logfilebase分开指定,是为了后面排查锁文件和日志方便。
编译完检查一下二进制:
/usr/local/samba/sbin/smbd -V # 输出类似 Version 3.0.37如果这里报动态库找不到,说明--prefix下的 lib 没进LD_LIBRARY_PATH,在/etc/ld.so.conf.d/下加一行路径再ldconfig即可。
2.3 smb.conf 最小可用配置与参数含义
配置文件默认在/usr/local/samba/lib/smb.conf。下面这份是我给独立文件服务器用的最小配置,能跑通再往上加。
[global] workgroup = WORKGROUP server string = File Server security = user map to guest = Bad User log level = 1 log file = /usr/local/samba/var/log.%m max log size = 50 load printers = no printing = bsd printcap name = /dev/null disable spoolss = yes [share] comment = Shared Directory path = /data/share browseable = yes writable = yes valid users = smbuser create mask = 0644 directory mask = 0755security = user是 3.0 里最常用的认证模式,客户端用服务器本地系统账号登录。map to guest = Bad User让不存在的用户自动降级为 guest,避免匿名访问直接报错。log file = ...%m里的%m是客户端 NetBIOS 名,多客户端时日志会按机器名分开,排查谁连不上特别有用。load printers = no和disable spoolss = yes是关打印,不做打印服务器就别开,开了反而多一堆报错。
[share]段里valid users限定只有smbuser能访问,create mask和directory mask控制新建文件的权限。注意这两个 mask 是“掩码”不是“权限”,0644表示新建文件权限是rw-r--r--,别写成777,否则共享目录里全是可执行文件,后面权限审计会很难看。
2.4 添加用户并验证共享
Samba 3.0 的用户体系依赖系统账号,先建系统用户,再用smbpasswd设 Samba 密码。
# 建系统用户,不建家目录,shell 设为 nologin useradd -M -s /sbin/nologin smbuser # 设置 Samba 密码,会提示输入两次 /usr/local/samba/bin/smbpasswd -a smbuser # 启动服务 /usr/local/samba/sbin/smbd -D /usr/local/samba/sbin/nmbd -Dsmbd负责文件和认证,nmbd负责 NetBIOS 名称解析,两个都要起。-D是后台运行。验证时先在服务器本机用smbclient看列表:
/usr/local/samba/bin/smbclient -L localhost -U smbuser能列出share就说明服务端通了。再从 Windows 客户端\\服务器IP\share访问,输入smbuser和刚才设的密码。如果连不上,先看/usr/local/samba/var/log.smbd和按客户端名生成的日志文件,里面会写清楚是认证失败还是路径权限问题。
3. 认证与权限:Samba 3.0 最容易翻车的地方
3.1 security 三种模式怎么选
Samba 3.0 的security参数有三个常用值:share、user、server。share是早期无认证模式,现在基本没人用,除非是纯匿名只读共享。user是默认推荐,客户端用服务器本地账号认证。server是把认证转发到另一台 SMB 服务器,配置复杂且依赖网络,除非有明确的级联认证需求,否则别碰。
我一般只推荐user。选它的理由是认证链路短,账号和权限都在本机,出问题好排查。如果客户端要求匿名访问,用map to guest = Bad User配合guest ok = yes实现,而不是把security改成share。share模式下权限控制很弱,容易出安全事件。
3.2 用户映射与 smbpasswd 的坑
Samba 3.0 的用户密码存在smbpasswd文件里,默认路径是/usr/local/samba/private/smbpasswd。这个文件和系统/etc/shadow是两套东西,改系统密码不会同步 Samba 密码,反之亦然。常见翻车是:系统账号建了,smbpasswd -a也执行了,但客户端还是认证失败。原因通常是smbpasswd文件权限不对,或者smbd启动时读的不是同一个文件。
检查命令:
ls -l /usr/local/samba/private/smbpasswd # 应该是 -rw------- root root 或对应运行用户如果权限是644,smbd会拒绝读取,日志里会有smbpasswd file not found or permission denied。改成600再重启smbd。另外,smbpasswd -a添加的用户必须先在系统里存在,否则会报Failed to add entry for user。顺序不能反。
3.3 目录权限与 create mask 的配合
共享目录的最终权限是“系统目录权限”和“Samba mask”共同作用的结果。很多人只改smb.conf里的create mask,忘了path指向的目录本身权限。比如/data/share属主是root:root且权限755,smbuser即使有writable = yes也写不进去,因为系统层面就没写权限。
正确做法是先把目录属主改成 Samba 用户或用户组:
chown -R smbuser:smbuser /data/share chmod -R 755 /data/share然后smb.conf里create mask = 0644、directory mask = 0755。这样新建文件属主是smbuser,权限644,新建目录755。如果多个用户共享一个目录,建议建一个用户组,目录属组设为该组,chmod 2775加 SGID 位,保证新建文件继承组,避免组权限丢失。
3.4 用 testparm 做配置自检
改完smb.conf别急着重启,先跑testparm:
/usr/local/samba/bin/testparm -v /usr/local/samba/lib/smb.conf它会逐行解析配置,报出语法错误和未知参数。Samba 3.0 对参数名大小写不敏感,但拼写错误不会报错,只会静默忽略,导致你以为设了其实没生效。testparm能把这些“隐形参数”揪出来。我习惯每次改配置都跑一遍,确认没有Unknown parameter再重启。
4. 避坑与排查:Samba 3.0 的五个血泪现场
4.1 客户端能连上但看不到共享目录
现象:Windows 输入\\IP能弹出认证框,认证通过后目录列表是空的。
原因:browseable = no或者nmbd没启动。Samba 3.0 的目录浏览依赖nmbd做名称广播,只起smbd时直接输入\\IP\share能访问,但网络邻居里看不到。
解决:确认nmbd -D已启动,smb.conf里对应共享段browseable = yes。如果还是不行,检查防火墙是否放行 UDP 137、138 和 TCP 139、445。
4.2 写入文件后权限变成 000 或 600
现象:客户端新建文件,服务器上看权限是000或600,其他用户读不了。
原因:create mask设成了0600或更小,或者系统umask干扰。Samba 3.0 新建文件权限 =create mask与系统 umask 的按位与结果。
解决:把create mask设为0644,directory mask设为0755,并确认启动smbd的用户 umask 是022。可以在启动脚本里显式umask 022。
4.3 大文件传输中途断开
现象:拷贝超过 2GB 的文件时连接中断,日志报read error或write error。
原因:Samba 3.0 默认max xmit和 socket 缓冲区偏小,老内核上大文件传输容易超时。
解决:在[global]加max xmit = 65535、socket options = TCP_NODELAY SO_RCVBUF=65536 SO_SNDBUF=65536,然后重启。如果还断,检查客户端和服务端之间的网络设备是否有会话超时设置。
4.4 中文文件名显示乱码
现象:Windows 客户端看到的中文文件名是乱码,或者上传后服务器上文件名变成问号。
原因:字符集不匹配。Samba 3.0 默认unix charset和display charset可能不是 UTF-8。
解决:在[global]加unix charset = UTF-8、display charset = UTF-8、dos charset = CP936。dos charset是给老 Windows 客户端用的,现代客户端一般走 UTF-8,但设上兼容性更好。改完重启smbd,已有乱码文件名需要手动重命名。
4.5 服务启动后自动退出
现象:smbd -D执行后进程几秒就没了,ps查不到。
原因:配置文件路径不对,或者smbd找不到smbpasswd文件,或者端口被占用。
解决:先不带-D前台运行smbd -i,看报错输出。常见是bind failed on port 445,说明已有其他 SMB 服务在跑,用netstat -tlnp | grep 445找到并停掉。如果是配置文件路径问题,用-s显式指定:smbd -D -s /usr/local/samba/lib/smb.conf。
5. 进阶:用 smbclient 做自动化验证与迁移判断
5.1 用 smbclient 写一个共享可用性检查脚本
生产环境里,共享目录是否可读写不能靠人肉点,我一般写个脚本定时跑。smbclient支持非交互式命令,适合做这个。
#!/bin/bash # 检查 Samba 共享是否可读写 SERVER="127.0.0.1" SHARE="share" USER="smbuser" PASS="yourpassword" TESTFILE="healthcheck_$(date +%s).txt" # 尝试写入一个测试文件 /usr/local/samba/bin/smbclient //$SERVER/$SHARE -U $USER%$PASS \ -c "put /etc/hostname $TESTFILE" > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "WRITE FAILED" exit 1 fi # 尝试读取并删除 /usr/local/samba/bin/smbclient //$SERVER/$SHARE -U $USER%$PASS \ -c "get $TESTFILE /tmp/$TESTFILE; rm $TESTFILE" > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "READ FAILED" exit 1 fi echo "OK"脚本里-U $USER%$PASS是用户名密码的简写,-c后面跟分号分隔的命令序列。put上传、get下载、rm删除,三步都成功才算共享健康。这个脚本可以挂到监控系统里,比 ping 端口更能反映真实可用性。注意密码别硬编码在脚本里,生产环境用凭据文件或环境变量。
5.2 什么情况下该从 3.0 迁到 4.x
不是所有 Samba 3.0 都值得留。如果满足下面任意一条,我建议规划迁移:客户端全是 Windows 10 及以上且能改配置;有安全合规要求必须支持 SMB2/SMB3 加密;需要 AD 域集成或 LDAP 认证;共享目录超过 1TB 且并发客户端超过 50。迁移时先在测试环境用 4.x 的server min protocol = NT1兼容模式跑一遍,确认老客户端能连,再逐步切。
如果客户端是嵌入式设备、老工控机,改不了协议,那就继续用 3.0,但要做好网络隔离,只允许特定 IP 访问 445 端口,别暴露在办公网里。我自己的习惯是:老版本可以留,但必须圈在一个 VLAN 里,进出都做访问控制,这是底线。
5.3 一个具体技巧:用 log level 精准定位认证问题
Samba 3.0 的日志级别从 0 到 10,默认log level = 1只记启动和错误。排查认证问题时,临时调到 3 或 5,能看到认证过程的每一步。
[global] log level = 3 log file = /usr/local/samba/var/log.%m调完后重启smbd,客户端再连一次,然后看对应客户端名的日志文件。里面会写auth_check_password的结果、用户映射过程、以及具体拒绝原因。定位完记得调回 1,否则日志涨得很快,磁盘容易被撑满。这个技巧我用了很多次,比盲猜参数快得多。
最后说个教训:我早年图省事,把security = share和guest ok = yes一起用在一个对外共享上,结果被扫描到,目录里多了一堆不该有的文件。从那以后,任何共享我都先问“谁能访问”,再配valid users和hosts allow,宁可多写两行,也不留匿名口子。希望帮到你。
本文还有配套的精品资源,点击获取