samba服务器的启动命令是systemctl start smb和systemctl start nmb,如果你用的是SysV风格,也可以用service smb start。这两个命令分别负责Samba的核心文件共享服务(smbd)和NetBIOS名称解析服务(nmbd),缺一不可,下面我会把启动、开机自启、排错以及不同Linux发行版的差异一次性讲透。
为什么启动Samba要同时启动smb和nmb两个服务
很多刚接触Samba的朋友习惯只执行systemctl start smb,结果发现Windows能ping通IP却看不到共享文件夹,这不是命令写错了,而是你没有理解Samba的架构。
- smb服务:负责SMB/CIFS协议,也就是真正传输文件数据的那部分,它监听445端口,处理用户认证、文件读写、打印机共享等核心业务。
- nmb服务:负责NetBIOS name service,监听137和138端口,它的职责是把NetBIOS名称解析成IP地址,让Windows系统的“网络邻居”能通过主机名直接找到你的Linux服务器,而不是每次都要输入
\192.168.x.x。
行业共识认为,绝大多数“看不到共享”的新手问题,都是因为只启动了smb而忽略了nmb,你可以用一句命令同时启动这两个服务:
systemctl start smb nmb
如果你想查看它们是否在运行,用这个命令:
systemctl status smb nmb
输出里会分别显示两个服务的状态,如果都是绿色的active(running),那就说明启动成功。
Samba服务器在不同发行版上的启动命令有什么区别
这个问题经常出现在搜索引擎里,主要是Ubuntu/Debian和CentOS/RHEL两个阵营的差异比较大,先给你一个对比表,心里有个底:
| 发行版 | Samba服务名 | 启动命令 | 开机自启命令 |
|---|---|---|---|
| CentOS 7+ / RHEL | smb, nmb | systemctl start smb |
systemctl enable smb |
| Ubuntu 18.04+ / Debian | smbd, nmbd | systemctl start smbd |
systemctl enable smbd |
| 老版本SysV (CentOS 6及更早) | smb | service smb start |
chkconfig smb on |
你可能会问,为什么Ubuntu的服务名后面多了一个d?这个d代表daemon(守护进程),Ubuntu沿用了Samba源码包里的原始命名方式smbd和nmbd,而CentOS把服务名简化成了smb和nmb,仅此而已,功能上没有任何区别。

还有一个常见坑:在Ubuntu上执行systemctl start smb会提示Unit smb.service not found,这就是因为服务名写错了,请务必先用systemctl list-unit-files | grep smb查一下你系统上真实的Samba服务名。
启动Samba之前必须完成的配置检查
命令本身很简单,但如果配置有问题,很可能执行完启动命令后,服务启动两秒就崩溃,或者虽然显示active但客户端连接不上,所以我建议你按下面这个顺序做一遍体检。
检查smb.conf语法是否正确
Samba的配置文件是/etc/samba/smb.conf,我见过太多人改了配置后直接重启服务,结果服务根本起不来,日志里报Error parsing configuration file,其实Samba自带一个测试工具:
testparm
如果输出末尾出现Loaded services file OK.,说明语法没问题,如果有错误,它会明确指出错在第几行,你改完再用testparm验证一遍,直到通过再启动服务。
检查防火墙是否放行Samba端口
即使服务启动成功,本机防火墙也会挡住外部连接,Samba需要放行以下端口:
- 445/tcp(SMB)
- 139/tcp(NetBIOS会话)
- 137/udp(NetBIOS名称解析)
- 138/udp(NetBIOS数据报)
在CentOS上执行:
firewall-cmd --permanent --add-service=samba firewall-cmd --reload
在Ubuntu上执行:
ufw allow samba
如果你用的是云服务器,还要在云控制台的安全组里放行这些端口,这里分享一个真实场景:很多人在本地虚拟机里Samba一切正常,迁移到酷番云或简米云后怎么都连不上,最后发现是安全组只放行了22端口和80端口,完全忘了Samba,据部分云服务商统计,这类网络配置问题占Samba连接失败案例中的较大比例。
检查SELinux状态(CentOS/RHEL专用)
CentOS默认开启SELinux,它会在Samba服务启动后继续拦截文件访问权限,如果你发现服务明明是active,但客户端访问目录时提示Permission denied

,很大概率是SELinux在捣乱。
你可以先查看状态:
getenforce
如果是Enforcing,可以尝试把SELinux对Samba的布尔值打开:
setsebool -P samba_enable_home_dirs on
如果只是临时测试,也可以直接setenforce 0关掉SELinux,但不建议在生成环境这么干,更合理的做法是用audit2why查看SELinux拒绝日志,然后精准放行。
如何设置Samba开机自启动
光学会启动命令还不够,服务器重启后Samba不会自动运行,你还要把它加入开机自启,这个操作在系统管理里占比非常高,因为没有人每次重启后手动去敲启动命令。
CentOS/RHEL系统:
systemctl enable smb nmb
Ubuntu/Debian系统:
systemctl enable smbd nmbd
执行后,可以用以下命令验证自启是否设置成功:
systemctl is-enabled smbd
输出enabled就代表已经生效,如果你用的是老版本SysV,对应的命令是chkconfig smb on。
还有一个小技巧:如果你希望Samba服务永远不受手动启动和停止的干扰,可以屏蔽它(极少数场景会用到,比如你要用一个自定义脚本完全接管Samba的生命周期):
systemctl mask smb
屏蔽后,任何启动命令都会失败,想要恢复,执行systemctl unmask smb即可。
Samba启动失败时如何快速定位原因
我遇到过不少用户在论坛里问,为什么命令敲下去提示Job for smb.service failed,但并没有给出具体错误,这个提示的意思是:systemd尝试启动Samba,但进程在启动过程中退出了。
正确的排错姿势是看日志,日志位置如下:
- CentOS/RHEL:
/var/log/messages或journalctl -u smb - Ubuntu/Debian:
/var/log/syslog或journalctl -u smbd
用journalctl是最直观的方式:
journalctl -u smb -n 50 --no-pager
这条命令会显示最近50条smb服务的日志,常见的错误无非这么几类:
- 配置语法错误:日志里会直接提示解析失败的配置文件行号。
- 端口被占用:另一个进程占用了445端口,日志会报
bind failed on port 445,此时用ss -tlnp | grep 445找出占用进程,通常是其他Samba实例或者某个Nginx配置了SMB模块。 - 权限问题:Samba工作目录或日志目录的属主不是root,导致进程无法写日志。

还有一个特别容易踩的坑:在Ubuntu上,如果你之前手动改过/etc/init.d/samba或者用过systemctl stop samba,systemd可能会进入异常状态,这时候直接执行:
systemctl daemon-reload systemctl restart smbd
强制重新加载服务定义,问题基本都能解决。
Samba启动命令相关的常见问题解答
为什么Samba重启后连接中的客户端会断线?
重启Samba服务意味着当前的smbd进程被终止,正在进行的文件传输和会话会全部中断,客户端必须重新连接,如果你只想让配置生效而不中断服务,应该用systemctl reload smb而不是systemctl restart smb,reload不会短连接,只是重新读取配置,在线用户无感知,如果你修改了共享目录的路径或权限,reload能搞定;如果你改了认证方式或SMB协议版本,通常还是需要restart才能完全生效。
Samba启动后Windows无法访问,怎么办?
先确认Samba服务确实是在运行状态,然后查看服务器的防火墙和SELinux,随后在Windows的命令行里运行net use /delete清掉旧的缓存,再用\服务器IP访问,如果能看到共享目录但无法打开,查看共享目录的Linux文件权限,通常需要让Samba用户对目录有rx权限,最后这一步容易被忽略:Samba的配置文件里如果设置了valid users = @smbgroup,那你还要创建对应的Linux用户组,并把Windows访问账号加入这个组。
如何确认Samba到底是启动成功了还是启动失败了?
除了用systemctl status smb,你还可以直接在服务器本机测试TCP端口是否监听:
ss -tlnp | grep -E '445|139'
只要有监听状态,服务就是成功的,另外可以用smbclient -L localhost -U 用户名来测试是否能列出共享列表,如果能正常输出,那说明Samba的启动命令不仅执行了,而且整个服务链路都通透了。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/908751.html

