pve_snapshot_list
PVE 实例快照一览工具
一键脚本
bash <(curl -sL gitee.com/meimolihan/linux-command_sh/raw/master/pve_snapshot_list.sh)
效果预览
补充说明
该脚本用于在 Proxmox VE(PVE)平台上集中查看所有 QEMU 虚拟机和 LXC 容器的快照信息,基于 qm listsnapshot 和 pct listsnapshot 命令实现,适合需要对实例快照进行统一管理的运维场景。
功能特点
- 双模式快照一览:同时展示 QEMU 虚拟机(
qm listsnapshot)和 LXC 容器(pct listsnapshot)的全部快照 - 自动遍历:自动获取所有 VM 和 CT 实例,逐个列出其快照列表
- 中文友好:将
current、no-description等输出自动替换为中文标识 - 清晰的分组展示:按实例 ID 分组,使用树形符号展示快照层级关系
- 彩色输出:不同类型和状态使用不同颜色区分
输出说明
脚本输出包含以下信息:
| 字段 | 说明 |
|---|---|
| 实例 ID | VM 或 CT 的编号 |
| 快照名称 | 快照创建时的命名 |
| 快照描述 | 快照的备注信息(替换为"无备注") |
| 当前标识 | 标记当前运行节点(替换为"当前系统") |
参数示例
# 直接运行,查看所有实例的快照
bash pve_snapshot_list.sh
关联工具
| 工具 | 说明 |
|---|---|
pve_vm_start.sh |
批量启动 VM/CT 实例 |
pve_vm_stop.sh |
批量停止 VM/CT 实例 |
pve_vm_reboot.sh |
批量重启 VM/CT 实例 |
pve_vm_status.sh |
查看 VM/CT 运行状态 |
pve_vm_destroy.sh |
销毁指定虚拟机 |
pve_vm_wizard.sh |
交互式创建虚拟机 |
注意事项
- 需要在 PVE 节点上以 root 权限执行
- 仅列出已存在的快照,无快照的实例会显示"暂无快照"提示
- 快照的创建、删除、回滚需要通过
qm/pct命令手动操作
脚本源码
#!/bin/bash
list_color_init() {
export gl_hui=$'\033[38;5;59m'
export gl_hong=$'\033[38;5;9m'
export gl_lv=$'\033[38;5;10m'
export gl_huang=$'\033[38;5;11m'
export gl_lan=$'\033[38;5;32m'
export gl_bai=$'\033[38;5;15m'
export gl_zi=$'\033[38;5;13m'
export gl_bufan=$'\033[38;5;14m'
export reset=$'\033[0m'
}
list_color_init
log_info() { echo -e "${gl_lan}[信息]${gl_bai} $*"; }
log_ok() { echo -e "${gl_lv}[成功]${gl_bai} $*"; }
log_warn() { echo -e "${gl_huang}[警告]${gl_bai} $*"; }
log_error() { echo -e "${gl_hong}[错误]${gl_bai} $*" >&2; }
sleep_fractional() {
local seconds=$1
if sleep "$seconds" 2>/dev/null; then return 0; fi
if command -v perl >/dev/null 2>&1; then perl -e "select(undef, undef, undef, $seconds)"; return 0; fi
if command -v python3 >/dev/null 2>&1; then python3 -c "import time; time.sleep($seconds)"; return 0; fi
if command -v python >/dev/null 2>&1; then python -c "import time; time.sleep($seconds)"; return 0; fi
local int_seconds=$(echo "$seconds" | awk '{print int($1+0.999)}')
sleep "$int_seconds"
}
break_end() {
echo -e "${gl_lv}操作完成${gl_bai}"
echo -e "${gl_bai}按任意键继续${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai} \c"
read -r -n 1 -s -r -p ""
echo ""
clear
}
root_use() {
clear
if [ "$EUID" -ne 0 ]; then
echo -e "\n${gl_zi}>>> ROOT登录检查 ${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai}"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
echo -e "${gl_huang}提示: ${gl_bai}该功能需要root用户才能运行!"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
break_end
mobufan
return 1
fi
return 0
}
show_snapshots() {
clear
root_use
if ! command -v qm &> /dev/null; then
echo -e ""
echo -e "${gl_huang}>>> KVM 虚拟机快照 ${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai}"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
log_error "未检测到Proxmox VE环境,请确保脚本在PVE节点上运行"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
break_end
return 1
fi
echo -e ""
echo -e "${gl_zi}>>> KVM 虚拟机快照 ${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai}"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
local vms=$(qm list 2>/dev/null | awk 'NR>1 {print $1}' | sort -n)
if [ -z "$vms" ]; then
log_info "未找到任何虚拟机"
else
for vmid in $vms; do
echo -e "\n${gl_lv}┌── 虚拟机 ID:${gl_bufan}$vmid${gl_bai}"
local snap=$(qm listsnapshot "$vmid" 2>/dev/null)
if [ -z "$snap" ]; then
echo -e "${gl_lv}└─ ${gl_huang}暂无快照${gl_bai}"
else
echo "$snap" | sed \
-e 's/current/当前系统/g' \
-e 's/You are here!/当前运行节点/g' \
-e 's/no-description/无备注/g' \
-e 's/^/├─ /'
echo -e "${gl_lv}└────────────────────────────────────${gl_bai}"
fi
done
fi
echo -e "\n${gl_zi}>>> LXC 容器快照 ${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai}"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
local cts=$(pct list 2>/dev/null | awk 'NR>1 {print $1}' | sort -n)
if [ -z "$cts" ]; then
log_info "未找到任何容器"
else
for ctid in $cts; do
echo -e "\n${gl_lv}┌── 容器 ID:${gl_bufan}$ctid${gl_bai}"
local snap=$(pct listsnapshot "$ctid" 2>/dev/null)
if [ -z "$snap" ]; then
echo -e "${gl_lv}└─ ${gl_huang}暂无快照${gl_bai}"
else
echo "$snap" | sed \
-e 's/current/当前系统/g' \
-e 's/You are here!/当前运行节点/g' \
-e 's/no-description/无备注/g' \
-e 's/^/├─ /'
echo -e "${gl_lv}└────────────────────────────────────${gl_bai}"
fi
done
fi
echo -e "\n${gl_bufan}————————————————————————————————————————————————${gl_bai}"
break_end
}
if [ "$EUID" -ne 0 ]; then
log_error "此脚本需要 root 权限运行"
echo -e "${gl_huang}请使用 sudo 执行此脚本${gl_bai}"
exit 1
fi
show_snapshots
创建本地脚本
new_script="pve_snapshot_list.sh"
cat > "$new_script" << 'EOF'
#!/bin/bash
# 粘贴脚本源码
EOF
chmod +x "$new_script" && ./"$new_script" && rm -f "$new_script"