ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Ubuntu 22.04 配置 Samba 实现与 Windows 文件共享的完整指南

Ubuntu 22.04 配置 Samba 实现与 Windows 文件共享的完整指南 如果你手头有一台装了 Ubuntu 22.04 的机器又在 Windows 上办公多半都会遇到一个绕不开的问题文件怎么在两台机器之间传用U盘来回拷小文件还凑合大目录几十个G的时候插拔、复制、等待一遍又一遍实在折腾人。其实只要在 Ubuntu 上把 Samba 服务配好Windows 里就能像访问本地磁盘一样直接读写 Linux 上的文件不用拷贝、不用U盘整个局域网内都通。这篇文章我按自己的实际配置经验来写从最基础的 Samba 安装到权限模型、Windows 访问、映射网络驱动器再到多用户权限、限速和共享目录大小限制这种进阶需求全部走一遍。目标是让完全没接触过 Linux 服务配置的人也能照着一步步搞定踩过哪些坑我也会直接标出来。1. 为什么我建议在 Ubuntu 22.04 上用 Samba 做共享1.1 一个典型的适用场景先说一个我自己经历过的场景。家里一台不太用的旧笔记本装了 Ubuntu 22.04常年开机当文件服务器用Windows 台式机放在书房。之前每次要从 Windows 往 Ubuntu 上传资料我都是用网盘或者微信文件传输助手中转文件一大了就特别痛苦动不动还要等着上传再下载。后来把 Samba 配好之后Windows 里打开“此电脑”地址栏输入共享路径直接就进去了。该拖文件拖文件该播放视频播放视频Ubuntu 上挂着的硬盘容量也变相成了 Windows 电脑的扩展存储。这个体验和用一个“网络硬盘”几乎没有区别。所以这篇文章适合什么人看就是你手头恰好有 Ubuntu 22.04 的环境Windows 机器又在同一个局域网里想快速打通两台设备之间的文件交换通道。不管是个人用还是公司内网小办公室方法都是一套。1.2 对比 FTP、NFSSMB 到底赢在哪里很多人在决定用什么方式共享文件时会先犹豫一下。FTP 老牌但登录烦NFS 在 Linux 之间很好用但到了 Windows 上就得开启额外功能而且权限配置对新手不够友好。这里我直接给结论Windows 对 SMB/CIFS 协议的支持是系统级的从资源管理器里敲一个网络路径就能访问不需要任何客户端软件也没有“每次都要打开 FTP 工具”的心理负担。Samba 恰恰就是在 Linux 上实现了 SMB/CIFS 协议的服务端通过它Ubuntu 能被 Windows 默认的文件共享功能直接发现和访问。用表格看会更直观共享方式Windows 端使用体验Linux 端配置难度传输稳定性SMB (Samba)资源管理器直接访问开箱即用中等看懂 smb.conf 参数即可稳定适合长期挂载FTP需要专门客户端或浏览器登录简单一般断点续传依赖客户端NFS需要额外开启对应功能配置繁琐中等稳定但跨系统权限麻烦WebDAV需要映射为磁盘体验一般较复杂看网络环境从综合体验来说Windows Ubuntu 的组合里Samba 基本是首选所以后面所有内容都围绕它来展开。1.3 什么情况下不建议折腾 Samba也不是所有场景都适合用 Samba。比如你只是想临时传一次文件那不如开个临时的 HTTP 服务或者直接U盘不要为了五分钟的事情花半小时配置。再比如你对安全要求极高需要精细到“谁在什么时候访问了哪个文件”那 Samba 基础配置做不到得配合完善的日志审计方案。还有一点如果两台机器压根不在同一个内网比如你要跨公网访问家庭文件那 Samba 也不是最优选择它优先服务局域网场景。自己在内网搭共享Samba 属于最顺手的工具。2. 动手配置前必须先搞懂的权限模型2.1 系统用户和 Samba 用户不是一回事这是我第一次配置时踩得最深的一个坑。Samba 里认证的用户和你在 Ubuntu 里开机登录的用户虽然名字可以一样但密码是分开管理的。什么意思就是你在 Ubuntu 命令行里创建一个用户后还要单独用 smbpasswd 给这个用户设置 Samba 访问密码。Linux 登录密码和 Samba 访问密码完全可以不相同。有人在这里会犯糊涂觉得“我在 Ubuntu 里能登录凭什么 Windows 拿同一个密码访问不了 Samba”。原因就在这儿Samba 的用户认证依赖自己的密码数据库。不过也得注意Samba 用户必须对应一个已经存在的系统用户。你不能凭空在 Samba 里添加一个系统里不存在的人它不像网页后台那样可以脱离系统用户独立建立账号。这意味着如果你想让同事张三能访问共享就得先在 Ubuntu 上建一个张三的系统账号哪怕这个账号永远不用于 Linux 登录。2.2 共享目录本身的读写权限和 Samba 权限是叠加关系Samba 的权限判断是“双重门禁”。第一道门是 Samba 配置文件里定义的访问规则比如指定哪些用户能访问某个共享、是否能写入第二道门是 Linux 文件系统自身的权限也就是目录和文件的 owner、group、other 的 rwx 权限。很多人配置完 Samba 后遇到“能进去但写不了文件”的问题十有八九就是第二道门没打开。就算你在 smb.conf 里写了 read only no如果共享目录本身对访问用户没有写权限依然无法创建文件或修改内容。所以我在最开始规划共享目录时会先理清楚一个原则如果你希望某个目录的所有访问者都能读写那么目录的属主可以设为某个固定用户组和其他用户也要有写权限。更简单的做法是使用 smb.conf 里的 force user 参数把 Samba 的实际写入身份统一强制成一个用户这样权限问题能少一大半。具体怎么用后面第三部分我会详细写。2.3 网络和防火墙需要做的准备Ubuntu 22.04 安装好后一般默认没有开 ufw 防火墙服务但如果你的系统开启了 ufwSamba 的端口默认是没有放行的。Samba 需要监听如下端口137/UDP 和 138/UDP用于 NetBIOS 名称解析139/TCPSMB 经典会话端口445/TCP现代 SMB 直接通信端口配置前可以在 Ubuntu 终端执行以下命令放行sudo ufw allow samba或者更保险一点把对应端口分别放开sudo ufw allow 137/udp sudo ufw allow 138/udp sudo ufw allow 139/tcp sudo ufw allow 445/tcp另外要确认 Windows 和 Ubuntu 在同一个局域网网段最简单的方法就是在 Windows 的命令行里 ping 一下 Ubuntu 的 IPping 192.168.x.x如果 ping 不通后面 Samba 配得再好也白搭先把网络互通搞定再说。3. Ubuntu 22.04 上一步步配置 Samba 实战3.1 安装并启用基础服务Ubuntu 22.04 的软件源里自带 Samba安装非常方便sudo apt update sudo apt install samba samba-common-bin装完后系统会有两个核心服务一个是 smbd负责文件共享服务本身另一个是 nmbd负责 NetBIOS 名称解析主要作用是让局域网里的 Windows 可以通过主机名直接找到你的 Ubuntu 机器。建议顺手设置开机自启并启动服务sudo systemctl enable smbd nmbd sudo systemctl start smbd nmbd查看运行状态可以用sudo systemctl status smbd如果看到 active (running) 就代表服务已经起来了。这一步看着简单但很多人装完就忘记确认服务状态后面在 Windows 端怎么都连不上最后回头发现 smbd 根本没跑起来。3.2 修改 smb.conf 核心参数Samba 所有配置都集中在 /etc/samba/smb.conf 这个文件里。改配置前强烈建议先备份一份方便改坏了随时还原sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak然后打开配置文件sudo nano /etc/samba/smb.conf我先给你一个基础且能直接跑通的完整配置再去逐项解释。假设你希望共享 Ubuntu 上 /home/yourname/share 这个目录用户是 yourname[global] workgroup WORKGROUP server string Ubuntu Samba Server netbios name ubuntu-share security user map to guest Bad User smb ports 445 log file /var/log/samba/log.%m max log size 1000 socket options TCP_NODELAY deadtime 15 [myshare] comment My Shared Folder path /home/yourname/share browseable yes read only no valid users yourname create mask 0644 directory mask 0755 force user yourname force group yourname我解释一下几个关键参数理解了它们你就能自己按需改配置。首先看 [global] 段里的 security user这表示所有连接都要经过用户名和密码验证。map to guest Bad User 的作用是当客户端提供了一个不存在的用户名时系统会把它当作 guest 处理而不会直接拒绝。如果你只想让特定用户访问这个参数影响不大。netbios name ubuntu-share 是给你的 Ubuntu 机器在局域网里起一个名字后面在 Windows 端也可以直接用 \ubuntu-share\myshare 来访问。再看 [myshare] 这个共享块的参数path共享的实际目录路径必须写绝对路径。browseable yes允许 Windows 通过网络邻居发现这个共享。read only no允许读写。valid users yourname限定只有 yourname 这个用户能访问此共享。create mask 0644 和 directory mask 0755规定新建文件默认权限是 644、新建目录默认权限是 755。force user 和 force group把通过 Samba 写入的文件的属主强制指定为 yourname。这里尤其要理解 force user 的威力。假设你的共享目录属主就是 yourname访问者也是 yourname那因为权限不足导致无法写文件的问题就很少发生。如果你不给 force user系统会尝试用登录 Samba 的用户身份去写文件只要那个用户对目录没有写权限就会直接失败。3.3 创建 Samba 用户与密码假设你已经有一个系统用户 yourname 了没有的话先创建sudo useradd -m yourname然后设置 Samba 密码sudo smbpasswd -a yourname这个命令会提示你输入两次密码。注意它不会影响这个用户在 Ubuntu 系统里的登录密码它们是完全独立的。接着确保共享目录存在并设置好目录权限sudo mkdir -p /home/yourname/share sudo chown -R yourname:yourname /home/yourname/share sudo chmod -R 755 /home/yourname/share目录权限用 755 时yourname 自己是属主有完整读写权限同组和其他用户只能读取和执行。如果你希望所有通过 Samba 访问的人都能写而不仅限 yourname 一个用户需要把目录权限调整成 775 甚至 777或者给访问者统一设置系统权限。这里我建议用 775并确保访问用户的组是 yourname 所在组避免 777 带来的安全问题。3.4 重启服务并用 testparm 自检配置文件改完以后最好先检查语法是否正确testparm这个命令会读取 smb.conf 并显示最终生效的配置内容如果语法有错它会直接提示在第几行。看到没有任何报错后重启服务让配置生效sudo systemctl restart smbd nmbd一定要做这一步因为 smbd 不会自动重新加载配置文件。有些朋友改完配置后直接去 Windows 访问发现还是旧配置就是因为没重启服务。3.5 Windows 端访问和映射网络驱动器现在到你 Windows 机器上操作。按 Win R 打开运行框输入 Ubuntu 的 IP 地址加上共享名格式是\\192.168.x.x\myshare比如我的 Ubuntu IP 是 192.168.31.100就输入 \192.168.31.100\myshare回车后会弹出 Windows 安全窗口让你输入用户名和密码。这里的用户名填 yourname密码填 smbpasswd 里设置的 Samba 密码和 Ubuntu 系统登录密码无关。顺利的话资源管理器里就会打开共享目录这时你可以测试一下复制文件、新建文件夹验证写入功能是否正常。想更省事可以右键“此电脑”选择“映射网络驱动器”分配一个盘符比如 Z:把共享路径填进去并勾选“登录时重新连接”。以后打开此电脑Z 盘就直接对应 Ubuntu 上的共享目录了体验和本地磁盘差不多。4. 进阶多用户权限、限速和共享目录大小限制4.1 多个用户不同访问级别的配置很多场景下不止一个人要访问共享比如团队里有人只需要读有人需要完整读写权限。这时你可以在 smb.conf 里针对不同用户做区分。先创建对应的系统用户并都加入到同一个用户组里会更方便管理sudo useradd -m alice sudo useradd -m bob sudo smbpasswd -a alice sudo smbpasswd -a bob然后配置里可以给同一类用户建多个共享目录比如[public-readonly] path /srv/shared/readonly browseable yes read only yes valid users alice [public-write] path /srv/shared/write browseable yes read only no valid users bob也可以把一个共享内的目录权限精细到用户组层面。假设你有 alice 和 bob 两个账号都在 staff 组里想让他们都能读写同一个共享但不用给第三个用户权限可以这样写[team-share] path /srv/shared/team browseable yes read only no valid users staff create mask 0664 directory mask 0775在 valid users 里用 组名 的写法表示只允许该组的成员访问。create mask 0644 改为 0664、directory mask 0755 改为 0775主要是让同一组内的用户新建的文件也能被组内其他成员编辑否则 alice 创建的文件 bob 可能只能看不能改这类问题在团队协作时非常常见我在实际配置里没少吃这个亏。4.2 限制共享目录大小的两种思路有人会问“Samba 共享目录能不能限制大小”因为搜热词的时候看到很多人关心这个。这里明确说Samba 本身没有直接提供“把这个共享限制为 100GB”的参数但可以通过底层文件系统的手段间接实现。第一种是 Linux 磁盘配额方式。给特定用户设置 ext4 文件系统的配额比如限制 alice 最多使用 50GBsudo apt install quota sudo mount -o remount,usrjquotaaquota.user,grpjquotaaquota.group,grpquotausrquota /home再初始化配额数据库、用 edquota 设置用户的软限制和硬限制。这种方式能做但步骤比较多而且需要文件系统本身支持并不是所有分区都是 ext4。第二种是我自己更推荐、也更适合普通用户的思路把共享目录做成一个固定大小的磁盘镜像文件做法是先用 dd 创建一个文件格式化后用 loop 设备挂载把它当作一个“虚拟磁盘”路径给 Samba 用。比如创建一个 100GB 的 ext4 镜像并挂载到 /mnt/sharelimitsudo dd if/dev/zero of/srv/sharelimit.img bs1G count100 sudo mkfs.ext4 /srv/sharelimit.img sudo mkdir -p /mnt/sharelimit sudo mount -o loop,rw /srv/sharelimit.img /mnt/sharelimit这时 /mnt/sharelimit 的大小就被物理限制在 100GBSamba 把这个目录共享出去客户写入的文件总量永远不可能超过这个值。配合 /etc/fstab 设置开机自动挂载效果就是“一个 100GB 的共享盘”。第二种方式的好处是简单粗暴适合家里或小办公室文件服务器缺点是镜像文件内部如果碎片过多性能会有一定下降不过作为共享存储实际感知并不明显。4.3 传输调优的经验局域网里拷贝大文件时如果觉得速度没跑满可以在 [global] 段里加几行socket options TCP_NODELAY deadtime 15 read raw yes write raw yes这四项在网络条件正常时能明显提升小文件读写体验。另外如果你用无线网络连接传输速度还会受 Wi-Fi 信号质量影响想要稳定高速务必让 Windows 和 Ubuntu 都走有线网口我实测同一个文件无线大概 20MB/s有线能到 110MB/s 以上差距非常明显。5. 常见问题与排查技巧实录5.1 访问时提示用户名或密码错误这是我遇到最多的问题原因通常不是密码真的错了而是 Samba 用户密码没有设置。记住Ubuntu 系统密码和 Samba 密码是两套务必先执行sudo smbpasswd -a yourname如果已经设置过还是报错试试在 Windows 里进入“控制面板 → 凭据管理器 → Windows 凭据”删除掉之前保存的旧凭据再重新连接。Windows 会缓存旧密码这是非常隐蔽的坑。5.2 能看到共享目录但进不去提示没有权限这种一般是 valid users 配置和实际登录用户不匹配。检查一下 smb.conf 里对应共享的 valid users 是否包含了你访问时填写的用户如果用的是 %用户组% 方式则要确认该用户确实在对应组里。可以用 Linux 终端命令验证groups yourname如果命令输出里没有目标组就执行sudo usermod -aG staff yourname然后让用户注销重新登录 Windows 访问。5.3 能进去但只能读不能写这是文件系统权限和 Samba 权限叠加导致的典型问题。先确认 smb.conf 中 read only no再确认共享目录的 Linux 权限允许写入ls -ld /home/yourname/share如果输出是 rw-r--r--其他用户自然写不了。最简单的修复方案是开启 force user[myshare] path /home/yourname/share read only no force user yourname force group yournameforce user 会强制 Samba 以 yourname 的身份操作文件目录属主是你自然可以写。5.4 Windows 找不到 Ubuntu 主机或共享这种情况最常见的根源是 nmbd 服务没运行或者防火墙挡掉了 NetBIOS 端口。先确认服务状态sudo systemctl status nmbd再确认 ufw 状态必要时直接放行 Samba 相关端口。如果仍然看不到主机就在 Windows 运行框直接输入 IP 加共享名的方式访问跳过多播发现的过程效率更高。5.5 Samba 服务正常但传输速度很慢先排查网络物理链路再检查 smb.conf 的 socket options 是否设置。也可以在 [global] 里临时加上server min protocol SMB2Windows 10/11 默认优先使用 SMB3但在某些路由器或虚拟化环境下SMB1 的旧协议协商会导致速度异常慢。强制最低 SMB2 可以有效躲开兼容性问题。不过这个参数会影响老设备访问如果局域网里都是新系统加上很稳妥。5.6 改完配置不生效很多新手改完 smb.conf 后直接去 Windows 测试发现行为完全没变化于是怀疑配置有问题。实际上 smbd 不会热加载配置每次修改后必须重启服务sudo systemctl restart smbd nmbd另外改完配置最好跑一下 testparm它会告诉你哪里写错了省得反复重启无用。排查时也可以看日志日志位置在 [global] 里已经配置到 /var/log/samba/log.%m比如某个客户端连不上时可以查看对应的 log 文件sudo tail -f /var/log/samba/log.myshare日志里通常会直接写明拒绝原因比到处猜强得多。我自己的体会是Samba 的配置不复杂但权限模型是很多人绕不过去的坎。只要把“系统用户密码”和“Samba用户密码”分开理解把“Linux文件权限”和“Samba共享权限”看成两道叠加的门绝大多数连接失败、读写失败的问题都能迎刃而解。配置完成后建议先在 Windows 端完整测试一遍新建文件、改名、删除、复制大文件确认全部正常再把共享正式投入使用。最后分享一个小技巧如果你以后改了共享目录的路径或新增共享不用重启整个 smbd可以用一条命令重新加载配置sudo systemctl reload smbd这种平滑重载不会断开已经建立的连接对于长期开机的共享服务器来说能省很多麻烦。
返回列表