使用 systemd 自动挂载 Samba/SMB 共享

本文介绍如何使用 systemd mount 单元将 Samba/SMB 共享挂载到 Linux,并配置为开机自动挂载。

示例参数如下,请在执行前替换为实际值:

参数 示例值 说明
SMB 服务器 server_ip 可以是 IP 地址或可解析的主机名
共享名称 share_name Samba 服务器导出的共享名称
本地挂载点 /mnt/sms Linux 上访问共享的目录
SMB 用户名 your_username 访问共享的账号
本地 UID/GID 1000/1000 使用 id 用户名 查询
协议版本 3.0 根据服务器实际支持情况调整

本文使用 CIFS/SMB 协议,不是 NFS。客户端需要安装 cifs-utils,并且服务器端账号必须有共享权限和文件系统权限。

一、安装客户端

Debian/Ubuntu:

1
2
sudo apt update
sudo apt install -y cifs-utils

CentOS/RHEL/Fedora:

1
sudo dnf install -y cifs-utils

如果系统没有 dnf,可以使用:

1
sudo yum install -y cifs-utils

确认安装成功:

1
mount.cifs -V

二、准备挂载点和凭据

2.1 创建挂载点

1
sudo mkdir -p /mnt/sms

如果挂载点已经被其他文件系统使用,先确认当前挂载情况:

1
findmnt /mnt/sms

2.2 查询本地用户 UID/GID

uid 和 gid 决定普通用户访问共享文件时看到的属主。查询实际用户的值:

1
id your_local_user

例如输出中包含 uid=1000 和 gid=1000,则在后续配置中使用 uid=1000,gid=1000。

2.3 创建凭据文件

不要把密码直接写入 systemd 单元文件。创建只有 root 可以读取的凭据目录和文件:

1
2
3
sudo install -d -m 700 /etc/samba
sudo install -m 600 /dev/null /etc/samba/credentials-sms
sudo vi /etc/samba/credentials-sms

文件内容如下,将占位符替换为实际值:

1
2
username=your_username
password=your_password

如果服务器使用域账号,再增加:

1
domain=your_domain

确认凭据文件权限:

1
sudo stat -c '%A %U:%G %n' /etc/samba/credentials-sms

结果应类似:

1
-rw------- root:root /etc/samba/credentials-sms

三、确认 systemd 挂载单元名称

systemd mount 单元的文件名必须由挂载路径转换而来。对于 /mnt/sms,单元名称是 mnt-sms.mount:

1
systemd-escape --path --suffix=mount /mnt/sms

命令应输出:

1
mnt-sms.mount

如果挂载点包含空格、中文或其他特殊字符,不要手工猜测文件名,使用上面的命令生成名称。

四、创建 systemd mount 单元

创建单元文件:

1
sudo vi /etc/systemd/system/mnt-sms.mount

写入以下内容,并替换 server_ip、share_name、凭据文件路径以及 UID/GID:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=Mount Samba share at /mnt/sms
Wants=network-online.target
After=network-online.target

[Mount]
What=//server_ip/share_name
Where=/mnt/sms
Type=cifs
Options=credentials=/etc/samba/credentials-sms,uid=1000,gid=1000,dir_mode=0755,file_mode=0644,vers=3.0,_netdev,nofail
TimeoutSec=30

[Install]
WantedBy=multi-user.target

关键配置说明:

配置 作用
What SMB 共享路径,格式为 //服务器/共享名
Where 本地挂载点,必须已经创建
credentials root 专用的账号密码文件
uid/gid 设置挂载内容显示的本地属主
dir_mode/file_mode 设置目录和文件的默认权限掩码
vers=3.0 使用 SMB 3.0,需与服务器支持的版本匹配
_netdev 标记为网络文件系统
nofail 共享不可用时不阻塞系统启动
network-online.target 等待网络连接就绪后再尝试挂载

file_mode 和 dir_mode 只影响 Linux 客户端显示的权限,不能绕过 Samba 服务器端的共享权限和文件系统权限。

检查单元语法和挂载点配置:

1
sudo systemd-analyze verify /etc/systemd/system/mnt-sms.mount

没有输出通常表示语法检查通过。

五、加载、启动和设置开机挂载

重新加载 systemd 配置:

1
sudo systemctl daemon-reload

启用并立即启动挂载单元:

1
sudo systemctl enable --now mnt-sms.mount

查看状态:

1
sudo systemctl status mnt-sms.mount --no-pager

状态显示 active (mounted) 后,确认挂载类型和来源:

1
2
findmnt -t cifs /mnt/sms
mountpoint /mnt/sms

六、验证读写权限

查看共享内容:

1
ls -la /mnt/sms

使用实际运行程序的本地用户进行读写测试:

1
sudo -u your_local_user sh -c 'touch /mnt/sms/.mount-test && rm -f /mnt/sms/.mount-test'

如果 touch 失败,请检查以下内容:

  1. Samba 账号是否有共享目录的写权限。
  2. 服务器端共享权限和底层文件系统权限是否都允许写入。
  3. systemd 单元中的 uid、gid 是否与本地用户一致。
  4. 共享是否被服务器设置为只读。

七、停止、卸载和禁用

停止挂载单元会卸载共享:

1
sudo systemctl stop mnt-sms.mount

确认已经卸载:

1
mountpoint -q /mnt/sms && echo '仍然挂载' || echo '已卸载'

如果不再需要开机自动挂载,禁用单元:

1
sudo systemctl disable mnt-sms.mount

修改单元文件后,必须重新加载并重启单元:

1
2
sudo systemctl daemon-reload
sudo systemctl restart mnt-sms.mount

八、常见问题排查

8.1 mount error(13): Permission denied

通常是账号、密码、域名或服务器端权限不正确。检查凭据文件是否存在且权限正确:

1
sudo stat -c '%A %U:%G %n' /etc/samba/credentials-sms

不要把包含密码的凭据文件内容复制到公开日志或工单中。

8.2 mount error(2): No such file or directory

检查服务器地址、共享名称和大小写。可以先列出服务器共享,确认共享名称正确:

1
smbclient -L //server_ip -U your_username

如果系统没有 smbclient,安装 Samba 客户端工具:

1
sudo apt install -y smbclient

8.3 No dialect specified on mount

在 Options 中明确指定协议版本,例如:

1
Options=credentials=/etc/samba/credentials-sms,uid=1000,gid=1000,vers=3.0,_netdev,nofail

如果服务器不支持 SMB 3.0,根据服务器配置尝试 vers=2.1。不建议无依据地反复切换版本。

8.4 单元启动失败

查看详细状态和本次启动日志:

1
2
sudo systemctl status mnt-sms.mount --no-pager -l
sudo journalctl -u mnt-sms.mount -b --no-pager

修改配置后执行:

1
2
3
sudo systemd-analyze verify /etc/systemd/system/mnt-sms.mount
sudo systemctl daemon-reload
sudo systemctl restart mnt-sms.mount

8.5 查看内核 CIFS 错误

1
dmesg | tail -n 50

重点关注协议版本、认证失败、网络不可达和权限拒绝等信息。

九、实施检查清单

完成配置后,按以下顺序确认:

  • mount.cifs -V 能正常输出版本。
  • /mnt/sms 已创建且没有被错误挂载。
  • 凭据文件权限为 600,属主为 root:root。
  • systemd-analyze verify 没有输出错误。
  • systemctl status mnt-sms.mount 显示 active (mounted)。
  • findmnt /mnt/sms 显示来源为目标 SMB 共享。
  • 当前业务用户可以按预期读写 /mnt/sms。
  • 重启后 systemd 能够自动恢复挂载。

使用 systemd 自动挂载 Samba/SMB 共享
https://jgq12138.github.io/2026/01/13/linux_systemctl_mount_samba/
作者
JGQ12138
发布于
2026年1月13日
许可协议