在 Ubuntu 中持久挂载 CIFS 共享:凭据、用户映射与启动排障

来源:Canonical / Ubuntu Server 文档贡献者,How to mount CIFS shares permanently。原页标注最后更新于 2026 年 6 月 26 日。本文为经授权的中文翻译整理,编辑修正均在对应位置说明。

当 Ubuntu 需要持续访问 Windows 文件服务器或 Samba 共享时,可以把远端共享挂载到本地目录,并把挂载规则写入 /etc/fstab。系统启动后会按规则尝试连接,应用就可以通过固定路径访问共享文件。

这里讲的是共享的客户端挂载,不是创建 Samba 服务端。开始前,应先确认网络、服务端名称解析、共享名称及账号访问权限。原文使用以下示例名称:本地用户 ubuntuusername,远端用户 msusername,服务器 servername,共享 sharename,挂载点 /media/windowsshare。它们都需要替换成实际环境的值。

Ubuntu 通过 fstab 指定挂载点和权限为 600 的凭据文件,向 Windows 或 Samba 服务器认证后挂载共享;网络、账号和身份映射分别影响挂载结果。
依据 Ubuntu 文档自行绘制的挂载流程示意图。制图:未完纪。

安装客户端,建立独立的挂载目录

sudo apt-get install cifs-utils
sudo mkdir /media/windowsshare

每个共享应使用自己的挂载点。挂载以后,目录中原有的本地内容会被挂载视图遮住,因此应先确认这个路径的用途,而不是随意选择已有业务目录。上述命令会安装软件并创建系统目录,需要管理员权限。

来宾共享:只适用于明确允许匿名访问的服务

对于确实不需要密码的共享,原文给出的 fstab 条目是:

//servername/sharename /media/windowsshare cifs guest,uid=1000 0 0

guest 表示按来宾方式连接;uid=1000 指定本地显示的所属用户。这里的 1000 只是示例,不代表所有机器上正确的用户。远端 ACL 仍然决定服务器允许哪些文件操作,本地显示的所有者不能绕过远端权限。

如果共享路径中有空格,在 fstab 中用 \040 表示,例如 //servername/My\040Documents。保存条目后,可单独尝试挂载这个目录:

sudo mount /media/windowsshare

安全边界:来宾条目只说明如何访问已经允许匿名使用的共享。不要为了让挂载成功,就把原本受保护的共享改成来宾访问。

密码共享:不要把密码直接写入 fstab

原文展示了在挂载选项中写 username=msusername,password=mspassword 的办法,随即说明它不合适:/etc/fstab 通常所有本地用户都能读取,密码也会随之暴露。本稿将它保留为反例说明,不提供带明文密码的可复制整行配置。

更合适的做法是把凭据放在只允许所属用户读取和修改的文件里,例如 /home/ubuntuusername/.smbcredentials。文件内容为:

username=msusername
password=在本机安全编辑器中填写真实密码

不要把这里的说明文字当作实际密码;也不要通过会进入 shell 历史的命令行参数填入真实秘密。原文使用 gedit 编辑文件,服务器没有图形桌面时,可用自己熟悉的本地文本编辑器。文件建好后收紧权限:

chmod 600 ~/.smbcredentials

编辑补注:最好在写入秘密之前就确认目标文件权限为 600、文件归属正确。凭据文件仍是明文存储,600 只限制普通本地用户访问,不能防止 root、失窃备份或被攻陷的账号读取。不要把它提交到代码仓库。

用管理员权限编辑 /etc/fstab,添加:

//servername/sharename /media/windowsshare cifs credentials=/home/ubuntuusername/.smbcredentials 0 0

再单独运行 sudo mount /media/windowsshare,检查挂载是否成功。只有在手动挂载正常之后,才适合安排重启验证。远端服务器离线或启动时网络尚未准备好,都可能让自动挂载失败,甚至影响启动流程。本文没有在真实服务器上完成这些测试。

让本地用户与远端权限对应起来

需要指定挂载文件的本地所属用户或组时,可以增加 uid 和 gid 选项。原文的用户归属示例是:

//servername/sharename /media/windowsshare cifs uid=ubuntuusername,credentials=/home/ubuntuusername/.smbcredentials 0 0

在具体机器上要核实用户名与数值 ID 的对应关系。若同时使用 Samba 与 authd,还必须按 authd 文档完成客户端用户、组映射;否则身份标识不匹配会造成权限问题。修改本地显示归属不能代替服务端账号授权。

需要在登录时挂载:libpam-mount

原文还提供了基于 PAM 的登录时挂载方式,前提是 Ubuntu 账号与网络共享使用相同的用户名和密码。先安装:

sudo apt-get install libpam-mount

随后由管理员编辑 /etc/security/pam_mount.conf.xml。取消 <luserconf name=".pam_mount.conf.xml" /> 所在段落的注释,使用户可以维护自己的配置;并在已有的 <mntoptions allow="..."> 允许列表中加入 uid,gid,dir_mode,credentials。这里是增加必要选项,不是无条件放开所有挂载参数。

用户配置 ~/.pam_mount.conf.xml 的原文示例如下:

<?xml version="1.0" encoding="utf-8" ?>
<pam_mount>
  <volume
    options="uid=%(USER),gid=100,dir_mode=0700,credentials=/home/ubuntuusername/.smbcredentials,nosuid,nodev"
    user="*"
    mountpoint="/media/windowsshare"
    path="sharename"
    server="servername"
    fstype="cifs" />
</pam_mount>

其中 nosuid,nodev 限制挂载中文件的特殊权限和设备语义,dir_mode=0700 控制目录权限显示。gid=100、用户通配符、固定的凭据路径和公共挂载点仍必须按目标环境改写;这个单用户示例不能直接变成多用户共享一套秘密的部署配置。

编辑补注:PAM 配置错误可能影响登录,应保留现有管理会话和配置副本,并按系统维护流程验证。本文只展示源文的配置含义,没有修改本机 PAM 或安装软件。

遇到 permission denied,按层检查

mount error(13) permission denied 表示服务端拒绝了访问。先检查账号密码是否有效、账号是否确实能访问目标共享;然后检查凭据文件格式。应写成 password=...,不要在等号左右加入空格。

如果账号表示为 SALES\sally,用户名通常是 sally,域是 SALES。可以在凭据文件中另加一行:

domain=SALES

协议版本和认证方式也相互关联。当前源文明确说明 SMB1 不安全且已不受支持,初次排查可先不显式指定 sec= 或 vers=,让客户端与服务端协商。如果仍有问题,再依据 mount.cifs(8) 手册和服务端策略选择参数。不要把降级到 SMB1 当作常规修复。

网络晚于启动就绪时,改为手动或登录挂载

如果开机时无法可靠访问网络,可以在对应的 fstab 条目加入 noauto,关闭自动挂载,登录后再手动挂载,或使用前述 PAM 方式:

//servername/sharename /media/windowsshare cifs noauto,credentials=/home/ubuntuusername/.smbcredentials 0 0

与原文差异:源页在最后一段把凭据文件写成 .smbpasswd,前文则一直使用 .smbcredentials。本稿统一为前面实际创建的 .smbcredentials,避免因为文件名不一致导致认证失败。它只是本地凭据文件名,不是 Samba 密码数据库命令。

持续挂载的关键不是在配置中多加几个选项,而是让网络可用时间、远端账号权限、本地身份映射和凭据保存方式彼此一致。验证也应分开进行:先验证一次指定挂载,再验证重启或登录时的预期行为。

来源及原作者:Canonical / Ubuntu Server 文档贡献者;源页版权标示 Copyright © 2026。代码仅做静态审查,未执行安装、挂载、重启或 PAM 更改。翻译整理与示意图:未完纪。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容