🧩 一、问题背景
许多家庭 NAS 用户使用 PVE + USB 硬盘柜 + 虚拟化 NAS(TrueNAS、OMV 等) 的组合。
但许多硬盘柜不支持来电自启动导致硬盘柜往往在断电后延迟上电,导致:
- NAS 虚拟机提前启动;
- 硬盘还未挂载;
- 文件系统报错或阵列损坏风险。
为了避免这种情况,我们可以让 PVE 监听 USB 设备上线事件,一旦检测到硬盘柜上线,就自动启动 NAS 虚拟机。
⚙️ 二、方案原理:udev 自动化触发
Linux 内核在检测到硬件变化时,会通过 udev(设备事件管理器) 发送事件。
我们可以编写一条规则,让系统在检测到特定设备插入时执行脚本。
简单理解:
“当我的硬盘柜上线时,自动执行启动虚拟机的命令。”
🔍 三、识别你的 USB 设备
首先,查看当前系统识别到的 USB 设备:
lsusb示例输出:
Bus 004 Device 005: ID 174c:1156 ASMedia Technology Inc. Ugreen Storage Device记录下:
- Vendor ID:
174c - Product ID:
1156
这是我的 绿联硬盘柜 的唯一标识。
🧾 四、创建自动启动规则
1️⃣ 创建 udev 规则文件
sudo nano /etc/udev/rules.d/99-usb-nas-autostart.rules写入以下内容(请替换
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="<Vendor ID>", ATTR{idProduct}=="<Product ID>", RUN+="/usr/local/bin/start-nas-vm.sh <VMID>"这意味着:
以我的硬盘柜为例就是:当系统检测到一个厂商 ID 为 174c、产品 ID 为 1156 的 USB 设备被插入时,执行脚本 /usr/local/bin/start-nas-vm.sh 102。
2️⃣ 创建启动脚本
sudo nano /usr/local/bin/start-nas-vm.sh内容如下:
#!/bin/bash
VMID="$1"
LOGFILE="/var/log/usb-nas-autostart.log"
# 等待设备稳定
sleep 10
# 避免重复启动
if qm status "$VMID" | grep -q "status: running"; then
echo "$(date '+%F %T') - VM $VMID already running, skip" >> "$LOGFILE"
exit 0
fi
echo "$(date '+%F %T') - USB storage detected (Vendor=174c, Product=1156), starting VM $VMID..." >> "$LOGFILE"
/usr/sbin/qm start "$VMID" >> "$LOGFILE" 2>&1保存并授权:
sudo chmod +x /usr/local/bin/start-nas-vm.sh也可以使用没有日志文件的版本:
最简化的版本:
#!/bin/bash
VMID="$1"
# 延迟等待 USB 稳定
sleep 10
# 检查虚拟机是否已运行,避免重复启动
if qm status "$VMID" | grep -q "status: running"; then
exit 0
fi
# 启动虚拟机,不输出任何日志
/usr/sbin/qm start "$VMID" >/dev/null 2>&13️⃣ 重新加载规则并测试
sudo udevadm control --reload
sudo udevadm trigger可手动模拟触发:
sudo udevadm trigger --subsystem-match=usb --attr-match=idVendor=174c --attr-match=idProduct=1156查看日志:
cat /var/log/usb-nas-autostart.log若出现:
USB storage detected (Vendor=174c, Product=1156), starting VM 102...则配置成功 ✅
💡 五、进阶扩展
⏳ 延迟检测优化
对于上电慢的硬盘柜,可将脚本中的 sleep 10 改为:
sleep 30确保硬盘完全识别后再启动虚拟机。
🧰 常用命令参考
| 功能 | 命令 |
|---|---|
| 查看所有 USB 设备 | lsusb |
| 查看虚拟机状态 | qm list |
| 查看虚拟机配置 | cat /etc/pve/qemu-server/<VMID>.conf |
| 手动启动虚拟机 | qm start <VMID> |
| 手动关闭虚拟机 | qm shutdown <VMID> |
| 重新加载规则 | udevadm control --reload |
| 查看日志 | cat /var/log/usb-nas-autostart.log |
✅ 六、总结
通过一条简单的 udev 规则与一个启动脚本,你可以让 PVE 在检测到 USB 硬盘柜上线后自动启动 NAS 虚拟机。
这套方案:
- 💡 解决硬盘柜延迟上电问题
- ⚙️ 无需人工干预
- 🧠 逻辑清晰、可靠稳定
从此,你的 PVE + NAS 组合实现真正意义上的 智能自启动。
评论已关闭