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

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

相关推荐
吠品28 分钟前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
XMAIPC_Robot29 分钟前
软硬协同实时控制|RK3588业务调度+FPGA硬件时序,ethercat实现半导体设备微秒级响应(125us)
linux·arm开发·人工智能·fpga开发
AOwhisky1 小时前
Python 学习笔记(第十五期)——运维自动化(下·后篇):堡垒机实战——paramiko高阶篇
运维·python·学习·云原生·自动化·运维开发
重生的黑客1 小时前
Linux 进程优先级、切换与调度:从孤儿进程到 O(1) 调度模型
linux·运维·服务器·进程优先级·nice
Urbano1 小时前
夹克与商务单西口袋工序自动化技改研究报告
运维·自动化
骑上单车去旅行2 小时前
MD5校验对比脚本
linux·服务器·windows
平生幻2 小时前
Linux 常用命令
linux
期待着20133 小时前
docker 安装 ,在centos7.9
运维·docker·容器
踏月的造梦星球3 小时前
DM8 DSC 单机双实例部署
运维·开发语言·数据库
MXsoft6183 小时前
平台化是智能运维发展的必然趋势吗?
运维