banner
约 1,800 字
6 分钟

Ubuntu开启samba文件共享

-
-
无标签

摘要

本文详细介绍了在 Ubuntu 上搭建 Samba 文件共享服务的完整流程。内容涵盖 SMB 协议原理、Linux 与 Samba 的双层身份模型、安装服务、配置共享目录及用户权限、重启服务以及跨平台访问方法。文章还提供了防火墙配置与常见排错技巧,旨在帮助用户实现局域网内多设备无缝访问文件。

前言

在一台 Ubuntu 服务器或 NAS 主机上,想让你 Windows 电脑、手机、电视直接访问里面的文件(像访问本地硬盘一样拖拽文件),最通用的办法就是开 Samba 文件共享。Samba 实现了 Windows 的 SMB/CIFS 网络文件协议,装好之后,Windows 的资源管理器地址栏敲个 \\IP 就能像打开本地文件夹一样用 Ubuntu 里的目录,几乎零学习成本。

这篇教程按完整步骤带你在一台 Ubuntu 机器上把 Samba 跑起来,从安装、配共享目录、建用户到 Windows 访问验证,一步步来,小白也能照做。

适用:Ubuntu 服务器 / 无桌面主机 / NAS 系统,想让局域网内 Windows、macOS、手机都能访问共享目录的场景。

一、先搞懂 SMB 这套协议,后面排错才不慌

SMB(Server Message Block)是局域网文件共享协议,从 1980 年代 IBM 那套 NetBIOS 一路演进到现在,大致分三代:

版本

出现时间

关键变化

SMB1

1990s

老协议,开销大、往返次数多

SMB2

2006(Vista)

大幅减少往返、支持更大的读写块

SMB3

2012(Win8)

端到端加密、多通道、持续可用

SMB1 现在是必须避开的东西,原因很直接:2017 年席卷全球的 WannaCry 勒索病毒,走的就是 SMB1 的 EternalBlue 漏洞。所以 Windows 10 1709 以后默认不再安装 SMB1 组件,现代 Samba 也默认 server min protocol = SMB2

这带来一个实际后果:如果你家里还有古董 XP 机器、老电视盒子或十年前的老打印机,它们可能连不上。 这时候你要明白这是"为了安全刻意不兼容",不是配置错了 —— 并且不应该为了迁就它们去打开 SMB1。实在必须兼容,也请只在隔离的内网里临时开,用完关掉。

顺便解释一个常被搞混的名字:CIFS。它是微软在 SMB1 时代给自己实现起的名字(Common Internet File System)。Linux 内核里挂载 SMB 的类型名至今还叫 cifs,所以你在命令里看到 cifs 不要以为是另一套协议 —— 它就是 SMB

再看端口。现代 SMB 直接跑在 445/tcp 上;历史遗留的 139/tcp(NetBIOS over TCP/IP)和 137/138/udp(名字解析)由 nmbd 这个进程负责。因为现在客户端都能直接用 IP 或 DNS 找到服务器,nmbd 基本可以不用,实际只需要 smbd 一个服务在跑。ufw allow samba 放行的是一整组(137/138/139/445),了解这个分工能帮你判断"防火墙到底开了什么"。

二、最关键的一个模型:Samba 是「两层身份」

这一点理解了,后面 90% 的权限问题都能自己推理出来。

  • Linux 层:一个真实的系统用户(/etc/passwd 里的账号),决定文件属主和 POSIX 权限

  • Samba 层:一套独立的密码库/var/lib/samba/private/passwd.tdb),由 smbpasswd -a 创建

两层是分开维护的,所以会出现这些现象:

  • smbpasswd -x akira 只删掉 Samba 密码条目,Linux 用户和文件都还在

  • userdel akira 删掉系统用户,但 Samba 密码库里可能还残留条目

  • 你从 Windows 访问共享时,服务端是按"Linux 用户 akira"的身份去读文件的 —— 跟这个用户 SSH 登录进来看到的权限一模一样

也就是说:Samba 不管权限判定,Linux 管。 这就是为什么下面用 chmod 777 能"一次解决所有问题" —— 它把 Linux 层的门整个打开了,代价是所有本机用户也都能改这个目录。

三、安装 Samba 服务

先在 Ubuntu 上安装 Samba:

纯文本
sudo apt-get install samba

安装过程中如果提示,输入 Y 确认即可。装完后 Samba 相关的服务(smbd)一般会自动就绪。

四、准备共享目录

Samba 的作用是把 Ubuntu 上的某个目录共享出去。如果你的目录已存在,可以直接跳过这步;没有的话先创建并给权限:

纯文本
# 创建共享目录
sudo mkdir /mnt/alist
# 设置目录权限(这里演示给777,生产建议按需收紧,见下文安全提示)
sudo chmod 777 /mnt/alist

说明:目录路径和权限可按需改。如果只是个人/家庭局域网内用,目录可以宽松点;但如果这台机器要暴露到外网或有重要数据,建议用 755 甚至更严,并配合 Samba 的 valid users 限制只让指定用户访问。

一个容易被忽略的坑:如果这个目录在外部挂载盘上,而且盘是 NTFS 或 exFAT,那么 chmod无效的 —— 这两种文件系统根本没有 Linux 权限位,命令执行了但不报错,权限也不会变。这种情况下必须靠挂载时的参数控制(比如 uid=1000,gid=1000,umask=022,在 /etc/fstab 里写)。用 ls -l 看属主时如果永远显示 root root 且改不动,基本就是这个问题。

五、编辑 Samba 配置

核心配置在 /etc/samba/smb.conf,用编辑器打开:

纯文本
nano /etc/samba/smb.conf

建议先在文件顶部的 [global] 段补上几条安全基线(关键,很多人只写共享段就完事):

纯文本
[global]
# 最低协议版本,杜绝 SMB1
   server min protocol = SMB2
   server max protocol = SMB3
# 禁止匿名/guest 访问(默认策略视版本而异,显式写死更稳)
   map to guest = never
# Samba 用户名不区分大小写,方便 Windows 用户
   username level = 1

然后在文件最后面追加一段共享定义,例如:

纯文本
[share]
# 共享的目录名(访问时看到的名字)
   comment = Ubuntu Share
# 要共享的本地路径
   path = /mnt/alist
# 只允许指定用户访问(强烈建议)
   valid users = akira
# 是否可写
   writable = yes
# 是否在网络邻居里可见
   browseable = yes
# 新建文件的权限掩码(默认 0744,同组人要改需调整)
   create mask = 0664
# 新建目录的权限掩码(默认 0755)
   directory mask = 0775
# 统一新文件的属组,多人共用时才需要
   force group = akira

几个关键参数的意思:

参数

作用

[share]

共享名,别人在 Windows 上看到的就是这个名字

path

真正要共享的 Ubuntu 本地目录绝对路径

valid users

允许访问的 Samba 用户名(akira 是示例,改成你自己的)

writable

yes 允许读写,no 则只读

browseable

是否在网络邻居中列出;设 no 就只能靠手输地址访问(隐蔽共享)

create mask / directory mask

通过 SMB 新建的文件/目录用什么权限

force group

强制新文件归属某个组,团队协作时避免"同组人改不了"

create maskdirectory mask 是很多人踩坑的地方。 它们的默认值是 0744 / 0755 —— 意思是"只有属主能写"。所以当多个用户共用同一个共享目录时,A 建的文件 B 改不了。把 mask 放宽到 0664 / 0775 并配 force group,同组人才能协作。注意:mask 只对通过 SMB 新建的文件生效,已有文件的权限还是得用 chmod 改。

六、创建 Samba 用户

Samba 用的是自己的一套用户密码(跟 Linux 登录密码不是一回事),需要单独创建。

如果系统里还没有对应账号,先建一个 Linux 用户(已有可跳过):

纯文本
sudo useradd akira

然后把该用户加入 Samba 并设置访问密码:

纯文本
sudo smbpasswd -a akira
# 按提示输入并确认两次密码,这就是之后登录共享目录用的密码

🔐 安全提醒:Samba 密码别设得太简单,尤其当共享目录可写、或机器在内网之外也能被访问时。也不要随意对所有人开放写权限,能设 valid users 就设上。

推荐再加一步:让这个用户也能登录系统(有时候某些客户端会在建立会话时要求),或者干脆建一个不能登录 shell 的专用账号来跑共享,降低风险:

纯文本
# 建一个不能登录的专用共享账号(-s /usr/sbin/nologin)
sudo useradd -s /usr/sbin/nologin -M shareuser
sudo smbpasswd -a shareuser

这样即使密码泄露,攻击者也没法用它 SSH 登录进来 —— 这是"共享账号"和"系统账号"分离的意义。

七、重启 Samba 服务使配置生效

纯文本
sudo service smbd restart

如果没有报错,说明配置加载成功。如果改了配置文件后没生效,多半是忘了重启这一步。

想确认配置本身有没有语法问题,可以先跑一次检查(强烈建议在重启前做):

纯文本
testparm

它会列出所有生效的参数,并在有语法错误时提示。习惯上先 testparm 再重启,能避免"改坏了服务直接起不来"。

八、测试访问

配置好后,就可以在其它设备上访问了。

Linux 访问(文件管理器地址栏输入):

纯文本
smb://192.168.2.129/

Windows 访问(Win+R 打开运行,或资源管理器地址栏输入):

纯文本
\\192.168.2.129\

输入刚才设置的 Samba 用户名和密码,就能看到 [share] 共享目录,像本地磁盘一样读写文件了。上面的 IP 换成你 Ubuntu 机器的实际局域网 IP。

🔧 排错

  • 连不上/超时:先确认两台设备在同一局域网;再检查 Ubuntu 防火墙是否放行 SMB。UFW 放行可执行 sudo ufw allow samba 或放行 445 端口。

  • 提示权限不足/无权限写入:检查目录权限(chmod)和 writable 是否设了 yes,以及访问用户是否在 valid users 里。

  • 能连上但看不到共享:确认 smb.conf 里没有语法错误,重启服务后再试。

  • Windows 提示"你不能访问此共享文件夹"(错误 0x80070035):多半是网络发现/凭据缓存问题。可以先 net use \\192.168.2.129\share /delete 清掉旧凭据,再用 IP(而不是主机名)访问。

  • macOS 挂载后写不进:macOS 会额外在目录里生成 ._xxx.DS_Store 这类元数据文件。要抑制它们,可以在共享段里加 vfs objects = fruitfruit:metadata = stream

手机端也能直接访问:Android 用支持 SMB 的文件管理器(如 Solid Explorer、Material Files),iOS 用系统「文件」App → 右上角「连接服务器」→ 填 smb://192.168.2.129。这是把 NAS 当家庭相册/影音库最省事的办法,不需要装任何客户端。

扩展:常用管理命令

把常用的 Samba 用户管理命令也列出来备用:

纯文本
# 查看 Samba 服务中已有的用户
sudo pdbedit -L

# 删除 Samba 服务里的某个用户(不影响Linux账号)
sudo smbpasswd -x 用户名

# 修改某个 Samba 用户的密码
sudo smbpasswd 用户名

# 删除 Linux 用户
sudo userdel 用户名

# 删除 Linux 用户并连同其家目录等所有信息
sudo userdel -r 用户名

改完配置后,最常打交道的两条命令就是 testparm(检查)和 sudo service smbd restart(生效),记住这一对基本够用。

结尾

Samba 是 Linux 和 Windows 之间文件共享最成熟的方案,配置其实就"装包 + 配 conf + 建用户 + 重启"四步。配好之后,Ubuntu 上的目录就能像网络硬盘一样被全家设备访问,做下载目录共享、NAS 文件互通都很方便。

如果你是第一次配、卡在某一步连不上,优先检查防火墙放行目录权限这两个最常出问题的地方。有问题欢迎评论区交流。

反过来的需求也很多:这台 Ubuntu 要去访问别人已经开好的 SMB 共享(比如另一台 NAS、或另一台 Windows 上共享出来的目录),那时候用到的不是 Samba 服务端,而是 cifs-utils 客户端和一套挂载参数,是完全不同的一条路:在 Ubuntu 上挂载 SMB 共享:从临时挂载到开机自动挂载

END

相关文章

暂无相关文章