Ubuntu 安装与配置 Samba 服务器

本文基于一次真实排障写成:Windows 访问 \\192.168.50.62\share 一直报"网络路径找不到",

最后定位到 配置注释 + 共享名 + 账号三处叠加问题 。文章前半部分是标准流程,后半部分是血泪坑点。

建议先读完"坑点",再照着做,能省掉绝大多数弯路。


一、适用场景

  • 一台 Ubuntu 当文件服务器,把某个目录共享给局域网 Windows 访问
  • Windows 侧用 \\IP\共享名 或映射网络驱动器

二、环境参考

项目
服务器系统 Ubuntu 22.04.5 LTS
Samba 版本 4.15.13(smbd --version
客户端 Windows(文件资源管理器 / net use
共享目录 /home/share
共享名 share
访问账号 系统用户 + Samba 账号

Samba 版本比较新,默认就支持 SMB2/3,不需要为了兼容 Windows 额外开 SMB1。


二、服务端安装与配置(标准流程)

1. 安装

bash 复制代码
sudo apt update
sudo apt install -y samba
# 装完检查版本和状态
smbd --version
systemctl is-active smbd nmbd    # 应为 active active

2. 准备共享目录(先建目录再配置,别反过来)

bash 复制代码
sudo mkdir -p /home/share
sudo chown zhang
:sambashare /home/share   # 属主:组
sudo chmod 2770 /home/share                  # 2770 = 组内可写 + setgid
ls -ld /home/share
# 期望输出类似:drwxrws--- 2 zhang sambashare ...

setgid(2xxx)可以让组内成员新建的文件自动继承组,多用户协作时很有用。

3. 编辑配置文件

bash 复制代码
sudo vim /etc/samba/smb.conf
# 或 nano:
sudo nano /etc/samba/smb.conf

一个最小可用配置(在文件末尾追加或自行精简):

ini 复制代码
[global]
   workgroup = WORKGROUP
   server string = %h server
   log file = /var/log/samba/log.%m
   max log size = 1000
   logging = file
   security = user
   server role = standalone server
   map to guest = Bad User

[share]
   comment = share folder
   browseable = yes
   path = /home/share
   available = yes
   guest ok = no            ; 只允许账号访问
   writable = yes
   valid users = zhang
   create mask = 0777
   directory mask = 0777

⚠️ 注意 :上面例子里的 ; 注释如果照抄会出问题,请先看下面的「坑点 1」!

4. 添加 Samba 账号(关键且最容易被漏)

bash 复制代码
sudo smbpasswd -a zhangs
# 交互式输入两次新密码即可
# 验证:
sudo pdbedit -L
# 期望输出:zhang:1000:zhang

Samba 的账号库(tdbsam)与 Linux 系统账号是两回事

zhang 能 SSH 登录 ≠ 能访问 Samba,必须 smbpasswd -a 单独加一遍。

顺手把密码设成与系统一致最省事。

5. 校验配置(每次改完都跑)

bash 复制代码
testparm -s
# 无语法错误即可;确认 [share] 段里 path / valid users 与预期一致

6. 重启服务

bash 复制代码
sudo systemctl restart smbd nmbd
systemctl is-active smbd nmbd          # active
ss -tln | grep -E ':(445|139)'          # 两条 LISTEN

7. 防火墙放行(如果开了 ufw)

bash 复制代码
sudo ufw status
# 若 active:
sudo ufw allow samba        # 等价于放行 137/138/139/445
# 或最小放行:
sudo ufw allow 445/tcp
sudo ufw allow 139/tcp

三、Windows 客户端连接

bat 复制代码
:: 命令行一次性连接
net use \\192.168.50.62\share /user:zhang abc13579

:: 映射为 Z: 并持久化(重启不丢)
net use Z: \\192.168.50.62\share /persistent:yes

:: 删除残留连接
net use * /delete /y

:: 查看当前所有连接
net use

连接后日常使用有两种方式:直接走 UNC 路径(不占盘符),或映射成网络驱动器(占一个盘符)。

方式一:直接访问 UNC 路径(不映射盘符)

UNC 格式:\\服务器IP\共享名,后面还可以继续带子目录,如 \\192.168.50.62\share\doc

图形界面 :文件资源管理器地址栏直接输入 \\192.168.50.62\share 回车,首次会弹窗填账号密码;之后会话内免登录。想从当前窗口继续往里钻就正常双击目录。

cmd / 批处理 :注意 cmd 默认不支持把 UNC 作为当前工作目录 (直接 cd \\192.168.50.62\share 会报"CMD 不支持 UNC 路径"),要用 pushd

bat 复制代码
:: 进入共享目录(pushd 会自动分配一个临时盘符并切进去)
pushd \\192.168.50.62\share\doc
:: 此时当前目录已是该共享,可正常 dir、copy、del
dir

:: 用完退回本地目录,同时回收临时盘符
popd

PowerShell:原生支持 UNC 作为当前位置,直接切:

powershell 复制代码
Set-Location \\192.168.50.62\share\doc
Get-ChildItem

方式二:映射成网络驱动器(分配盘符)

映射后共享就像本地盘一样(Z:\),cmd/PowerShell/资源管理器都能直接当普通盘用,不再受 UNC 工作目录限制

命令行映射

bat 复制代码
:: 映射到 Z:(指定凭据 + 重启后仍保留)
net use Z: \\192.168.50.62\share /user:zhang abc13579 /persistent:yes

:: 断开指定盘符
net use Z: /delete

:: 断开所有网络连接
net use * /delete /y

:: 查看当前所有映射与连接
net use

图形界面映射

  1. 文件资源管理器 → 左侧"此电脑"上右键 → 映射网络驱动器(Win10/11 也可在"此电脑"里点顶部"映射网络驱动器")
  2. 驱动器选 Z:(字母任意,避开已占用盘符)
  3. 文件夹填 \\192.168.50.62\share
  4. 勾选"登录时重新连接"(= 持久化);"使用其他凭据连接"按需勾选填账号密码

切换路径 / 盘符的常用操作小结

bat 复制代码
:: 在 cmd 中切换(用 pushd,不要用 cd)
pushd \\192.168.50.62\share\doc

:: 在已映射盘符之间切换、查看,跟本地盘完全一样
Z:
cd \doc
net use                :: 查看当前盘符对应哪台服务器哪个共享

小坑:若提示"指定的网络名格式不再可用"或盘符被占,多半是旧映射残留或凭据失效,先 net use Z: /deletenet use * /delete /y 清掉再重新映射(详见坑 5)。


四、踩坑点清单(重点,按杀伤力排序)

坑 1:配置里写"行尾注释",注释被当成配置值 ★★★★★

这是本次事故的头号原因。Samba 的 smb.conf 不支持行尾 # / ; 注释!

写配置的人以为跟 shell 一样能行尾加注释:

ini 复制代码
[share]
   path = /home/share            #共享文件夹
   valid users = zhang    #用户名

实际 testparm -s 解析出来是:

复制代码
[share]
   path = /home/share #共享文件夹     ← 整个变成了路径,该目录根本不存在
   valid users = zhang #用户名     ← "#用户名" 也被当成一个用户

症状:Windows 端报"网络路径找不到" / 各种访问异常;服务端日志没有明显报错,因为配置"合法"只是值不对。

正确写法 :注释单独占一行,并且行首顶格或前面只有空白符都可以;就是不能写在配置项后面:

ini 复制代码
[share]
   # 下面是共享路径
   path = /home/share
   # 允许访问的用户
   valid users = zhang

自查命令

bash 复制代码
testparm -s | awk '/^$$share$$/{f=1} f{print}' | head
# 如果 path 后面拖着 # 注释,就是踩坑了

同理,; 结尾注释、多行配置拼串也要避免。中文注释尤其隐蔽------不报错,只是值悄悄变脏。

坑 2:忘了 smbpasswd -a,Samba 账号库是空的 ★★★★★

症状 :能 SSH、能 ping、Samba 进程也正常,但 Windows 连接时认证必失败;

服务端日志刷屏 pam_unix(samba:session): session closed for user nobody(全是匿名/guest 会话,没有一个认证成功的)。

原因 :Samba 用自己的账号库(默认 tdbsam,文件在 /var/lib/samba/private/passdb.tdb),

系统用户不自动等于 Samba 用户。

验证

bash 复制代码
sudo pdbedit -L     # 输出为空 = 一个 Samba 用户都没有,赶紧加

解决

bash 复制代码
sudo smbpasswd -a zhang

坑 3:共享名对不上(记忆/文档里的名字 ≠ 实际共享名)★★★★☆

症状 :用户一直连 \\IP\myshare,实际机器上共享叫 share。报"网络路径找不到"。

原因:共享被改过名 / 重装后按新命名 / 记错了。

验证:在服务器上列出真实共享名:

bash 复制代码
testparm -s | grep '^$$'          # 只看各段标题
# 输出如:[global] [printers] [share] [print$]

解决:用真实共享名连接;或如果你确实想让老名字继续可用,可以加一段别名共享:

ini 复制代码
[myshare]
   path = /home/share
   valid users = zhang
   writable = yes

客户端侧用 net view \\192.168.50.62 也能看到服务器共享列表(不一定完全可靠,受 guest 策略影响)。

坑 4:Windows 报错码对应关系不清 ★★★★☆

Windows 提示 / 错误码 常见含义 优先排查方向
系统错误 53(网络路径找不到) TCP 445 不通 / 协商失败 / 主机不可达 / 共享名不对 防火墙、服务状态、net view 对比共享名
系统错误 67(找不到网络名) 共享名不存在 `testparm -s
系统错误 5(拒绝访问) 无权限 / guest 被拒 valid users、共享目录属主、SMB 账号
系统错误 1326(用户名或密码错误) 凭据不对 smbpasswd 里账号是否存在、密码
3227320323(0xC05D0003) SMB 会话协商阶段被拒(客户端看到的重定向层错误) 先查上面 坑 1/2/3;再看服务端日志 journalctl -u smbd
0x80070035(找不到网络路径) 网络发现/445 不通 防火墙(Windows 与 Ubuntu 两侧)

错误码是"结果",不要盯着码猜原因。按链路排查:TCP 445 → 服务状态 → 配置解析 → SMB 账号 → 共享名 → 目录权限

坑 5:Windows 侧残留映射 / 缓存凭据干扰 ★★★☆☆

旧的"已断开"映射盘、凭据管理器里残留的旧密码,会让新连接反复用旧凭据,报错千奇百怪。

清理

bat 复制代码
net use * /delete /y            :: 清所有网络连接
cmdkey /list                    :: 列出凭据
cmdkey /delete:192.168.50.62    :: 删掉指定地址的缓存凭据(把 IP 换掉)
:: 重新连接:
net use Z: \\192.168.50.62\share /user:zhang abc13579

坑 6:修改配置后没 testparm、没重启 ★★★☆☆

Samba 不会热加载 smb.conf。改完必须:

bash 复制代码
sudo testparm -s && sudo systemctl restart smbd nmbd

坑 7:目录权限/属主不对 ★★★☆☆

  • 共享目录不存在 → 客户端看到共享但打开失败
  • 属主或组不对 → 认证过了但"拒绝访问"
bash 复制代码
# 一键核对
ls -ld /home/share
sudo -u zhang touch /home/share/.writetest && sudo rm /home/share/.writetest

坑 8:没开防火墙端口 ★★☆☆☆

ss -tln 能看到 445/139 监听,但 ufw 默认 deny 的话外面还是不通。

Windows 侧表现就是 error 53 / 超时。

bash 复制代码
sudo ufw allow samba && sudo ufw status

坑 9:日志全是 nobody/guest,很难看出真正问题 ★★☆☆☆

Samba 默认日志级别很低,认证失败类关键行可能被大量 session closed for user nobody 淹没。

加日志级别临时排障(排完改回来):

ini 复制代码
[global]
   log level = 3

然后看:

bash 复制代码
journalctl -u smbd --no-pager -n 100          # systemd 日志
sudo tail -f /var/log/samba/log.smbd           # 按 %m 分机器:log.192.168.50.179

坑 10:把"能 SSH"当成"配置没问题" ★★☆☆☆

SSH 用的是系统账号,Samba 用的是自己的账号库 + 自己的配置文件。

两者没有任何关系。SSH 通 ≠ SMB 通,排查时必须把 Samba 的每一层单独验证。


五、排障方法论(从症状到根因的命令链)

不依赖图形界面,全程命令行(可用 SSH 远程操作)逐层排除:

bash 复制代码
# ① 服务与进程
systemctl is-active smbd nmbd
ps -ef | grep -E '[s]mbd|[n]mbd'
ss -tln | grep -E ':(445|139)'          # 是否在听

# ② 版本与配置解析(普通用户就能跑)
smbd --version
testparm -s | grep -A8 '^\[share$$'     # 共享段"真正生效"的值
testparm -s | grep -E 'server min protocol|security|map to guest'

# ③ 账号库(需要 sudo)
sudo pdbedit -L

# ④ 日志
journalctl -u smbd --no-pager -n 50     # 看认证/会话
ls -l /var/log/samba/                   # log.<客户端机器名/IP> 按来源分文件

客户端侧(Windows)对应验证

bat 复制代码
ping 192.168.50.62
Test-NetConnection 192.168.50.62 -Port 445   :: PowerShell 测端口
net view \\192.168.50.62                      :: 看共享列表
net use \\192.168.50.62\share /user:zhang 密码

六、验证清单(全通过即 OK)

  • systemctl is-active smbd nmbd → active
  • ss -tln 看到 0.0.0.0:445 LISTEN
  • sudo pdbedit -L 有目标账号
  • testparm -s[share]path 无多余字符、valid users 干净
  • 共享目录存在且属主正确
  • Windows:net use Z: \\IP\share /user:zhang 密码 → "命令成功完成"
  • 在 Z: 下新建/删除一个文件成功(读写都验)
  • 重启 Windows 后 Z: 仍在(/persistent:yes

七、本案例复盘(一句话版)

用户连 myshare,机器上真实共享是 sharesmb.confpath/valid users 行尾被写了中文注释导致配置值被污染;Samba 账号库为空从未加过用户。

三者叠加 → Windows 一直"网络路径找不到"。

修正配置、smbpasswd -a 加账号、重启服务后,一次性连通,读写验证通过。


八、常用命令速查

bash 复制代码
sudo apt install -y samba                 # 安装
sudo smbpasswd -a <user>                  # 新增/改 Samba 账号密码
sudo pdbedit -L                           # 列出 Samba 账号
sudo pdbedit -x -u <user>                 # 删除 Samba 账号
sudo testparm -s                          # 校验并打印生效配置
sudo systemctl restart smbd nmbd          # 重启
sudo systemctl enable smbd nmbd           # 开机自启
sudo ufw allow samba                      # 防火墙放行
相关推荐
zhangzeyuaaa1 小时前
Python asyncio 事件循环演进:从手动管理到现代化实践
java·服务器·python
GeW1 小时前
每天2小时,21天闭环计划-RHCE通关时间表全公开
linux
abby1 小时前
美国多IP站群服务器Nginx配置与网络优化实操
服务器
盛世宏博智慧档案1 小时前
高速 ETC 门架外场机房温湿度远程监测解决方案
服务器·数据库·php·高度·高速·温湿度
乌恩大侠2 小时前
【Sionna】docker build ubuntu cuda
ubuntu·docker·容器·spark·o-ru·ai-ran
weixin_450813532 小时前
pdf文档转为markdown文档
linux·pdf
我的小卷呀3 小时前
Linux ip 命令底层逻辑与实战指南
linux·运维·c语言·网络协议·tcp/ip·网络安全
CingSyuan3 小时前
4U GPU服务器整机无法上电故障排查实录:通过交叉替换、逐项回装与跨槽位测试,定位RTX 4080显卡故障及硬盘槽位异常并完成临时恢复
运维·服务器
handler013 小时前
【Linux】ELF、链接与动态库,程序装载全解析
linux·运维·服务器·chrome·c·elf·文件