ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ubuntu 20.04 下 Samba 安装配置与跨平台文件共享实践

Ubuntu 20.04 下 Samba 安装配置与跨平台文件共享实践 在实际办公环境里Windows 和 Linux 两台机器之间互传文件说得文雅点叫“协同工作”说难听点就是“用 U 盘倒腾”。我接手过不少小团队的运维和开发环境最常用的解法就是 Samba。它能把 Linux 下的目录直接映射成 Windows 的网络驱动器双击就能进跟本地磁盘一样使不用装客户端不用走 Git更不用每次 scp 敲一长串命令。这篇就来记录一次完整的 Ubuntu 20.04 环境下的 Samba 安装配置过程。内容覆盖需求拆解、核心配置、权限踩坑、Windows/Linux 双端连接验证以及排查实录。适合刚入行的运维、混用双系统的开发以及想在 NAS 或者旧电脑上做文件共享的朋友参考。我尽量把每个操作背后的原因写清楚避免你看完照抄一遍换台机器又跪了。1. 项目背景与需求梳理1.1 项目痛点跨平台文件协作的三种常见解法在讲 Samba 之前先聊清楚一个问题为什么跨平台共享文件这件事看起来简单实际做起来总是别扭。最常见的解法无非三种。第一种是走 Git 仓库代码文件没问题但设计稿、压缩包、数据库备份这些二进制大文件推来拉去非常痛苦而且强制改变了团队的工作习惯。第二种是走云盘或网盘中转小文件还行内网环境下绕一大圈外网再回来延迟高且受带宽限制。第三种就是 U 盘和移动硬盘“人肉同步”偶尔传一次没问题但如果共享的目录是团队共用的、每天都要访问的这方式根本不成立。Samba 解决的就是内网环境下多种操作系统之间直接共享文件这个事。它实现了 SMB/CIFS 协议——Windows 原生支持的网络文件共享协议。Linux 装上 Samba 服务端之后在 Windows 的资源管理器地址栏输入\\服务器IP\共享名就能像访问局域网里的另一台 Windows 电脑一样直接读写 Linux 上的文件。反过来从 Linux 访问 Windows 共享目录用mount -t cifs也能实现。1.2 为什么选择 Samba 而不是 NFS 或 FTP如果是纯 Linux 环境NFS 性能更好配置也更简洁。但现实是团队里总有 Windows 机器NFS 在 Windows 上是出了名的难配虽然 Win10/11 企业版自带 NFS 客户端但挂载起来麻烦还经常遇到权限和编码问题。FTP 也能传文件但它是“上传/下载”模型不支持文件锁定。你打开一个 Excel 表格编辑完保存FTP 会把整个文件重新传一遍如果多人同时操作同一个文件后保存的人会静默覆盖前面人的修改最终导致文件损坏。Samba 是文件系统级别的共享支持文件锁多个用户同时访问同一目录时系统层面会处理冲突这才是“协同工作”而不是“轮流拷贝”。所以结论很直接在内网混合操作系统环境下Samba 是最成熟、兼容性最好、部署成本最低的方案。Windows 端零客户端Linux 端也原生支持这就是它至今仍是办公网络主力协议的原因。2. Samba 核心原理与安装前准备2.1 SMB/CIFS 协议的工作方式简述Samba 的核心是 SMBServer Message Block协议。早期版本叫 CIFS后来微软在 Windows 2000 之后演进出了 SMB 2.0、SMB 3.0性能和安全都大幅提升。Samba 从 4.x 版本开始完整支持 SMB 3.0包括多通道、加密等特性。通信模型是经典的客户端-服务器模式。Samba 服务端监听 TCP 139 和 445 端口139 是 NetBIOS Session 服务主要用于旧版 Windows 和部分早期客户端445 是直接承载 SMB 流量的端口现代 Windows 客户端默认走 445。配置防火墙时这两个端口都要放行。Samba 的访问控制分两层先通过 SMB 协议层的用户认证也就是 Samba 用户独立于系统用户再通过 Linux 文件系统的权限控制读、写、执行权限和属主属组。这两层必须同时通过才能正常访问。很多人配置完发现能连上但写不进去多半是第二层出了问题后面我会专门展开。2.2 安装前必须确认的环境信息安装前先把环境摸清楚能省掉后面一大半麻烦。第一步是确认 Ubuntu 版本和内核。我这台机器是 Ubuntu 20.04.6 LTS内核 5.4 系列。不同版本安装命令完全一样但软件源里的 Samba 版本有差异20.04 自带的是 4.11 系列支持 SMB 3.0 和 SMB 2.1满足日常办公和开发场景没有问题。第二步是确认 IP 地址和主机名。规划共享方案之前最好给服务器设置静态 IP。如果 IP 是 DHCP 分配的Windows 端可能过几天就连不上了——DHCP 租约到期后地址变了。设置静态 IP 的方式在 Ubuntu 20.04 下推荐用 netplan 修改 YAML 配置文件位于/etc/netplan/目录下修改后执行sudo netplan apply生效。第三步是确认 Windows 端的工作组名称。Windows 10/11 默认工作组是WORKGROUPUbuntu 的 smb.conf 默认也是WORKGROUP。这个一般不需要改但如果你的企业网络用了自定义域名或工作组名那么 smb.conf 里的workgroup参数必须和 Windows 端保持一致否则网上邻居可能刷不出来。3. Ubuntu 20.04 下安装与配置 Samba3.1 安装 Samba 服务端和客户端工具安装过程本身没什么难度但建议把客户端工具也一起装上调试排错的时候非常有用sudo apt update sudo apt install -y samba smbclientsamba是服务端主程序smbclient是命令行客户端它可以在不挂载的情况下直接列出远程共享、上传下载文件排查权限问题特别方便。安装完成后先验证一下服务状态sudo systemctl status smbd nmbdsmbd负责文件共享和打印服务nmbd负责 NetBIOS 名称解析就是让其他机器能通过主机名找到这台服务器。两个服务都应该显示 active (running)。如果状态不对多半是端口被占用或者配置文件语法有误用sudo journalctl -u smbd -n 50看日志。3.2 核心配置文件 smb.conf 逐项解读Samba 的配置文件是/etc/samba/smb.conf结构分全局配置段和共享定义段。默认文件很冗长大部分是注释我直接讲需要关注的核心参数。全局段[global]里最常用的是这几项[global] workgroup WORKGROUP server string %h server (Samba, Ubuntu) security user map to guest Bad Userworkgroup上面说过了保持和 Windows 工作组一致。security user是默认也是最安全的模式表示每个连接都必须通过 Samba 用户认证map to guest Bad User允许匿名用户以 guest 身份访问被标记为guest ok yes的共享目录这是为了方便访客访问而保留的灵活性。共享定义段就是你自己要开放的目录。举个例子我要把/srv/share共享给办公室所有人允许读写配置如下[share] path /srv/share browseable yes writable yes valid users zhangsan, lisi create mask 0644 directory mask 0755path是实际目录路径browseable控制是否在网络邻居中显示writable控制是否允许写入valid users限制了只有这些 Samba 用户能访问。create mask和directory mask决定新建文件和目录的默认权限前者 0644 代表用户读写、其他用户只读后者 0755 代表用户完全控制、组和其他人可读可执行。有多个用户时可用组名来引用 Unix 用户组比如valid users staff。3.3 配置文件的语法检查与生效操作修改完 smb.conf 后在重启服务之前一定先跑一遍内置的语法检查命令testparm这个命令会打印出最终的生效配置同时标出非法参数和拼写错误。如果输出末尾有Loaded services file OK.就说明语法没问题。确认无误后重启服务sudo systemctl restart smbd nmbd重启后不要急着走用smbclient先本地测试一次smbclient -L localhost -U zhangsan它会提示输入密码验证通过后列出本机所有共享。能列出说明基本配置生效了接下来再逐层解决权限问题。4. 用户认证与权限管理详解4.1 Samba 独立用户体系与密码设置Samba 的认证体系独立于 Linux 系统用户这意味着两件事第一必须存在对应的 Linux 系统用户Samba 才能映射到它的文件权限上第二Samba 密码和系统登录密码没有关系要单独设置。给已存在的系统用户设置 Samba 密码命令如下sudo smbpasswd -a zhangsan执行后按提示输入两次密码。如果用户不存在需要先用系统命令创建sudo useradd -m zhangsan sudo smbpasswd -a zhangsan注意-a参数是添加用户修改已有用户密码时不需要。查看当前 Samba 用户列表sudo pdbedit -L4.2 Linux 文件系统权限与 Samba 权限的叠加关系很多人在这里栽跟头。Samba 权限 SMB 认证通过 Linux 文件权限通过两者是 AND 关系缺一不可。举例说明。共享目录/srv/share的所有者是 root权限是 755那么普通用户 zhangsan 在 Samba 里即使有writable yes写入时仍然会收到NT_STATUS_ACCESS_DENIED。原因很简单zhangsan 对目录没有写权限。解决方案是调整目录的属主或权限sudo chown -R zhangsan:zhangsan /srv/share或者把团队用户加入同一个用户组用组权限来控制sudo chgrp -R staff /srv/share sudo chmod -R 0775 /srv/share我个人习惯在共享目录用专门的用户组管理而不直接改 777。777 确实省事但任何用户都能读写删跟没有权限控制一样碰上新装的安全软件扫描还会把它当风险项报出来。用 0775 组控制安全性和便利性都能兼顾。4.3 多用户共享场景的权限规划团队场景下我的推荐做法是这样的。建一个专用系统用户作为共享目录的管理员再建一个用户组把团队成员都加进去然后用组权限控制读写sudo useradd -r -M sharedadmin sudo groupadd sharedteam sudo usermod -aG sharedteam zhangsan sudo usermod -aG sharedteam lisi sudo mkdir -p /srv/share sudo chown sharedadmin:sharedteam /srv/share sudo chmod 0775 /srv/share这样配置后管理员有完全控制权团队成员可以读写外部用户不可见。每个需要访问的用户再执行sudo smbpasswd -a 用户名设置 Samba 密码即可。这种结构的好处是后期加人减人只改组关系不用改目录权限。5. 客户端连接验证与自动化挂载5.1 Windows 端连接与映射网络驱动器Windows 端连接异常简单。在文件资源管理器地址栏输入\\192.168.1.100\share回车输入刚才配置的 Samba 用户名密码共享目录就打开了。如果希望像本地磁盘一样长期使用右键“此电脑”选择“映射网络驱动器”或者命令行net use Z: \\192.168.1.100\share /user:zhangsan *星号表示手动输入密码。输入后会提示输入密码之后每次打开资源管理器Z 盘都在。Windows 端备份登录凭据时建议在“管理 Windows 凭据”里添加一条把 IP 地址、用户名、密码存好避免每次重连都弹认证框。只要密码不包含特殊字符基本不会再出问题。5.2 Linux 端挂载 Samba 共享Linux 挂载 Windows 共享目录用到的是 cifs-utils 工具包sudo apt install -y cifs-utils sudo mkdir -p /mnt/share sudo mount -t cifs //192.168.1.100/share /mnt/share -o usernamezhangsan,uid1000,gid1000uid和gid指定挂载后文件在本机显示的属主和属组否则挂载后所有文件默认显示为 root普通用户无法写入。要永久挂载编辑/etc/fstab加一行//192.168.1.100/share /mnt/share cifs usernamezhangsan,password123456,uid1000,gid1000,iocharsetutf8,file_mode0755,dir_mode0755 0 0file_mode和dir_mode设置挂载点内文件和目录的默认权限iocharsetutf8解决中文文件名乱码的问题。把密码明文写在 fstab 里有风险可以用credentials/etc/samba/credentials指向一个权限为 600 的凭据文件。5.3 开机自启与断线重连的优化Samba 服务端默认开机自启但 Windows 端映射的网络驱动器在系统重启或者网络波动后有概率出现“红叉”断开。处理办法是在 Windows 的计划任务里加一个启动时自动net use Z: ...的任务或者写一个简单的批处理脚本放到启动文件夹。Linux 客户端挂载如果出现断线普通mount不会自动重连。fstab 里加上_netdev选项让系统在网络就绪后再挂载避免开机时网络未初始化导致挂载失败。生产环境要求更高的话可以用systemd的自动挂载单元设定MountTimeoutSec和重试策略但这类多属于进阶需求我这里不展开写。6. 常见问题与排查技巧实录6.1 网络层排查ping、端口、防火墙Samba 连接不上第一步先分清是网络层问题还是服务层问题。在 Windows 上 ping Linux 服务器 IP通了再检查端口# Linux 上查看端口监听状态 sudo ss -tlnp | grep -E 139|445输出应显示 smbd 在监听 0.0.0.0:445 和 0.0.0.0:139。如果没有服务没起来。如果服务正常但 Windows 连接超时查防火墙sudo ufw status sudo ufw allow sambaallow samba会自动放行 137/138/139/445 端口。装了云服务器自带的安全组策略的话控制台里也要放行相应端口。6.2 认证与权限类报错对照与处理NT_STATUS_ACCESS_DENIED是最常见的报错原因归纳起来有三种Samba 密码错误、Linux 文件权限不够、共享定义中valid users没包含当前用户。处理顺序建议是先看 smb.conf 里用户是否在白名单里再用smbclient //服务器/共享 -U 用户名测试认证如果认证过但一写入就报错去 Linux 端检查目录的属主和组权限。NT_STATUS_BAD_NETWORK_NAME表示共享名不存在通常是 smb.conf 里写错了[share]段的名称或者忘了重启服务。用smbclient -L localhost -U 用户名列出所有共享名对照输入就知道问题在哪了。NT_STATUS_LOGON_FAILURE则是纯认证失败排查顺序用户名是否存在、Samba 密码是否设置过、密码是否输错。注意 Windows 有时会缓存旧凭据试过所有正确密码都失败时到“凭据管理器”里删掉旧记录重试。6.3 性能与稳定性优化实践Samba 默认配置在千兆内网下能跑到八九十兆每秒但如果文件传输速度个位数 MB/s说几个排查方向。第一确认双方网卡协商速率。Linux 端用ethtool eth0查看 Speed 和 DuplexWindows 端在网卡属性里看“链接速度”。百兆网卡怎么优化都白搭。第二检查 smb.conf 里是否限制过socket options。老教程喜欢加socket options TCP_NODELAY IPTOS_LOWDELAY SO_RCVBUF131072 SO_SNDBUF131072这个参数在新版本内核里并不必要TCP/IP 协议栈已经自动管理这些缓冲手动指定反而可能造成性能下降。实测下来去掉这些选项、保持默认反而更稳定。第三如果并发用户多、访问量大检查磁盘本身类型。Samba 本身 CPU 开销很低瓶颈通常在磁盘 IO 和网络。机械硬盘阵列的随机读写性能是硬伤大量小文件场景可以试试在 smb.conf 里加veto files /Thumbs.db/desktop.ini/把 Windows 生成的元文件过滤掉减少不必要的磁盘写入。6.4 中文文件名乱码的根治方法中文乱码问题在 20.04 上其实已经很少出现。Samba 4.x 默认使用 UTF-8 编码Windows 10/11 默认也使用 UTF-8 编码只要两边区域设置一致不会出问题。乱码通常发生在 Linux 目录下存在旧编码如 GBK创建的文件时。解决思路是让 Samba 自动转换显示编码在 smb.conf 的[global]段加上dos charset CP936 unix charset UTF-8 display charset UTF-8dos charset是 Samba 向 Windows 客户端声明使用的编码unix charset是 Linux 端文件系统层面的编码。头像 20.04 默认 unix charset 已经是 UTF-8多数情况下不需要手动改。如果已经出现乱码文件用convmv工具批量转编码方向是从 GBK 转到 UTF-8转之前先--test预览一下再动手。6.5 多用户并发写同一个文件会怎样办公室最常见的场景是多个 Excel 文件同时被几个人编辑。Samba 通过oplocksopportunistic locks机会锁机制实现文件锁定。简单说当用户 A 打开文件后Samba 会通知用户 B 稍等B 打开文件时收到“文件被占用以只读方式打开”的提示防止两个人同时写导致文件损坏。默认配置下这个机制是开启的不需要手动调整。唯一要注意的是如果在 smb.conf 里为了“提升性能”加了kernel oplocks no或者oplocks no同时编辑文件时确实会出现文件覆盖。除非你明确知道自己在干什么否则不要动这些参数。7. 安全加固与访问控制进阶7.1 共享目录的访问来源限制不讲究安全的话Samba 默认允许局域网内所有机器访问所有共享。稍微讲究一点限制来源 IP 是必须的。在 smb.conf 的[global]段配置hosts allow 127.0.0.1 192.168.1. 192.168.2. hosts deny 0.0.0.0/0hosts allow里 192.168.1. 这种写法表示整个 C 段网段LOCALHOST 必须保留否则本机 smbclient 测试都过不去。顺序是 allow 先生效deny 后生效deny 所有意味着只有 allow 列表里的能访问。这在需要严格隔离的场景里非常有用。7.2 密码强度与账号停用策略smbpasswd -a设置密码时Samba 默认不强制复杂度但可以在/etc/samba/smb.conf里配置min password length 8。另外定期检查无效账号sudo pdbedit -L -v | grep -E Unix username|Account Flags账号离职后记得立即删除 Samba 账号sudo smbpasswd -x 用户名同时移除系统用户或从共享组中剔除避免僵尸账号成为安全隐患。7.3 配置文件修改的统一回滚方案反复改 smb.conf 总有改错的概率我习惯改之前先备份sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak.$(date %F)改坏了直接sudo cp /etc/samba/smb.conf.bak.2025-01-01 /etc/samba/smb.conf sudo systemctl restart smbd nmbd。这一招虽然老土但实测下来比任何配置管理工具都直接。另外可以在 crontab 里加一条每周任务自动备份当前配置中间它的运维痕迹和内容的安全性。8. 写在最后的一点个人体会Samba 这个东西配置本身并不复杂真正考验人的是权限链路和网络环境的理解。我在第一次做跨平台共享时也踩过不少坑最深刻的体会是不要一上来就改配置先把“谁能访问、访问后能做什么、哪个目录给了谁”这层关系理清楚再动手写 smb.conf。还有一个被很多人忽略的点Samba 升级后配置文件格式可能有变化。Ubuntu 20.04 的 4.11 版本迁移到新版时旧的security share等写法已被彻底移除如果照搬老教程配置服务根本起不来。遇到这种感觉“明明跟教程一样但就是不行”的情况先看服务日志journalctl -u smbd -n 50会直接告诉你哪里不对。最后再说一句实在话。如果你只是为了临时传个文件Samba 可能不是最高效的方案——Python 起个 HTTP 服务更快。但如果你要做的是让 Windows 和 Linux 长期共存、稳定协同那 Samba 依然是目前最值得投入时间去配置的工具。配好之后它在内网里安安静静跑几个月半年不用管这种省心的感觉就是值得的回报。
返回列表