
简介面向嵌入式开发者与硬件调试人员的 SAM-BA 3.0 Windows 工具包主要用于 Atmel/Microchip 系列微控制器的固件烧录、启动配置与在线调试。压缩包共 89 个文件约 23.62MB以 dll 运行库、qml 与 qmldir 模块定义、html 接口文档、txt 说明及 bin 驱动文件为主另含 exe 主程序、conf 配置与 inf/cat 驱动安装文件构成可直接运行与查阅的完整环境。资源整合了 J-Link、串口等连接方式的 QML 模块文档并附带 SAMA5D2、SAMV7、SAMA5D4 等示例便于对照器件型号理解启动配置、字节数组读写与 Applet 加载流程。已有 737 人学习下载适合需要快速搭建烧录环境、查阅 API 说明或排查连接问题的嵌入式工程师与初学者参考。1. 搜 samba 3.0 却撞见 sam-ba先分清这是两码事在检索框里敲 samba 3.0翻两页会混进来一批 sam-ba 的下载页名字只差一个字母干的活却八竿子打不着sam-ba 是给某类微控制器做在板烧录的上位机工具而 Samba 3.0 是 SMB/CIFS 协议的服务端实现把 Linux/Unix 上的目录和打印机共享给 Windows 客户端。真正需要它的人多半还在维护一批只认 SMB1 的老设备——老工控机、老式扫描仪、老业务系统固定落盘的文件目录新系统装不上旧的又不敢动。这篇按我拆包、编译、配置、上线、排障的顺序走一遍参数怎么填、权限怎么配、哪种情况下 Samba 3.0 根本不该再上都摊开讲清楚。2. 协议与版本选型Samba 3.0 在今天还剩多少战力2.1 SMB/CIFS 协商过程与三个守护进程的分工客户端连上来的第一件事是方言协商。它发一个 negotiate protocol request把自己支持的协议版本列成一串服务端从中挑一个回过去。Samba 3.0 能回的顶格就是 NT LM 0.12也就是俗称的 SMB1再往上的 SMB2、SMB3 方言它完全不认识。这个协商结果决定后面所有报文的结构也包括了为什么很多新客户端一上来就报错——不是账号问题是双方压根没谈拢方言。端口层面要分清两条路。445 是直接跑在 TCP 上的 SMB现代客户端优先走这条139 是把 SMB 套在 NetBIOS over TCP/IP 会话里属于老路子137 和 138 是 UDP归 nmbd 管负责名字解析和网络浏览列表。三条路的职责别混排障时先确认客户端到底走的哪条比盲改 smb.conf 有效得多。进程分工是这样的smbd 干所有跟文件和打印相关的活每个客户端连接一个 smbd 子进程nmbd 处理 NetBIOS 名字注册、名字查询和浏览列表选举它只认广播跨网段就不干活了winbindd 在 3.0 里已经存在但主要用途是把 NT 域或目录服务里的账号映射成 Unix 的 uid/gid纯本地账号场景下它不参与。很多人装完发现网上邻居里看不到我的机器八成是 nmbd 没起来或者被防火墙挡了而不是共享配置错。Samba 3.0 的另外一个隐含边界是文件系统语义。它把 SMB 的请求翻译成 POSIX 调用大小写不敏感、文件锁、机会锁这些靠的是服务端内存里的状态表。SMB1 时代没有持久句柄和多通道客户端断线重连后锁状态要重建所以做大文件长时间写入的业务掉线重连经常看到文件被占用的残留提示本质是断连时锁没释放干净。2.2 三组对照3.0 与 4.x 到底差在哪选型别拍脑袋把差异摆到表格里最直观。下面这张表是我给几个还在用 3.0 的现场做评估时常用的对照列的是真正会影响业务的能力项不是版本号大小。能力项Samba 3.0Samba 4.x最高协议方言SMB1NT LM 0.12SMB3.1.1作为域控制器不支持只能做成员服务器支持 AD DC传输加密无SMB3 支持加密多通道 / 持续可用无有符号链接与 Unix 扩展支持但客户端兼容性参差支持更完整现代 Windows 默认可用需手动放开 SMB1默认可用安全补丁状态已停止维护持续维护看表就能得出结论Samba 3.0 的短板不在能不能共享文件而在协议太老。SMB1 的报文结构设计于上世纪没有加密通道签名算法也弱一旦同网段有机器被拿下横向扫共享是分分钟的事。这一点在隔离的内网里可以靠边界控制对冲但别指望协议本身给你兜底。再看兼容性。Windows 10 后期版本和 Windows 11 默认关闭了 SMB1 客户端启用或关闭 Windows 功能里的 SMB 1.0/CIFS 文件共享支持是关着的。这就意味着即使你服务端跑得好好的客户端也连不上。绕过办法有两个方向客户端侧把 SMB1 打开或者服务端升级。前者是把风险往下压后者是改造成本选哪条要看设备侧还有没有只认 SMB1 的老系统。2.3 该留还是该换三条判断线我给自己的判断标准是这样的。第一条看客户端里还有没有改不动的设备。老式扫描仪直接把扫描件推到共享目录、老工控机的组态软件只认\\IP\share这种 UNC 路径、十年前的业务系统配置文件里写死了 SMB1 挂载这类只要还存在Samba 3.0 就有存在理由因为它是少数能把 SMB1 服务端做完整的开源实现。第二条看共享目录里放的是什么。放的是公开的图纸、日志、临时交换文件权限模型简单那 3.0 够用放的是账号数据、合同、财务凭证那就别再犹豫SMB1 明文传输这条就过不了审计。这种情况下哪怕前端设备改不动也应该在中间加一层转换让新客户端连新服务端老设备单独走一个受限网段。第三条看运维人力。Samba 3.0 早就不出新补丁了出了漏洞只能自己扛。如果团队里没人能读源码、没人盯 CVE那这个版本在网上一放就是活靶子。反过来如果这套东西跑在完全隔离的车间网里、物理上出不去那它的风险敞口是可控的。判断的技术含量不在新旧在边界清不清楚。3. 从源码到服务编译参数与最小可用 smb.conf3.1 依赖检查与 configure 参数Samba 3.0 时代没有现在这么完善的包管理发行版仓库里也基本找不到对应版本现实做法就是从源码编。编译前把工具链和几个开发库备齐缺一个就会在 configure 阶段报出来早报比晚报好。# 以 RHEL/CentOS 系为例先补编译依赖 yum install -y gcc make pam-devel readline-devel \ ncurses-devel openssl-devel krb5-devel cups-devel # 解包注意 3.0 系列的源码树里 configure 在 source/ 子目录下 tar -xzf samba-3.0.x.tar.gz cd samba-3.0.x/source ./configure \ --prefix/usr/local/samba \ --with-configdir/usr/local/samba/lib \ --with-privatedir/usr/local/samba/private \ --with-lockdir/var/lock/samba \ --with-piddir/var/run \ --with-logfilebase/var/log/samba \ --disable-cups \ --without-ldap \ --without-ads make make install这段里每个参数都有实际去处的不是抄模板。--prefix决定安装根目录后面所有路径默认都从它派生--with-configdir指定 smb.conf 的落脚点我习惯让配置和程序放在一起备份时整个目录打包带走--with-privatedir最关键passdb.tdb、secrets.tdb这些存账号和机器密钥的库文件都在这里权限要收紧到 700别跟共享目录放一块--with-lockdir和--with-piddir分开配是为了让/var可以做独立分区而不影响服务重启。--disable-cups和--without-ldap、--without-ads是减法。这台机器只做文件共享、不接打印、不接目录服务把这几块编译进去只会多引入依赖和潜在的攻击面。如果现场确实要接 AD 做账号统一那就把--with-ads打开同时补上 krb5 相关依赖但注意 3.0 只能做成员服务器别指望它当域控。编译完的程序落在/usr/local/samba/sbin和/usr/local/samba/bin下smbd、nmbd在 sbinsmbclient、smbpasswd、testparm、pdbedit在 bin。系统 PATH 里没有这两个目录所以启动脚本里要么写全路径要么先 export。#!/bin/bash # /etc/init.d/samba3一个够用的启停脚本 SMB_HOME/usr/local/samba case $1 in start) $SMB_HOME/sbin/nmbd -D $SMB_HOME/sbin/smbd -D ;; stop) killall smbd nmbd 2/dev/null ;; reload) # 改完 smb.conf 用 HUP 让 smbd 重读配置不断已有连接 kill -HUP $(cat /var/run/smbd.pid) ;; status) pgrep -a smbd; pgrep -a nmbd ;; *) echo usage: $0 {start|stop|reload|status} ;; esac-D是守护进程模式前台调试时不要加直接跑smbd -i能看到实时输出。kill -HUP重载配置这个习惯要养成它只重读 smb.conf不断开已经建立的会话比 restart 温和得多。但注意它读不了新增的共享目录权限变更那种情况还是得重启。3.2 smb.conf 最小可用配置逐段拆解配置文件是这套东西的核心写错一个参数排查半天。下面这份是我在测试环境跑通后精简下来的最小集注释里写了每个参数存在的理由。[global] workgroup WORKGROUP server string FileServer-01 netbios name FS01 security user passdb backend tdbsam map to guest bad user smb ports 445 139 server signing auto # 日志按客户端机器名分文件排障时一眼定位到是谁连不上 log file /var/log/samba/log.%m max log size 5000 log level 1 # 关掉打印相关减少无效的 spoolss 请求 load printers no printing bsd printcap name /dev/null disable spoolss yes # 中文文件名三件套缺一个就乱码 unix charset UTF-8 display charset UTF-8 dos charset CP936 [homes] comment Home Directories browseable no writable yes create mask 0600 directory mask 0700 [public] comment Public Read Only path /srv/samba/public browseable yes read only yes guest ok yes [dept] comment Dept Write Share path /srv/samba/dept browseable yes writable yes valid users smbdept force group smbdept create mask 0660 directory mask 2770security user是本地账号认证模式账号密码存在 tdbsam 库里map to guest bad user的意思是用户名不存在时降级成来宾配合[public]的guest ok yes就能做到匿名只读、登录可写。这两个参数是老版本里最容易被忽略的组合缺了map to guest匿名访问会直接回NT_STATUS_LOGON_FAILURE而客户端只会弹一个语焉不详的拒绝访问。server signing auto在 3.0 里是可选项协商上了就签名没协商上就明文。别设成mandatory老客户端不一定支持一设死就连不上。smb ports 445 139显式声明监听端口方便防火墙对齐也省得服务去碰 137/138 的 UDP 广播。中文乱码是这套配置里的高频翻车点。unix charset UTF-8决定服务端文件系统看到的名字编码dos charset CP936决定跟老客户端交互时用的编码display charset管的是服务端自己输出。三个一起改才有效只改一个照样乱。现在新客户端大多走 UTF-8如果现场全是新系统dos charset可以留空让它走默认但只要有老 XP 或者老设备CP936 就必须写上。[dept]里的directory mask 2770那个 2 是 setgid 位作用是让目录里新建的文件和子目录自动继承父目录的属组不然多用户协作时会不断出现我建的文件别人改不了。force group smbdept是另一道保险它把写入操作的属组强制拉到指定组跟上面的 setgid 配合使用能省掉大量权限投诉。配置写完别急着重启先跑校验# 语法检查-s 只输出生效的配置不打印注释 /usr/local/samba/bin/testparm -s /usr/local/samba/lib/smb.conf # 看共享列表和每个共享的最终生效参数 /usr/local/samba/bin/testparm -sv /usr/local/samba/lib/smb.conf | lesstestparm报Loaded services file OK才算过。如果它提示某个参数 unknown说明这个参数在 3.0 里不存在通常是照着新版文档抄错了直接删掉别硬留。3.3 用户体系系统用户、smbpasswd 与 tdbsam 的三层关系Samba 3.0 的账号模型是两套并存Unix 系统用户决定文件权限Samba 自己的密码库决定能不能登录。两个都得有缺一个都登不上这是新手最容易卡住的地方。# 1. 先建组和系统用户注意 shell 给 nologin家目录指向共享路径 groupadd -g 3000 smbdept useradd -u 3000 -g smbdept -s /sbin/nologin -d /srv/samba/dept alice # 2. 再往 Samba 密码库里加同一个用户-a 是新增 /usr/local/samba/bin/smbpasswd -a alice # 交互式输入两遍密码不回显 # 3. 如果账号被禁用过显式启用 /usr/local/samba/bin/smbpasswd -e alice # 4. 确认库里的账号状态 /usr/local/samba/bin/pdbedit -L -vuseradd那步的 uid 和 gid 最好跟现场其他机器对齐NFS 和 Samba 混用时 id 不一致会出各种诡异问题。-s /sbin/nologin是硬性建议共享账号不需要登录 shell给了就是多一个入口。smbpasswd -a必须系统用户已存在否则报Failed to add entry for user这个报错基本等于你忘了 useradd。pdbedit -L -v能看到每个账号的 uid、gid、密码最后修改时间、账号标志位。有时候客户端说密码是对的但登不上多半是账号被标了 disabled或者密码过期策略触发这个命令一眼就能看出来。改密码用smbpasswd alice删账号用smbpasswd -x alice注意删 Samba 账号不删系统用户两套体系要分别处理。4. 权限落地Linux 位、SMB ACL 与客户端挂载4.1 三类典型共享的目录与权限设置共享目录的权限问题九成出在服务端配置对了文件系统没对。Samba 只是把请求翻译成系统调用最后拍板的是 Linux 的属主、属组和其他位。建目录时就把位设好比事后 chmod 省事得多。# 公共只读区所有用户可读只有管理员可写 mkdir -p /srv/samba/public chown root:root /srv/samba/public chmod 755 /srv/samba/public # 部门协作区属组可写setgid 保证继承 mkdir -p /srv/samba/dept chown root:smbdept /srv/samba/dept chmod 2770 /srv/samba/dept # 个人家目录只有本人能进 mkdir -p /srv/samba/dept/alice chown alice:smbdept /srv/samba/dept/alice chmod 700 /srv/samba/dept/alice2770这个位值得单独说。第一个 2 是 setgid作用是新文件自动继承父目录的属组而不是跟着创建者的主组走后面 770 表示属主和属组可读写执行、其他人无权限。没有 setgidalice 建的文件属组是 alice 的主组bob 就改不了协作区立刻变成各写各的。chmod 700的家目录要注意父目录的 x 位。/srv/samba/dept是 2770属组 smbdept 有 x所以组内用户能穿过这一层进到自己的子目录。如果父目录误设成 2774 或者 2776看起来更宽松实际会因为其他人位没有 x 而无法遍历表现出来就是能看到目录名点进去报错。4.2 create mask 与 Linux 权限的换算smb.conf 里的create mask和directory mask是 SMB 层的掩码它跟 Linux 的 umask 是相乘关系不是覆盖关系。搞不清这一点就会出现我明明设了 0660新建文件还是 0644。实际生效的权限 客户端请求的权限 ~create mask ~服务端进程 umask。也就是说掩码是减去的意思只做减法不做加法。想要文件落地是 0660就得让 create mask 至少包含 0660 的补集同时服务端进程的 umask 不能把它再削掉。[dept] path /srv/samba/dept create mask 0660 force create mode 0660 directory mask 2770 force directory mode 2770 force group smbdeptforce create mode和force directory mode是强制位它会在掩码计算完之后把指定位硬置上是解决权限总差一点的后悔药。我一般两个都写掩码负责减、强制位负责兜底。代价是灵活性下降所有人的新文件权限都一样但协作区本来就需要一致这个代价可以接受。还有一个容易漏的点inherit permissions yes。开了它以后新文件直接继承父目录的权限位掩码和强制位都不再起作用。这个参数在 3.0 里可用配 setgid 目录特别合适能让整个子树保持一致的权限风格。但它要求文件系统支持某些网络文件系统上行为不一致上线前务必在目标文件系统上实测一次。4.3 客户端挂载参数与吞吐调优Linux 客户端用 cifs 内核模块挂载时最容易踩的是方言参数。Samba 3.0 只会 SMB1而新内核的 cifs 默认不再尝试 SMB1什么都不写就会卡在协商阶段最后报mount error(22): Invalid argument或者mount error(112): Host is down看着像网络问题其实是方言不匹配。# 老协议必须显式指定 vers1.0同时指定 sec 模式 mount -t cifs //192.168.10.20/dept /mnt/dept \ -o usernamealice,password******,vers1.0,secntlm,\ uid3000,gid3000,iocharsetutf8,\ file_mode0660,dir_mode0770,nounix,noserverinovers1.0是硬性要求不写就协商不上。secntlm指定认证方式Samba 3.0 支持 NTLMv1 和 NTLMv2新内核里 NTLMv1 的支持在收缩如果报认证失败可以试着换成secntlmv2或者反过来确认服务端ntlm auth的设置。uid和gid决定挂载点上文件的属主属组不指定就全归 root普通用户读写会一直报权限错误。nounix和noserverino这两个参数是兼容性开关。nounix关掉 Unix 扩展协商避免服务端和客户端对符号链接、特殊文件的理解不一致noserverino让客户端自己生成 inode 号绕开服务端 inode 不唯一导致的应用异常。这两个不是性能参数是踩过坑之后加的保险。性能方面SMB1 时代能调的其实不多。rsize和wsize默认值在现代内核里已经比较合理硬调大反而可能因为服务端缓冲区不够而回退。真正影响体感的是actimeo它控制属性缓存时间默认 1 秒目录里文件多的时候元数据请求会非常密集调到 10 到 30 秒能明显降低延迟代价是别处改了文件这边要等一会儿才看到。5. 排查Samba 3.0 上线后最容易翻车的五处5.1 五条现象、原因与解决路径现象一Windows 客户端双击共享提示因为你组织的安全策略阻止未经身份验证的来宾访问。原因是客户端默认禁用了不安全的来宾登录而共享配的是guest ok yes。解决路径有两条一是在客户端侧通过组策略把启用不安全的来宾登录打开二是老老实实给账号让访问走认证而不是来宾。后一条更值得做来宾访问在 SMB1 上等于无门槛谁能连上谁就能读。若是老设备实在没法配账号那至少把来宾共享限制在只读并且放到独立网段。现象二smbclient -L能列出共享名但连具体共享时报NT_STATUS_BAD_NETWORK_NAME。原因是共享名和实际路径对不上。SMB 的共享名区分大小写不敏感、但路径是敏感的[dept]段里的path写错一个字母或者目录根本没建都会报这个。还有一种情况是共享名带了特殊字符客户端转义后匹配不上。解决方式是先用testparm -s把生效配置打出来逐字核对 path再ls -ld确认目录存在且 smbd 进程有权限进去。现象三中文文件名在客户端显示成问号或方块上传后文件名直接损坏。原因是编码三件套没配齐或者只改了unix charset没改dos charset。老客户端按 GBK 发过来服务端按 UTF-8 存名字就废了。解决是把三个 charset 参数一起设上unix charset UTF-8、dos charset CP936、display charset UTF-8然后重启 smbd 并重新上传测试文件。已经存坏的文件名没法自动恢复只能手工重命名。现象四能读不能写日志里刷NT_STATUS_ACCESS_DENIED。这个最常见原因排起来有三层。第一层是文件系统权限create mask算出来的结果不允许写或者目录属组不对、缺 setgid第二层是 SELinuxgetenforce返回 Enforcing 时共享目录的上下文不对就会被拦日志在/var/log/audit/audit.log里能看到 avc denied第三层是父目录缺 x 位导致能列目录但不能创建。解决顺序是先看 smbd 日志确认拒绝的是哪个系统调用再看 audit 日志确认是不是 SELinux最后才回去调 mask。现象五跨网段访问时网络里看不到服务器但直接输\\IP\共享名又能打开。原因是 nmbd 的浏览列表靠广播路由器不转发 137/138 的 UDP 包自然看不到。这不是故障是 NetBIOS 的设计边界。解决办法就是别依赖浏览用 IP 直连或者在 DNS 里给文件服务器加一条记录让用户记名字。别为了能在网上邻居里看见去折腾 WINS那套东西维护成本比收益高得多。5.2 日志、调试等级与抓包定位Samba 3.0 的日志分成两部分log.smbd是主进程日志log.%m是按客户端机器名分出来的连接日志%m会被替换成客户端上报的 NetBIOS 名。排障时先看按机器名分的那个文件比看主日志快得多。调日志等级是双刃剑。log level 1只记错误和关键事件日常够用调到 3 能看到协议级交互包括每个请求的 opcode 和返回码调到 10 会打出报文十六进制日志量爆炸磁盘很快满。我的习惯是平时 1出问题临时用smbcontrol动态调避免改配置重启。# 临时把某个 smbd 子进程的日志级别拉到 3不用重启服务 /usr/local/samba/bin/smbcontrol smbd debug 3 # 跟进日志同时过滤关键字 tail -f /var/log/samba/log.smbd | grep -Ei error|denied|NT_STATUS # 协议层还是对不上时直接在服务端抓 445 tcpdump -i eth0 -s 0 -w /tmp/smb.pcap port 445smbcontrol调级别只对当前进程有效进程重启就回到配置值所以它适合救急不适合常态。抓包是最后手段但很有效协商阶段就能看出客户端发了哪些方言、服务端回了哪个连不上的问题一半在这一步就能定性。6. 上线前的验收清单三条命令把共享验完再交付交付前我固定跑一遍这个流程三条命令分别验配置、验认证、验读写任何一步不过都不往下走。这个习惯是从一次事故里换来的当时只验了能列共享没验实际读写结果第二天业务上线写操作全被 SELinux 拦了日志在另一台机器上排查找了两个小时。#!/bin/bash # 交付前自检三个环节任一失败即退出 CONF/usr/local/samba/lib/smb.conf USERalice PASS****** # 1. 配置语法与生效值 /usr/local/samba/bin/testparm -s $CONF || { echo 配置语法错; exit 1; } # 2. 认证与方言协商-m NT1 强制走 SMB1模拟老客户端 /usr/local/samba/bin/smbclient -L //127.0.0.1 -U $USER%$PASS -m NT1 \ || { echo 认证或方言协商失败; exit 1; } # 3. 真实读写删-c 里一次跑完看每一步的返回 /usr/local/samba/bin/smbclient //127.0.0.1/dept -U $USER%$PASS -m NT1 \ -c ls; put /etc/hostname probe.txt; get probe.txt /tmp/probe.bak; del probe.txt \ || { echo 读写流程失败; exit 1; } echo 验收通过第二条的-m NT1是关键。它强制客户端使用 SMB1 方言模拟的就是现场那批老设备的连接方式。不加这个参数smbclient 会先尝试更高方言协商成功了但你验的其实不是老客户端的路径等于白测。第三条把ls、put、get、del串在一个命令里一次性覆盖读、写、回读、删除四个动作比分开跑四次快而且任何一步失败退出码都非零。验完服务端客户端侧还要补一条挂载验证因为内核 cifs 的行为和 smbclient 不完全一样mkdir -p /mnt/probe mount -t cifs //192.168.10.20/dept /mnt/probe \ -o usernamealice,password******,vers1.0,secntlm,uid3000,gid3000 touch /mnt/probe/$(hostname).probe ls -l /mnt/probe/*.probe umount /mnt/probetouch之后ls -l看属主和权限位是不是预期的 0660 和 uid 3000这一步能同时验证挂载参数和掩码计算。很多人省掉这步结果用户实际用的时候发现新建文件属主是 root再回头改挂载选项已经上线了。从那次两小时的事故之后我每次交付共享服务都强制走一遍「配置 → 认证 → 读写 → 客户端挂载」这四段不管改动多小哪怕只是加了一个共享段。看起来是多花五分钟实际省下的是半夜被叫起来的时间。希望帮到你。本文还有配套的精品资源点击获取