如何在Ubuntu上挂载SMB共享?
摘要
本文介绍在 Ubuntu 上挂载远程 SMB 共享的完整流程。首先需安装 cifs-utils 并创建挂载目录,接着准备包含账号密码的凭证文件。挂载时需指定协议版本、凭证路径及 uid/gid 参数以解决权限问题。最后,将配置写入 /etc/fstab 实现开机自启,并注意添加 _netdev 和 nofail 参数。文章还提供了常见报错的排查指南。
背景:SMB 是什么
SMB(Server Message Block,服务器消息块)是一种客户端-服务器文件共享协议,最早由 IBM 在 1984 年提出,目的是让局域网里的计算机能访问远程主机上的文件,进行读写。通过 SMB,你可以把远程机器上共享出来的目录,像本地磁盘一样"挂载"到自己系统里使用。
这里有个容易混淆的概念:CIFS。它其实是 SMB 的一个旧版本/方言(微软早期对 SMB 的实现,全称 Common Internet File System,通用互联网文件系统)。日常教程里经常 SMB / CIFS 混着写,你只要知道它们本质是同一件事、命令里经常用 cifs 这个挂载类型就行。
本文要做的,是教你用 Samba 文件服务器在 Ubuntu 上把远程的 SMB 共享挂载到本地。Samba 用的就是 SMB 协议,作用和原生 SMB 一致。前置条件是:你已经在一台远程设备上把一个目录共享出来了,下面的步骤是在你这台 Ubuntu 客户端上把这个共享目录"接"进来。
还没开共享?那一步在这篇里:Ubuntu 开启 Samba 文件共享完整教程 —— 装包、配
smb.conf、建 Samba 用户、Windows/手机访问验证,照着走一遍就有可挂载的目录了。两台机器配合使用,就是一套完整的"局域网文件互通"。
第 1 步:先更新系统、装 cifs-utils
挂载前先把系统的软件源和软件包刷新一遍,避免因包版本过旧导致后面装东西出问题:
如果提示有可升级的包,顺手升级一下:
挂载 SMB 共享需要 cifs-utils 这个工具包,直接安装:
为什么必须要它? Linux 内核里虽然已经内置了 cifs 文件系统驱动,但内核只管"怎么读写",不管"怎么拿到账号密码" —— 凭证解析、uid/gid 映射、DFS 支持这些用户态工作都打包在 cifs-utils 里(核心是 /sbin/mount.cifs)。所以没装它会直接报 mount: unknown filesystem type 'cifs'。
第 2 步:创建挂载目录
先在本地建一个空目录,作为远程共享的"挂载点",之后远程目录的内容都会映射到这里:
目录名你可以自己改,/mnt/xxx 是 Linux 挂载外部存储的惯例位置。注意挂载点目录最好是空的:如果里面有文件,挂载后这些文件会被临时"遮住"(不是被删掉,卸载后还在),容易让人以为文件丢了。
第 3 步:准备凭证文件
挂载需要用到远程共享的用户名和密码。为了避免把密码直接写在命令里(既不安全,还会留在 shell 历史里),更稳妥的做法是单独建一个凭证文件,并加上隐藏前缀 .,只允许 root 读取:
打开后填入两行,分别是你的 Samba 用户名和密码:
如果共享已经绑了域名/工作组,可以多写一行 domain=WORKGROUP。保存后,收紧该文件的权限,只允许 root 账户读取,杜绝其它非 root 账户看到密码:
文件里
example_username、example_password只是示例,记得替换成你远程设备上的真实账号密码。
多台共享可以共用一个凭证文件,只要每台机器的账号密码相同即可 —— 这样 fstab 里就不用重复写密码了。
第 4 步:挂载远程共享
凭证准备好后,用下面的命令把远程共享挂载到本地目录:
各参数含义:
-t cifs:指定用 CIFS/SMB 方式挂载。vers=3.0:指定 SMB 协议版本为 3.0(兼容性较好的通用选择)。credentials=...:指向刚才创建的凭证文件。//192.168.2.242/disk0:远程共享的地址,格式是//服务器IP/共享名。/mnt/mydisk:本地挂载点。
命令里的 IP 和共享名要替换成你实际的那一台。如果你不确定远程 Ubuntu 的 IP,可以在那台机器上执行 ip a 查看:
⚠️ 挂上去之后「只有 root 能写」,这是最经典的坑
很多人第一次挂载成功,兴冲冲去文件管理器里改文件,发现没有写权限 —— 即使服务端已经把目录设成 777。
原因在于:cifs 是有"本地属主"概念的文件系统,但它自己不带权限位,只能由一个本地用户"代为持有"。默认情况下,这个属主是发起挂载的那个用户(通常是 root)。所以普通用户看到目录属主是 root,即使服务端放开了,本地这一层就先把门关上了。
解法是在挂载时把属主和权限显式映射给本地用户:
加了 uid=1000,gid=1000,file_mode=0664,dir_mode=0775 之后,文件在本地看起来就"属于"你的账号,也就能正常读写了。记住这四个参数,能省掉大量"为什么我写不进去"的困惑。
协议版本(vers=)该怎么选
不写 vers 时,内核会自己协商;但网络设备千奇百怪,显式指定更可控:
取值 | 对应系统 | 说明 |
|---|---|---|
| 老 XP / 老式 NAS | 有 EternalBlue 漏洞风险,能不用就不用 |
| Vista / Win7 起 | 老设备兼容首选 |
| Win8 / Server 2012 | 支持加密,兼容性和安全性平衡点 |
| Win10 / Server 2016+ | 目前最优,支持预认证完整性校验 |
实践建议:先用 vers=3.0 试,能通就不用折腾;双方都是新系统可以试 3.1.1;只有老设备才退回 2.1。协商失败时通常会报 mount error(115),这时换版本号再试是最快的排查手段。
第 5 步:设置开机自动挂载
手动挂载的问题在于:重启后挂载会失效,还得重新执行一遍命令。想开机自动挂载,需要把它写进 /etc/fstab。打开这个文件:
在文件末尾追加一行(注意保持格式):
看起来很长,但每一段都有用。把 IP 和共享名替换成你自己的,保存退出。
参数 | 为什么必须有 |
|---|---|
| 告诉 systemd"这是网络设备"。没有它,系统会在网络起来之前就去挂载,直接失败 |
| 远程机器没开机/不在线时不要阻塞开机。没有它,可能开不了机、甚至掉进 emergency 模式 |
| 变成"按需挂载":第一次访问这个目录时才真正连接。开机速度不受影响 |
| 闲置 60 秒后自动卸载,网络闪断后会自动重连,不用手动干预 |
末尾 | dump 和 fsck 选项,网络文件系统一律填 |
⚠️ fstab 写错会导致系统起不来,所以改完之后一定要先做这一步验证:
mount -a 走的是和开机完全相同的流程,先在当前会话里跑通再重启,是避免"改完 fstab 开不了机"的标准做法。
第 6 步:软挂载还是硬挂载?断线时行为完全不同
这一步不常被提到,但决定了你的系统"网络抖动时会不会卡死"。
硬挂载(
hard,默认):远程断线时,任何访问该目录的操作会无限期重试。此时你敲一个ls、打开文件管理器、或者一个后台脚本踩到这个目录,进程会一直卡住不返回(连Ctrl+C都杀不掉,通常要-9)。好处是保证数据不被半途写入损坏。软挂载(
soft):超时后直接报错返回(EIO)。好处是进程不会被卡死;代价是可能返回"不完整的数据",如果应用正在写文件,可能写出损坏内容。
家用场景的折中写法:
意思是"每次请求等 2 秒(timeo 单位是 0.1 秒),重试 2 次后放弃报错"。适合只读挂载或"丢了也无所谓"的媒体库目录。如果你挂的是重要文档目录、还要往里写,建议保持 hard,接受偶尔卡一下,换取数据完整性。
第 7 步:常见的挂载报错对照表
mount.cifs 的报错码非常"言简意赅",直接对着查最快:
报错 | 真实含义 | 处理 |
|---|---|---|
| 账号密码不对,或凭证文件权限太开放 | 核对 |
| 共享名写错(或该共享没开) | 核对 |
| 主机不可达 |
|
| 协议协商失败 | 换 |
挂载成功但写入提示"只读文件系统" | 缺 | 补 |
总结
简单回顾整个流程:装 cifs-utils → 建挂载目录 → 写凭证文件(设 400 权限)→ mount 挂载(带上 uid/gid/file_mode)→ 写 fstab 实现开机自挂(带 _netdev,nofail)。虽然示例基于 Ubuntu,但这些命令是通用的,其它 Debian 系发行版基本也能直接用。
如果挂载后提示权限或 Permission denied,先分清是哪一层的问题:error(13) 是身份问题(密码/凭证文件),挂载成功但写不进去是属主问题(缺 uid/gid/file_mode)。这两类占实际报错的绝大多数,确认清楚了再回头执行一次 mount 即可。
相关文章
暂无相关文章