PVE实现USB硬盘盒在备份前自动上电/结束后自动断电脚本

有的时候需要硬盘盒为pve做备份,但又不想让硬盘一直空转,此时就希望硬盘在备份时开启,完成后关闭。

我也是试了很久才找到解决方案,在 PVE 9.1.2 版本下测试通过,用的是绿联的双盘阵列硬盘盒。

配置步骤

  1. /etc/fstab添加以UUID方式挂载你的硬盘盒。
  2. 将如下脚本放入/usr/local/bin/pve-backup-hook.sh,记得更改【方括号框出】的变量。
perl 复制代码
#!/usr/bin/perl

use strict;
use warnings;

# 获取当前的阶段参数
my $phase = shift;
# 定义磁盘 UUID
my $uuid = "【YOUR-DISK-UUID】";
my $disk_uuid_path = "/dev/disk/by-uuid/$uuid";
# 定义 USB 授权控制路径
my $usb_auth_path = "/sys/bus/usb/devices/【你硬盘所在的USB根】/authorized";

if ($phase eq 'job-start') {
    # --- 1. 重置 USB 控制器状态 (通过授权机制) ---
    print "--- [Hook] Resetting USB authorization ---\n";
    
    # 写入 0 (禁用授权/断开)
    if (open(my $fh, '>', $usb_auth_path)) {
        print $fh "0";
        close $fh;
        print "--- [Hook] USB De-authorized ---\n";
    } else {
        warn "--- [Hook] Error: Cannot write to $usb_auth_path: $! ---\n";
    }
    
    sleep(2); 

    # 写入 1 (启用授权/重新识别)
    if (open(my $fh, '>', $usb_auth_path)) {
        print $fh "1";
        close $fh;
        print "--- [Hook] USB Authorized ---\n";
    } else {
        warn "--- [Hook] Error: Cannot write to $usb_auth_path: $! ---\n";
    }

    # 等待系统重新枚举磁盘设备
    print "--- [Hook] Waiting for device to initialize... ---\n";
    sleep(5);

    # --- 2. 按 UUID 挂载 ---
    print "--- [Hook] Executing: mount UUID=$uuid ---\n";
    system("mount -U $uuid");
    
    if ($? == 0) {
        print "--- [Hook] Mount successful ---\n";
    } else {
        print "--- [Hook] Mount failed. Device might not be ready. ---\n";
    }
} 

elsif ($phase eq 'job-end' || $phase eq 'job-abort') {
    # --- 1. 卸载 ---
    print "--- [Hook] Executing: umount /mnt/【你的挂载点】 ---\n";
    system("umount /mnt/【你的挂载点】");
    
    # --- 2. 磁盘进入待机 ---
    print "--- [Hook] Executing: hdparm -y $disk_uuid_path ---\n";
    system("/usr/sbin/hdparm -y $disk_uuid_path");

    # --- 3. 切断电源 ---
    # 注意:udisksctl power-off 会从内核移除设备,下次启动需依赖上面的 authorized 重置
    #print "--- [Hook] Executing: udisksctl power-off ---\n";
    #system("/usr/bin/udisksctl power-off -b $disk_uuid_path");

    # --- 3. 也可使用执行电源切断 ---
    # 使用 'at' 命令在 5 分钟后执行 power-off
    # 这样 Perl 脚本会立即继续执行并 exit 0,而 power-off 命令在后台等待执行
    print "--- [Hook] Scheduling power-off in 5 minutes via 'at' ---\n";
    
    my $cmd = "/usr/bin/udisksctl power-off -b $disk_uuid_path";
    # 通过管道将命令传给 at now + 5 minutes
    system("echo '$cmd' | at now + 5 minutes > /dev/null 2>&1");

    if ($? == 0) {
        print "--- [Hook] Disk safely powered off ---\n";
    } else {
        print "--- [Hook] Power-off command sent ---\n";
    }
}

exit 0;
  1. 为你的脚本加可执行权限。
bash 复制代码
chmod +x pve-backup-hook.sh
  1. 编辑/etc/vzdump.conf:
css 复制代码
script: /usr/local/bin/pve-backup-hook.sh
  1. 在实际测试备份前,使用

    bash 复制代码
    sudo /usr/local/bin/pve-backup-hook.sh job-start

    bash 复制代码
    sudo /usr/local/bin/pve-backup-hook.sh job-end

    分别测试两个阶段,确保无误。

相关推荐
测试员周周4 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
小辰记事本6 小时前
从零读懂RoCEv2数据包构造:从WQE到线缆上的完整旅程
服务器·网络·网络协议·rdma
小鹏linux7 小时前
Ubuntu 22.04 部署开源免费具有精美现代web页面的Casdoor账号管理系统
linux·前端·ubuntu·开源·堡垒机
在角落发呆7 小时前
Linux转发配置:解锁网络互联的核心密码
linux·运维·网络
齐潇宇8 小时前
Zabbix 7 概述与配置
linux·zabbix·监控告警
裴东青9 小时前
10-实战:RuoYi-Cloud的自动化发布
运维·ci/cd·自动化
江公望9 小时前
Ubuntu htop命令,10分钟讲清楚
linux·服务器
哎呦,帅小伙哦9 小时前
Linux 时间:从原子钟到 clock_gettime 的每一面
linux·运维·服务器
sxgzzn9 小时前
新能源场站数智化转型:基于数字孪生与AI的智慧运维管理平台解析
大数据·运维·人工智能
张小姐的猫9 小时前
【Linux】多线程 —— 线程互斥
linux·运维·服务器·c++