昨天看到论坛里这个帖子《关于西数HC620加密叠瓦盘的问题》,当时做了回复,今天把具体解决方案发出来。
很多用户买了hc620 14T当影视资源库,当只有一块hc620时没什么问题,但是如果有超过2块hc620时痛苦的事情就来了。
由于飞牛默认会将外接存储磁盘按照设备型号名称进行挂载,但是遇到相同型号的盘就会出现下面这种文件夹名称:
HSH721414ALN6M0 存音乐的
HSH721414ALN6M0_1 存电影
HSH721414ALN6M0_3 存照片备份
第二块盘的路径已经添加给飞牛影视,第三块盘设置给了飞牛相册用于查看备份的照片,但是飞牛重启后这三个盘的的命名会随机变动,导致之前设置的路径全部失效,飞牛影视读取到了照片备份盘。
解决方案1:只用一块同型号的盘。
解决方案2:设置一个开机脚本按照预设的名称更正外接存储的挂载名称。
提前在脚本中按照机械盘的序列号做好映射,只按照这个规则挂载。
假设HSH721414ALN6M0_1的磁盘序列号是WD-002 ,HSH721414ALN6M0_3的序列号是WD-003,我想把WD-002挂载成Media,WD-003挂载成Photo。
最终的效果如下图:

第一步:编写自定义的挂载脚本
新建一个文本命名成:remount-outer-disk.sh拷贝以下脚本内容,修改18行部分为你自己的机械盘序列号和想要挂载的文件夹名称(查看机械盘序列号方法看帖子底部附录)。
例如我这里填的是下面这两行,请替换成你自己机械盘的序列号和想要挂载的文件夹名称
["WD-002"]="Media"
["WD-003"]="Photo"
#!/bin/bash
# 机械硬盘挂载管理脚本
# 用途:确保指定序列号的硬盘挂载到正确的路径
# 配置区域
MOUNT_ROOT="/vol00"
LOG_FILE="/var/log/mount-outer-disk.log"
# 定义需要管理的硬盘序列号和对应的挂载文件夹名称
# 格式:序列号: 挂载文件夹名称
# 如果不指定挂载文件夹名称(只写序列号),则默认使用序列号作为文件夹名
# 举例:
# ["WD-ABCC"]="disk1" # 序列号 WD-ABCC 挂载到 /vol00/disk1
# ["WD-WXYZ123456"]="backup" # 序列号 WD-WXYZ123456 挂载到 /vol00/backup
# ["ST1234567890"]="storage" # 序列号 ST1234567890 挂载到 /vol00/storage
declare -A DISK_CONFIG=(
["WD-002"]="Media" # 使用序列号作为文件夹名
["WD-003"]="Photo" # 使用序列号作为文件夹名
#["WD-ABCC"]="disk1" # 可添加更多硬盘配置
)
# 日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# 等待系统完全启动和磁盘识别
sleep 10
log "========================================"
log "开始执行硬盘挂载检查和修正..."
log "挂载根目录: $MOUNT_ROOT"
# 确保挂载根目录存在
if [ ! -d "$MOUNT_ROOT" ]; then
log "错误: 挂载根目录 $MOUNT_ROOT 不存在"
exit 1
fi
# 统计信息
TOTAL_DISKS=${#DISK_CONFIG[@]}
SUCCESS_COUNT=0
SKIP_COUNT=0
FAIL_COUNT=0
log "配置的硬盘数量: $TOTAL_DISKS"
log "----------------------------------------"
# 遍历每个预定义的配置
for SERIAL in "${!DISK_CONFIG[@]}"; do
MOUNT_NAME="${DISK_CONFIG[$SERIAL]}"
log "处理硬盘配置:"
log " 序列号: $SERIAL"
log " 挂载文件夹名: $MOUNT_NAME"
# 使用lsblk获取该序列号对应的设备信息
# 输出格式: 设备名 序列号 挂载点
DISK_INFO=$(lsblk -nlo NAME,SERIAL,MOUNTPOINT | grep -w "$SERIAL" | head -n 1)
if [ -z "$DISK_INFO" ]; then
log " ⚠ 警告: 未找到序列号为 $SERIAL 的硬盘"
((SKIP_COUNT++))
log "----------------------------------------"
continue
fi
# 解析设备名和当前挂载点
DEVICE_NAME=$(echo "$DISK_INFO" | awk '{print $1}')
CURRENT_MOUNT=$(echo "$DISK_INFO" | awk '{print $3}')
# 完整的设备路径
DEVICE_PATH="/dev/$DEVICE_NAME"
# 目标挂载路径
TARGET_MOUNT="$MOUNT_ROOT/$MOUNT_NAME"
log " 设备路径: $DEVICE_PATH"
log " 当前挂载点: ${CURRENT_MOUNT:-未挂载}"
log " 目标挂载点: $TARGET_MOUNT"
# 检查当前挂载点是否正确
if [ "$CURRENT_MOUNT" = "$TARGET_MOUNT" ]; then
log " ✓ 挂载点正确,无需处理"
((SUCCESS_COUNT++))
log "----------------------------------------"
continue
fi
# 需要重新挂载
log " × 挂载点不正确,开始重新挂载..."
# 如果设备已经挂载到其他位置,先卸载
if [ -n "$CURRENT_MOUNT" ]; then
log " 正在卸载: $CURRENT_MOUNT"
if umount "$DEVICE_PATH" 2>/dev/null; then
log " ✓ 卸载成功"
# 等待卸载完成
sleep 2
else
log " ✗ 卸载失败,尝试强制卸载"
if umount -l "$DEVICE_PATH" 2>/dev/null; then
log " ✓ 强制卸载成功"
sleep 2
else
log " ✗ 强制卸载失败,跳过此硬盘"
((FAIL_COUNT++))
log "----------------------------------------"
continue
fi
fi
fi
# 创建目标挂载目录
if [ ! -d "$TARGET_MOUNT" ]; then
log " 创建挂载目录: $TARGET_MOUNT"
if mkdir -p "$TARGET_MOUNT"; then
log " ✓ 目录创建成功"
else
log " ✗ 目录创建失败"
((FAIL_COUNT++))
log "----------------------------------------"
continue
fi
fi
# 挂载到目标路径
log " 正在挂载到: $TARGET_MOUNT"
if mount "$DEVICE_PATH" "$TARGET_MOUNT"; then
log " ✓ 挂载成功"
# 设置目录权限
chmod 755 "$TARGET_MOUNT"
# 验证挂载
if mountpoint -q "$TARGET_MOUNT"; then
log " ✓ 挂载验证通过"
((SUCCESS_COUNT++))
# 显示挂载信息
DISK_SIZE=$(df -h "$TARGET_MOUNT" | tail -1 | awk '{print $2}')
DISK_USED=$(df -h "$TARGET_MOUNT" | tail -1 | awk '{print $3}')
DISK_AVAIL=$(df -h "$TARGET_MOUNT" | tail -1 | awk '{print $4}')
log " 磁盘信息: 总计 $DISK_SIZE, 已用 $DISK_USED, 可用 $DISK_AVAIL"
else
log " ✗ 挂载验证失败"
((FAIL_COUNT++))
fi
else
log " ✗ 挂载失败"
((FAIL_COUNT++))
fi
log "----------------------------------------"
done
# 输出统计信息
log "执行完成统计:"
log " 总计: $TOTAL_DISKS 个硬盘"
log " 成功: $SUCCESS_COUNT 个"
log " 跳过: $SKIP_COUNT 个 (未找到硬盘)"
log " 失败: $FAIL_COUNT 个"
# 显示当前所有挂载点
log "当前 $MOUNT_ROOT 下的挂载情况:"
df -h | grep "$MOUNT_ROOT" | while read line; do
log " $line"
done
log "硬盘挂载检查和修正完成"
log "========================================"
# 根据结果返回退出码
if [ $FAIL_COUNT -gt 0 ]; then
exit 1
else
exit 0
fi
第二步:创建执行脚本的系统服务
新建文本mount-outer-disk.service,拷贝以下内容:
[Unit]
Description=Remount Outer Disks
After=zfs-zed.service
DefaultDependencies=no
[Service]
Type=oneshot
ExecStart=/usr/local/bin/remount-outer-disk.sh
RemainAfterExit=yes
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
第三步:启用mount-outer-disk.service服务
3.1 拷贝remount-outer-disk.sh脚本到系统目录中
为了防止放在文件目录被意外删除,存放在系统目录更稳妥,毕竟磁盘不会经常变动。
上传这两个文件到nas任意目录,我上传到了my文件夹中,右键sh脚本或service文件获取它的原始路径,我的是:/vol1/1000/my/mount-outer-disk.service ,同理另一个是:/vol1/1000/my/remount-outer-disk.sh
连接从自己电脑连接飞牛的ssh或者使用飞牛应用市场里的【FntermX终端】新建本地终端即可在飞牛上执行命令。
此时分别执行以下1-4命令:
#1. 拷贝脚本和服务文件到系统目录
sudo cp -f /vol1/1000/my/mount-outer-disk.service /etc/systemd/system/
sudo cp -f /vol1/1000/my/remount-outer-disk.sh /usr/local/bin/
# 给脚本授予执行权限
sudoc chmod +x /usr/local/bin/remount-outer-disk.sh
# 3. 重新加载系统服务
sudo systemctl daemon-reload
# 4. 开启开机自运行
sudo systemctl enable mount-outer-disk.service
# 下面的命令根据情况使用
# 5. 手动执行(可选操作,执行后会将预设好的机械盘挂载成指定名称)
sudo systemctl start mount-disks-by-serial.service
# 6. 查看该脚本的执行记录
sudo journalctl -u mount-outer-disk.service -n 100
# 关闭开机自运行
# 7. sudo systemctl disable mount-outer-disk.service
其他事项:
以后如何修改机械盘序列号与目录的映射
可以继续在本地修改remount-outer-disk.sh脚本的内容,然后重新上传到飞牛nas里,然后用上面拷贝脚本的命令把它再次拷贝到/usr/local/bin/ 目录下进行覆盖。
其实使用vim修改最简单,考虑到绝大多数用户都不会使用vim就不介绍了。
查看机械盘序列号的方法
方法一:直接从硬盘的标签上面看,有SN字样显示的就是序列号。
方法二:用这个命令:lsblk -o name,serial,mountpoint。第二列就是序列号,第三列是它当前的挂载路径。
使用【FntermX终端】小贴士
使用飞牛应用市场里的【FntermX终端】执行命令时无法交互式输入密码,可先用下面命令让sudo成功执行一次,后面再执行sudo就不必输入密码了。
echo '你的飞牛账号的密码' | sudo -S ls
所以还是建议你从电脑远程访问飞牛的ssh终端,连接飞牛ssh这是另一个话题此处不展开,相信论坛里应该有很多教程。