293 字
1 分钟
Linux SMB 自动挂载
2024-08-11

Systemd 管理 CIFS 挂载#

背景#

一个简单的挂载命令:

sudo mount.cifs -o credentials=/PATH/bx1-credentials.txt,uid=1000,gid=1000 //ADDR/backup /mnt/bx1

目标是将这个命令转换为一个可靠的 systemd 服务,使其在系统启动时自动执行,并在遇到问题时进行重试。

1. .mount#

尝试创建一个 .mount 单元文件。:

[Unit]
Description=Mount CIFS Share
After=network-online.target
Wants=network-online.target

[Mount]
What=//ADDR/backup
Where=/mnt/bx1
Type=cifs
# 如果需要挂载为其他权限,请修改 uid 和 gid
Options=credentials=/PATH/bx1-credentials.txt,uid=1000,gid=1000,x-systemd.automount

[Install]
WantedBy=multi-user.target

排查许久,发现是因为 CIFS 模块未加载导致挂载失败。这是因为 systemd 不会自动加载模块,所以我们需要手动加载:

[Unit]
Description=Mount CIFS Share
After=network-online.target
Wants=network-online.target
Requires=systemd-modules-load.service

[Mount]
What=//ADDR/backup
Where=/mnt/bx1
Type=cifs
Options=credentials=/PATH/bx1-credentials.txt,uid=1000,gid=1000,x-systemd.automount
ExecStartPre=/sbin/modprobe cifs
ExecStartPre=/bin/sh -c 'until ping -c1 ADDR >/dev/null 2>&1; do sleep 2; done'

[Install]
WantedBy=multi-user.target

尝试后发现,任然会无法挂载,因此决定尝试使用 .service。

2. 转换为 .service 单元#

[Unit]
Description=Mount CIFS Share Service
After=network-online.target
Wants=network-online.target
Before=remote-fs.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStartPre=/bin/sh -c 'until ping -c1 ADDR >/dev/null 2>&1; do sleep 5; done'
ExecStartPre=/sbin/modprobe cifs
ExecStart=/bin/mount -t cifs //ADDR/backup /mnt/bx1 -o credentials=/PATH/bx1-credentials.txt,uid=1000,gid=1000
ExecStop=/bin/umount /mnt/bx1
Restart=on-failure
RestartSec=30

[Install]
WantedBy=multi-user.target

更多配置#

  • -o seal 开启加密
  • -o cache=none 关闭缓存,支持传输 4GB 以上的文件

实际性能#

未加密时,大概 700m/s unencrypted

开启加密后,大概 210m/s encrypted

Linux SMB 自动挂载
https://blog.lpkt.cn/posts/linux-smb-auto-mount/linux-smb-auto-mount/
作者
lollipopkit
发布于
2024-08-11
许可协议
CC BY-NC-SA 4.0