Unraid自动(延迟)挂载SMB和启动容器

发布时间 2023-07-22 00:38:46作者: 路安达
date created: 2023-07-21 21:51
date updated: 2023-07-21 23:31

自动延迟挂载远程SMB文件,并重启使用该文件的 Docker 容器。

UNRAID 实现开机自动挂载 SMB 有插件,但尚未发现能提供延迟挂载的插件。网友延迟挂载的需求多是因为在 UNRAID 中装了其他 NAS 系统,虚拟机启动比宿主机慢,所以需要延迟挂载。我的情况与其类似,我对我 NAS 的启动耗时没信心,担心即便 UNRAID 与 NAS 同时启动也可能会挂载失败,所以需要延迟。

挂载或卸载SMB

网上能找到的挂载 SMB 的教程大部分都说让安装 "Unassigned Devices" 插件。但它无法实现延迟挂载就不用它了。索性不安装它也不影响直接用命令挂载。

Linux 中挂载 SMB 的命令是下边这个,可以自行尝试:

sudo mount -t cifs //smb_server/share /mnt/smb -o username=smb_username,password=smb_password

但只有这个命令还无法实现需求,因此需要编写一个稍微复杂点的脚本,以下是例子,重启和停止相关 Docker 容器的操作也包含在里面:

挂载SMB并重启相关容器

❕下例是延迟 3 分钟只读挂载 SMB. 如果需要写权限将 ",ro" 参数删掉或改成 ",rw" 均可。

#!/bin/bash -x

# SMB 挂载参数
DEST_DIR="/mnt/remotes/dest"
SRC_DIR="//192.168.1.100/src"
CIFS_OPTS="username=name,password=passwd,iocharset=utf8,ro"
# 需要重启的容器(name)列表。"("linuxserver-plex" "nginx" "mysql")"
CONTAINER_NAMES=("linuxserver-plex")

# 脚本正式执行...

# Delay 3min
sleep 3m
# Create destination directory if it doesn't exist
mkdir -p "$DEST_DIR"
# Mount CIFS share
mount -t cifs "$SRC_DIR" "$DEST_DIR" -o "$CIFS_OPTS"
# Restart Docker containers
for container in "${CONTAINER_NAMES[@]}"
do
  docker restart "$container"
done

卸载SMB并停止相关容器

❗脚本中的 "DEST_DIR", "CONTAINER_NAMES" 要与上一个脚本中匹配。

#!/bin/bash -x

DEST_DIR="/mnt/remotes/dest"
CONTAINER_NAMES=("linuxserver-plex")

umount -l "$DEST_DIR"
for container in "${CONTAINER_NAMES[@]}"
do
  docker stop "$container"
done

自动化执行

上面已经给出了脚本,需要自动化执行的话还需要一个插件——"User Scripts".

安装插件后将挂载和卸载 SMB 的脚本添加进去,并设置挂载操作的脚本在阵列启动时执行、卸载操作的脚本在阵列停止时执行即可。