293 字
1 分钟
Linux SMB 自动挂载
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
开启加密后,大概 210m/s