编辑:查看解决方案我的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 到安全的地方作为第二个备份。