收起左侧

HC620等外接存储重启后命名混乱问题解决方案

0
回复
22
查看
[ 复制链接 ]

2

主题

1

回帖

0

牛值

江湖小虾

昨天看到论坛里这个帖子《关于西数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。

最终的效果如下图:

改挂载路径名称后截图.png

第一步:编写自定义的挂载脚本

新建一个文本命名成: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这是另一个话题此处不展开,相信论坛里应该有很多教程。

收藏
送赞
分享

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则