更新

更新

编辑:查看解决方案我的Update2 中存在以下问题。

在尝试了一些备份脚本后,我遇到了以下情况

virsh domblklist polar-bear                                                                                                                            
Target     Source
------------------------------------------------
vda        /home/user/vms/polarbear.backup
vdb        /home/user/vms/polarbear_data.backup

然而,这些文件实际上并不存在于此处。

ls -al /home/user/vms/*.backup
ls: cannot access '/home/user/vms/*.backup': No such file or directory

VM 运行良好,甚至可以无问题地重新启动。但我有点担心我很快就会遇到一些可怕的情况。

我猜删除快照时出了问题?

目前尚未为该机器配置快照。

virsh snapshot-list polar-bear                                                                                                                         
 Name                 Creation Time             State
------------------------------------------------------------

我应该怎么办?

更新

按照下面 DanielB 的解决方案操作后,我现在有了两个虚拟机。原始虚拟机处于暂停状态,而新创建的虚拟机在恢复的映像 + 旧映像的副本上运行。polar-bear2 的 XML 现在如下所示:

    <disk type='file' device='disk'>
  <driver name='qemu' type='qcow2'/>
  <source file='/mnt/sda3/polarbear.backup_recover'/>
  <backingStore type='file' index='1'>
    <format type='raw'/>
    <source file='/home/user/vms/polarbear_2.img'/>
    <backingStore/>
  </backingStore>
  <target dev='vda' bus='virtio'/>
  <alias name='virtio-disk0'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
</disk>
<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2'/>
  <source file='/mnt/sda3/nextcloud_data.backup_recover'/>
  <backingStore type='file' index='1'>
    <format type='raw'/>
    <source file='/home/user/vms/nextcloud_data_2.img'/>
    <backingStore/>
  </backingStore>
  <target dev='vdb' bus='virtio'/>
  <alias name='virtio-disk1'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</disk>

至少现在看起来还不错:

virsh domblklist polar-bear2
Target     Source
------------------------------------------------
vda        /mnt/sda3/polarbear.backup_recover
vdb        /mnt/sda3/nextcloud_data.backup_recover

nextcloud_data.backup_recover 图像大小仅为~2.5GB,但原始图像 /home/user/vms/nextcloud_data_2.img 有 16GB。

那么...我该如何将其恢复为一张图像?

UPDATE2-解决方案?

因此,在我检查了上述步骤中的 XML 之后,我得出结论,在互联网上搜索“Backingstore”。我偶然发现了这篇文章:

犹豫了一会儿之后,我觉得我现在有备份了,可以试试。所以我运行了

virsh blockcommit polar-bear2 vda --verbose --pivot --active
virsh blockcommit polar-bear2 vdb --verbose --pivot --active

现在看起来像这样:

virsh domblklist polar-bear2
Target     Source
------------------------------------------------
vda        /home/user/vms/polarbear.img
vdb        /home/user/vms/nextcloud_data.img

XML 现在如下所示:

  <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/home/user/vms/polarbear.img'/>
      <backingStore/>
      <target dev='vda' bus='virtio'/>
      <alias name='virtio-disk0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/home/user/vms/nextcloud_data.img'/>
      <backingStore/>
      <target dev='vdb' bus='virtio'/>
      <encryption format='luks'>
      </encryption>
      <alias name='virtio-disk1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>

所以我猜“转变”就是我想要做的......

然而,我觉得很奇怪的一件事:当我执行此块提交操作时,它将数据合并回

/home/用户/vms/polarbear.img

然而,在我为创建第二个虚拟机而修改的 XML 中,我把

/home/用户/vms/polarbear_2.img

所以我希望它能重新合并到这个图像中。

我猜测 libvirt 有一些 UUID 来跟踪磁盘映像,因此也许使用原始的......

不管怎样 - 我现在对原始 polarbear VM 做了同样的事情,我认为它有效。

答案1

在任何情况下都不允许关闭虚拟机,因为如果发生这种情况,您的磁盘可能会无法挽回地丢失。

您可以通过从实时文件描述符 QEMU 复制数据来恢复已删除的磁盘数据(只要它在运行,它就会保持打开状态)。...

首先需要找到QEMU进程的进程ID。

然后查看 /proc/$PID/fd/ 您应该会看到一些与您的磁盘映像相对应的符号链接,其中包含单词“(已删除)”。

您应该能够使用这些来读取已删除的文件中的数据。

例如,我的 QEMU 进程的 PID 为 253575,显示 FD“15”对应于我已删除的磁盘

# ls -al /proc/253575/fd | grep deleted
lrwx------. 1 qemu qemu 64 Oct 19 10:21 15 -> /var/lib/libvirt/images/demo.qcow2 (deleted)
#  dd if=/proc/253575/fd/15  of=safe.img bs=1M
1+1 records in
1+1 records out
1376256 bytes (1.4 MB, 1.3 MiB) copied, 0.00419377 s, 328 MB/s

在复制这样的图像之前,值得登录到您的虚拟机并至少运行“同步”以将所有待处理数据刷新到磁盘。

您需要对虚拟机中的每个磁盘执行此恢复。

现在仍然如此不是关闭正在运行的虚拟机。

现在复制你的客户端的 XML 配置并创建一个新的

$ virsh dumpxml polar-bear > polar-bear.xml
$ vi polar-bear.xml
....change the disk image paths and change the name, UUID...
$ virsh define polar-bear.xml

现在尝试启动这个新客户机并确保所有数据都存在且正确。

如果您最终确认一切正常,那么您可以考虑关闭已删除磁盘的原始客户机。

我建议先在非生产演示虚拟机上尝试整个过程,这样您就会感到舒适。例如,在您的笔记本电脑上启动一个新的虚拟机,删除其磁盘,然后尝试恢复它。一旦您测试它按预期工作,然后尝试在真正重要的虚拟机上进行恢复。

但是,如果您特别偏执,您可能需要登录到原始访客并将所有数据 rsync 到安全的地方作为第二个备份。

相关内容