kvm-snapshots 存储在哪里?

kvm-snapshots 存储在哪里?

我在 KVM/ubuntu 上运行了多个 VM,它们都使用该-snapshot参数启动(VM 仅计算一些可以在重启后销毁的东西)。

在我读过的文档中,更改不会写回到图像中,而是存储在临时文件中,并且在关机后会被删除。

现在,我想知道这些“临时文件”存储在文件系统的哪里?

答案1

尝试使用 lsof 查找快照存储:

# ps aux | grep kvm
$PID ?        Sl   5289:40 /usr/bin/kvm ...
# lsof -n -p $PID
COMMAND   PID USER   FD   TYPE   DEVICE        SIZE     NODE NAME

或一个命令:

# lsof -n -p $(ps ax | grep [k]vm | awk '{print $1}' | head -1)

答案2

我只是自己想知道“-snapshot”将其更改存储在哪里,最终找到了它的位置:它似乎使用与“mktemp”相同的算法。

也就是说,如果您将环境变量 TMPDIR 设置为某个目录的路径,那么它会将其临时数据存储在那里。

否则,它会将它们存储在 /tmp 中。

因此,如果您想将临时快照保存在 /var/tmp/kvm 而不是 /tmp 中,请按如下方式运行 qemu:

$ TMPDIR=/var/tmp/kvm qemu-system-x86_64 -enable_kvm ...

或者,您可以先“导出”变量:

$ export TMPDIR=/var/tmp/kvm
$ qemu-system-x86_64 -enable_kvm ...

如果您启动多个虚拟机,这可能会更好,因为您不需要为每次调用指定变量。

此外,如果您希望保留更改而不是在虚拟机关闭时丢失它们,请记住将“-no-shutdown”添加到 qemu 选项中。

使用 -no-shutdown 后,虚拟机关闭后进入停止状态,但虚拟机进程仍保持活动状态。

这样您就可以连接到 KVM 监控控制台并发出“commit”命令,该命令会将临时文件中的所有更改写回到 VM 映像文件。之后,您发出“quit”命令,该命令实际上会终止 VM 进程。

如果没有“-no-shutdown”,您就没有机会发出“commit”命令,而且如果没有该命令,一旦 VM 进程关闭,临时文件中的所有更改都将丢失。

另外要注意的是:一旦虚拟机使用“-snapshot”启动,$TMPDIR 指定的目录中就不会出现任何文件。

该文件存在,但 qemu 在创建文件后立即删除它,因此它不会出现在目录列表中。

但是 qemu 进程仍然持有该文件的引用,因此该文件将一直保持活动状态,直到 qemu 进程终止。只有到那时,“已删除”的文件才会真正被删除,其占用的空间才会作为可用空间返回给文件系统。

答案3

这是上面使用的命令的更简洁版本lsof。此变体有几项改进。其中之一就是它将列出所有 KVM VM。

$ lsof -n -p $(pgrep kvm | tr '\012' ,)

如果您知道使用这些扩展名来命名您的 VM 映像,那么您可以在输出中查找.img和文件。.qcow2

$ sudo lsof -n -p $(pgrep kvm | tr '\012' ,) |grep -E ".img|.qcow2"
qemu-kvm  3836 root   11u   REG              253,0 10737418240 19169281 /var/lib/libvirt/images/vm1.img
qemu-kvm  3895 root   11u   REG              253,0 48318382080 19890183 /kvm/vm2.img
qemu-kvm  3924 root   11u   REG              253,0 10737418240 19890185 /kvm/vm3.img
qemu-kvm 13594 root   11u   REG              253,0 43881005056 69173572 /var/lib/libvirt/images/vm4.qcow2

您也可以进行此操作并进行查询libvirtd以找出其有哪些可用的存储池。

$ sudo virsh pool-list
Name                 State      Autostart 
-----------------------------------------
default              active     yes       

$ sudo virsh vol-list default
Name                 Path                                    
-----------------------------------------
vm1-d-disk0        /var/lib/libvirt/images/vm1-d-disk0   
vm2-d-disk0        /var/lib/libvirt/images/vm2-d-disk0   
vm3.img            /var/lib/libvirt/images/vm3.img         
...

因此,默认路径看起来是/var/lib/libvirt/images使用池的虚拟机的路径。这也是与活动default相关的临时文件所在的目录。-snapshot

答案4

快照将存储在您配置的任何位置。在我的 F14 上它位于,但您可以随意/var/lib/libvirt/images使用virt-manager或中的存储域。virsh

相关内容