PVE紧急救援:从文件系统崩溃到虚拟机数据完美恢复

一、故障现象与问题描述

在Proxmox VE (PVE) 使用过程中,因主板南桥突然损坏,遭遇了严重故障。系统表现如下:

  • 控制台错误:登录界面输入root密码后直接黑屏(已开启显卡直通)。
  • 远程访问失效:SSH无法连接,Web管理界面无法打开。
  • 核心报错:服务器物理控制台或日志中出现以下关键错误,表明文件系统已损坏并被强制设为只读:
ext4_journal_check_start:84: commsustend-journal: Detected aborted journal
EXT4-fs (dm-1): Remounting filesystem read-only

二、恢复思路与准备工作

这种情况通常是由于PVE宿主机根文件系统(/dev/pve/root)的日志(journal)损坏,导致系统无法正常写入,进而引发一系列服务异常。我们的恢复目标是优先抢救虚拟机数据和配置文件,而非修复系统。

准备工作:

  1. 一个Ubuntu Desktop 22.04的启动U盘
  2. 一个足够大的外部存储设备(如移动硬盘),用于备份虚拟机磁盘和配置文件。

三、进入救援环境

  1. 将Ubuntu启动U盘插入服务器,并从U盘启动。
  2. 在GRUB菜单中选择 “Try Ubuntu” 进入Live系统。
  3. 打开终端(Terminal),开始救援操作。

四、挂载并检查PVE系统盘

  1. 查看磁盘分区结构
    使用 lsblk 命令确认PVE的磁盘和LVM结构。从输出中可以看到,PVE系统盘是一个LVM逻辑卷,所有虚拟机的磁盘也都以逻辑卷(LV)的形式存在。
lsblk
  1. 激活LVM卷组
    PVE的磁盘默认使用LVM管理,需要先激活它。
sudo vgscan
sudo vgchange -ay pve
  1. 以只读方式挂载PVE根分区
    为了安全起见,我们以只读模式挂载根分区,避免对损坏的文件系统造成二次伤害。noload 参数可以跳过对损坏日志的加载,确保挂载成功。
sudo mkdir -p /mnt/pve-root
sudo mount -o ro,noload /dev/pve/root /mnt/pve-root

如果此步骤成功,说明我们可以读取数据,这是恢复的关键一步。

五、准备备份目标盘

将外部存储设备(例如 /dev/sdb1)挂载到系统中。注意: 请根据你的实际情况替换设备名称。

# 创建挂载点
mkdir -p /mnt/backup

# 挂载备份硬盘
sudo mount /dev/sdb1 /mnt/backup

# 测试硬盘是否可写
sudo touch /mnt/backup/.test && echo "硬盘可写" && sudo rm /mnt/backup/.test

六、核心数据备份

这是最关键的一步,我们将备份所有虚拟机的磁盘和配置文件。

  1. 备份虚拟机磁盘(转为qcow2格式)
    虚拟机磁盘以RAW格式存储在LVM逻辑卷中。我们使用 qemu-img 将它们转换为更通用的qcow2格式,并添加压缩(-c),以节省备份空间。
# 创建存放磁盘备份的目录
sudo mkdir -p /mnt/backup/vm-disks

# 遍历所有虚拟机磁盘逻辑卷
for lv in /dev/mapper/pve-vm--*--disk--0 /dev/mapper/pve-vm--*--state--*; do
    if [ -e "$lv" ]; then
        # 提取并格式化名称
        raw_name=$(basename "$lv" | sed 's/pve-//' | sed 's/--/-/g')
        echo "正在导出: $raw_name"
        # 进行转换和压缩
        sudo qemu-img convert -p -f raw -O qcow2 -c "$lv" "/mnt/backup/vm-disks/$raw_name.qcow2"
        echo "完成: $raw_name.qcow2"
        echo "----------------------------------------"
    fi
done

# 查看备份结果
ls -lh /mnt/backup/vm-disks/
  1. 备份虚拟机配置文件
    PVE的所有配置(包括虚拟机、网络、存储等)都保存在一个SQLite数据库 (config.db) 中。我们直接导出这个数据库的SQL脚本,以备后用。
# 确认数据库文件存在
ls -l /mnt/pve-root/var/lib/pve-cluster/config.db

# 安装sqlite3工具
sudo apt update && sudo apt install -y sqlite3

# 导出数据库内容
sudo sqlite3 /mnt/pve-root/var/lib/pve-cluster/config.db ".dump" > /mnt/backup/config_dump.sql
  1. 从导出的SQL文件中提取单个虚拟机配置
    为了日后恢复方便,我们将每个虚拟机的配置(如 100.conf)从SQL dump文件中单独提取出来。
# 创建存放配置文件的目录
OUT_DIR="/mnt/backup/vm-configs"
sudo mkdir -p "$OUT_DIR"

# 解析config_dump.sql文件,提取每个虚拟机的配置
grep -E "INSERT INTO tree VALUES\([^)]*'([0-9]+\.conf)',X'([0-9a-fA-F]+)'" /mnt/backup/config_dump.sql | \
while IFS= read -r line; do
    if [[ $line =~ \'([0-9]+\.conf)\',X\'([0-9a-fA-F]+)\' ]]; then
        filename="${BASH_REMATCH[1]}"
        hexdata="${BASH_REMATCH[2]}"
        echo "提取: $filename"
        # 将十六进制数据解码并写入文件
        echo "$hexdata" | xxd -r -p | sudo tee "$OUT_DIR/$filename" >/dev/null
    fi
done

echo "所有配置已保存到: $OUT_DIR"
ls -l "$OUT_DIR"

七、数据恢复方法

当你的PVE系统重建或修复后,可以使用备份的数据快速恢复虚拟机。

  1. 恢复虚拟机磁盘
    在新PVE系统中,将备份的qcow2文件上传,并使用qm importdisk命令将其导入为虚拟机的磁盘。
# 格式:qm importdisk <VM_ID> <备份的qcow2文件路径> <存储池名称>
qm importdisk 100 /mnt/backup/vm-disks/vm-100-disk-0.qcow2 local-lvm

导入后,需要在PVE的Web界面或通过命令行将该磁盘附加到对应的虚拟机上,并设置正确的引导顺序。

  1. 恢复虚拟机配置
    如果你备份了单个的 *.conf 文件,可以直接将其复制到新PVE系统的 /etc/pve/qemu-server/ 目录下。
sudo cp /mnt/backup/vm-configs/100.conf /etc/pve/qemu-server/

八、总结与建议

本次事故的核心原因是根文件系统的日志损坏,导致系统以只读方式挂载。通过以下步骤,我们成功完成了数据救援:

  1. 冷静分析:根据报错信息定位问题根源。
  2. 进入救援环境:使用Live USB启动,绕过损坏的系统。
  3. 激活并只读挂载:安全地访问原始数据。
  4. 数据导出:将核心数据(虚拟机磁盘和配置)备份到外部存储。

一些建议:

  • 定期备份:务必定期备份 /etc/pve 目录(包含所有配置)和重要的虚拟机磁盘。
  • 硬件检查:文件系统损坏有时是硬件(如硬盘、内存)问题的先兆,建议对硬件进行全面检查。
  • 系统健康:考虑定期重启PVE节点,检查文件系统状态。

希望这份指南能帮助遇到类似问题的朋友,安全地找回宝贵的数据。

最后修改:2026 年 03 月 23 日
如果觉得我的文章对你有用,请随意赞赏