banner
约 1,800 字
6 分钟

如何在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

挂载前先把系统的软件源和软件包刷新一遍,避免因包版本过旧导致后面装东西出问题:

纯文本
sudo apt update

如果提示有可升级的包,顺手升级一下:

纯文本
sudo apt upgrade

挂载 SMB 共享需要 cifs-utils 这个工具包,直接安装:

纯文本
sudo apt install cifs-utils

为什么必须要它? Linux 内核里虽然已经内置了 cifs 文件系统驱动,但内核只管"怎么读写",不管"怎么拿到账号密码" —— 凭证解析、uid/gid 映射、DFS 支持这些用户态工作都打包在 cifs-utils 里(核心是 /sbin/mount.cifs)。所以没装它会直接报 mount: unknown filesystem type 'cifs'

第 2 步:创建挂载目录

先在本地建一个空目录,作为远程共享的"挂载点",之后远程目录的内容都会映射到这里:

纯文本
sudo mkdir /mnt/mydisk

目录名你可以自己改,/mnt/xxx 是 Linux 挂载外部存储的惯例位置。注意挂载点目录最好是空的:如果里面有文件,挂载后这些文件会被临时"遮住"(不是被删掉,卸载后还在),容易让人以为文件丢了。

第 3 步:准备凭证文件

挂载需要用到远程共享的用户名和密码。为了避免把密码直接写在命令里(既不安全,还会留在 shell 历史里),更稳妥的做法是单独建一个凭证文件,并加上隐藏前缀 .,只允许 root 读取:

纯文本
sudo nano /root/.examplecredentials

打开后填入两行,分别是你的 Samba 用户名和密码:

纯文本
username=example_username
password=example_password

如果共享已经绑了域名/工作组,可以多写一行 domain=WORKGROUP。保存后,收紧该文件的权限,只允许 root 账户读取,杜绝其它非 root 账户看到密码:

纯文本
sudo chmod 400 /root/.examplecredentials

文件里 example_usernameexample_password 只是示例,记得替换成你远程设备上的真实账号密码。

多台共享可以共用一个凭证文件,只要每台机器的账号密码相同即可 —— 这样 fstab 里就不用重复写密码了。

第 4 步:挂载远程共享

凭证准备好后,用下面的命令把远程共享挂载到本地目录:

纯文本
sudo mount -t cifs -o rw,vers=3.0,credentials=/root/.examplecredentials //192.168.2.242/disk0 /mnt/mydisk

各参数含义:

  • -t cifs:指定用 CIFS/SMB 方式挂载。

  • vers=3.0:指定 SMB 协议版本为 3.0(兼容性较好的通用选择)。

  • credentials=...:指向刚才创建的凭证文件。

  • //192.168.2.242/disk0:远程共享的地址,格式是 //服务器IP/共享名

  • /mnt/mydisk:本地挂载点。

命令里的 IP 和共享名要替换成你实际的那一台。如果你不确定远程 Ubuntu 的 IP,可以在那台机器上执行 ip a 查看:

纯文本
ip a

⚠️ 挂上去之后「只有 root 能写」,这是最经典的坑

很多人第一次挂载成功,兴冲冲去文件管理器里改文件,发现没有写权限 —— 即使服务端已经把目录设成 777

原因在于:cifs 是有"本地属主"概念的文件系统,但它自己不带权限位,只能由一个本地用户"代为持有"。默认情况下,这个属主是发起挂载的那个用户(通常是 root)。所以普通用户看到目录属主是 root,即使服务端放开了,本地这一层就先把门关上了。

解法是在挂载时把属主和权限显式映射给本地用户:

纯文本
# 先查你自己的 uid / gid
id
# 输出类似 uid=1000(akira) gid=1000(akira)

# 挂载时带上 uid/gid 和权限位
sudo mount -t cifs -o rw,vers=3.0,credentials=/root/.examplecredentials,uid=1000,gid=1000,file_mode=0664,dir_mode=0775 //192.168.2.242/disk0 /mnt/mydisk

加了 uid=1000,gid=1000,file_mode=0664,dir_mode=0775 之后,文件在本地看起来就"属于"你的账号,也就能正常读写了。记住这四个参数,能省掉大量"为什么我写不进去"的困惑。

协议版本(vers=)该怎么选

不写 vers 时,内核会自己协商;但网络设备千奇百怪,显式指定更可控

取值

对应系统

说明

1.0

老 XP / 老式 NAS

有 EternalBlue 漏洞风险,能不用就不用

2.0 / 2.1

Vista / Win7 起

老设备兼容首选

3.0

Win8 / Server 2012

支持加密,兼容性和安全性平衡点

3.1.1

Win10 / Server 2016+

目前最优,支持预认证完整性校验

实践建议:先用 vers=3.0,能通就不用折腾;双方都是新系统可以试 3.1.1;只有老设备才退回 2.1。协商失败时通常会报 mount error(115),这时换版本号再试是最快的排查手段。

第 5 步:设置开机自动挂载

手动挂载的问题在于:重启后挂载会失效,还得重新执行一遍命令。想开机自动挂载,需要把它写进 /etc/fstab。打开这个文件:

纯文本
sudo nano /etc/fstab

在文件末尾追加一行(注意保持格式):

纯文本
//192.168.2.242/disk0 /mnt/mydisk cifs vers=3.0,credentials=/root/.examplecredentials,uid=1000,gid=1000,file_mode=0664,dir_mode=0775,_netdev,nofail,x-systemd.automount,x-systemd.idle-timeout=60 0 0

看起来很长,但每一段都有用。把 IP 和共享名替换成你自己的,保存退出。

参数

为什么必须有

_netdev

告诉 systemd"这是网络设备"。没有它,系统会在网络起来之前就去挂载,直接失败

nofail

远程机器没开机/不在线时不要阻塞开机。没有它,可能开不了机、甚至掉进 emergency 模式

x-systemd.automount

变成"按需挂载":第一次访问这个目录时才真正连接。开机速度不受影响

x-systemd.idle-timeout=60

闲置 60 秒后自动卸载,网络闪断后会自动重连,不用手动干预

末尾 0 0

dump 和 fsck 选项,网络文件系统一律填 0 0(不备份、不检查)

⚠️ fstab 写错会导致系统起不来,所以改完之后一定要先做这一步验证:

纯文本
# 让系统按 fstab 的配置重新挂载所有条目,有错会立刻报出来
sudo mount -a

mount -a 走的是和开机完全相同的流程,先在当前会话里跑通再重启,是避免"改完 fstab 开不了机"的标准做法。

第 6 步:软挂载还是硬挂载?断线时行为完全不同

这一步不常被提到,但决定了你的系统"网络抖动时会不会卡死"。

  • 硬挂载(hard,默认):远程断线时,任何访问该目录的操作会无限期重试。此时你敲一个 ls、打开文件管理器、或者一个后台脚本踩到这个目录,进程会一直卡住不返回(连 Ctrl+C 都杀不掉,通常要 -9)。好处是保证数据不被半途写入损坏

  • 软挂载(soft:超时后直接报错返回(EIO)。好处是进程不会被卡死;代价是可能返回"不完整的数据",如果应用正在写文件,可能写出损坏内容。

家用场景的折中写法:

纯文本
soft,timeo=20,retrans=2

意思是"每次请求等 2 秒(timeo 单位是 0.1 秒),重试 2 次后放弃报错"。适合只读挂载或"丢了也无所谓"的媒体库目录。如果你挂的是重要文档目录、还要往里写,建议保持 hard,接受偶尔卡一下,换取数据完整性。

第 7 步:常见的挂载报错对照表

mount.cifs 的报错码非常"言简意赅",直接对着查最快:

报错

真实含义

处理

mount error(13): Permission denied

账号密码不对,或凭证文件权限太开放

核对 username/password;确认 chmod 400;确认该用户在服务端 valid users

mount error(2): No such file or directory

共享名写错(或该共享没开)

核对 //IP/共享名,共享名区分大小写

mount error(112): Host is down

主机不可达

ping 一下;检查防火墙 445 端口;确认服务端 smbd 在跑

mount error(115): Operation now in progress

协议协商失败

vers= 试(3.0 → 2.1 → 1.0)

挂载成功但写入提示"只读文件系统"

rw,或 file_mode 太严

rwuid/gid/file_mode

总结

简单回顾整个流程:cifs-utils → 建挂载目录 → 写凭证文件(设 400 权限)→ mount 挂载(带上 uid/gid/file_mode)→ 写 fstab 实现开机自挂(带 _netdev,nofail。虽然示例基于 Ubuntu,但这些命令是通用的,其它 Debian 系发行版基本也能直接用。

如果挂载后提示权限或 Permission denied,先分清是哪一层的问题:error(13) 是身份问题(密码/凭证文件),挂载成功但写不进去是属主问题(缺 uid/gid/file_mode。这两类占实际报错的绝大多数,确认清楚了再回头执行一次 mount 即可。

END

相关文章

暂无相关文章