使用 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 | |
CentOS/RHEL/Fedora:
1 | |
如果系统没有 dnf,可以使用:
1 | |
确认安装成功:
1 | |
二、准备挂载点和凭据
2.1 创建挂载点
1 | |
如果挂载点已经被其他文件系统使用,先确认当前挂载情况:
1 | |
2.2 查询本地用户 UID/GID
uid 和 gid 决定普通用户访问共享文件时看到的属主。查询实际用户的值:
1 | |
例如输出中包含 uid=1000 和 gid=1000,则在后续配置中使用 uid=1000,gid=1000。
2.3 创建凭据文件
不要把密码直接写入 systemd 单元文件。创建只有 root 可以读取的凭据目录和文件:
1 | |
文件内容如下,将占位符替换为实际值:
1 | |
如果服务器使用域账号,再增加:
1 | |
确认凭据文件权限:
1 | |
结果应类似:
1 | |
三、确认 systemd 挂载单元名称
systemd mount 单元的文件名必须由挂载路径转换而来。对于 /mnt/sms,单元名称是 mnt-sms.mount:
1 | |
命令应输出:
1 | |
如果挂载点包含空格、中文或其他特殊字符,不要手工猜测文件名,使用上面的命令生成名称。
四、创建 systemd mount 单元
创建单元文件:
1 | |
写入以下内容,并替换 server_ip、share_name、凭据文件路径以及 UID/GID:
1 | |
关键配置说明:
| 配置 | 作用 |
|---|---|
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 | |
没有输出通常表示语法检查通过。
五、加载、启动和设置开机挂载
重新加载 systemd 配置:
1 | |
启用并立即启动挂载单元:
1 | |
查看状态:
1 | |
状态显示 active (mounted) 后,确认挂载类型和来源:
1 | |
六、验证读写权限
查看共享内容:
1 | |
使用实际运行程序的本地用户进行读写测试:
1 | |
如果 touch 失败,请检查以下内容:
- Samba 账号是否有共享目录的写权限。
- 服务器端共享权限和底层文件系统权限是否都允许写入。
- systemd 单元中的
uid、gid是否与本地用户一致。 - 共享是否被服务器设置为只读。
七、停止、卸载和禁用
停止挂载单元会卸载共享:
1 | |
确认已经卸载:
1 | |
如果不再需要开机自动挂载,禁用单元:
1 | |
修改单元文件后,必须重新加载并重启单元:
1 | |
八、常见问题排查
8.1 mount error(13): Permission denied
通常是账号、密码、域名或服务器端权限不正确。检查凭据文件是否存在且权限正确:
1 | |
不要把包含密码的凭据文件内容复制到公开日志或工单中。
8.2 mount error(2): No such file or directory
检查服务器地址、共享名称和大小写。可以先列出服务器共享,确认共享名称正确:
1 | |
如果系统没有 smbclient,安装 Samba 客户端工具:
1 | |
8.3 No dialect specified on mount
在 Options 中明确指定协议版本,例如:
1 | |
如果服务器不支持 SMB 3.0,根据服务器配置尝试 vers=2.1。不建议无依据地反复切换版本。
8.4 单元启动失败
查看详细状态和本次启动日志:
1 | |
修改配置后执行:
1 | |
8.5 查看内核 CIFS 错误
1 | |
重点关注协议版本、认证失败、网络不可达和权限拒绝等信息。
九、实施检查清单
完成配置后,按以下顺序确认:
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 能够自动恢复挂载。