如何确定正在运行的 QEMU 虚拟机的名称?

如何确定正在运行的 QEMU 虚拟机的名称?

我想确定我开始使用的 QEMU VM 的名称:

qemu-system-x86_64 -m 4096 -smp 1 \
  -net user -net nic,model=virtio -boot menu=on \
  -drive file=guixsd-usb-install-0.13.0.x86_64-linux.img \
-drive file=guixsd.img

(根据GuixSD虚拟机安装指南)。我希望确定虚拟机名称的原因是这样我可以使用该savevm命令保存其机器状态(类似于 VirtualBox 虚拟机的方式)。我尝试过使用:

virsh -c qemu:///system list

但这会返回:

 Id    Name                           State
----------------------------------------------------

同样运行:

ps -ef | grep qemu-system-x86_64

(每这个 AskUbuntu 答案)没有帮助,因为我用来启动虚拟机的命令。如果有某种相关性的话,我正在运行 Gentoo Linux 作为我的主机操作系统。

答案1

virsh是操作libvirt虚拟化管理框架的 CLI 工具。在该框架中,您可以使用任何支持的虚拟机管理程序来定义虚拟机,包括libvirtqemuxen通过virtualbox管理接口。

libvirt提供了高于诸如qemu.有了它,你就不会qemu直接开始了。相反,将从一些允许与 交互的特殊选项libvirt开始。qemuqemu

例如,在我的系统上,libvirt使用其虚拟机的以下参数启动 qemu:

qemu-system-x86_64  -enable-kvm \
                    -name freebsd11.0 -S \
                    -machine pc-i440fx-wily,accel=kvm,usb=off \
                    -cpu Nehalem \
                    -m 1536 \
                    -realtime mlock=off \
                    -smp 3,sockets=3,cores=1,threads=1 \
                    -uuid 82f3448e-2767-46b1-a7d1-7072184ef924 \
                    -no-user-config \
                    -nodefaults \
                    -chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-freebsd11.0/monitor.sock,server,nowait \
                    -mon chardev=charmonitor,id=monitor,mode=control \
                    -rtc base=utc,driftfix=slew \
                    -global kvm-pit.lost_tick_policy=discard \
                    -no-hpet \
                    -no-shutdown \
                    -global PIIX4_PM.disable_s3=1 \
                    -global PIIX4_PM.disable_s4=1 \
                    -boot strict=on \
                    -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x6.0x7 \
                    -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x6 \
                    -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x6.0x1 \
                    -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x6.0x2 \
                    -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x5 \
                    -drive file=/home/chazelas/Downloads/FreeBSD-11.0-RC1-amd64.qcow2,format=qcow2,if=none,id=drive-virtio-disk0 \
                    -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x7,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 \
                    -netdev tap,fd=26,id=hostnet0,vhost=on,vhostfd=28 \
                    -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:11:8a:53,bus=pci.0,addr=0x3 \
                    -chardev pty,id=charserial0 \
                    -device isa-serial,chardev=charserial0,id=serial0 \
                    -chardev spicevmc,id=charchannel0,name=vdagent \
                    -device virtserialport,bus=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=com.redhat.spice.0 \
                    -spice port=5900,addr=127.0.0.1,disable-ticketing,image-compression=off,seamless-migration=on \
                    -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,vgamem_mb=16,bus=pci.0,addr=0x2 \
                    -device intel-hda,id=sound0,bus=pci.0,addr=0x4 \
                    -device hda-duplex,id=sound0-codec0,bus=sound0.0,cad=0 \
                    -chardev spicevmc,id=charredir0,name=usbredir \
                    -device usb-redir,chardev=charredir0,id=redir0 \
                    -chardev spicevmc,id=charredir1,name=usbredir \
                    -device usb-redir,chardev=charredir1,id=redir1 \
                    -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x8 \
                    -msg timestamp=on

其中大部分是虚拟机的虚拟硬件的规范,但您也会看到:

-chardev socket,id=charmonitor,path=/var/lib/libvirt/qemu/domain-freebsd11.0/monitor.sock,server,nowait 
-mon chardev=charmonitor,id=monitor,mode=control

libvirt它指定一个可以与之交互的通道qemu(使用一些基于 JSON 的机器协议)

但你不会直接使用它。您可以发出virsh类似的命令virsh shutdownvirsh会将这些传输到libvirtd守护进程,守护进程又会qemu使用该通道将其转换为特定指令。

但就您而言,您没有使用libvirt.您尚未使用virt-managervirt-install(或virsh define/create) 定义虚拟机。相反,您qemu自己手动启动。

libvirt,如果已安装,则不知道该虚拟机。因此尝试virsh与它交互是没有意义的。

你开始的方式qemu,你没有指定任何特定的监视器与之交互的通道,因此您将获得默认值。

默认情况下,您通常会得到雪迪龙图形控制台。

在其中,您可以输入Ctrl+Alt+2以获取人类监控界面。那是一个命令行界面。你会看到一个

 (qemu) 

提示您可以在其中输入命令。尝试help总结一下。

如果你给了一个姓名到您的虚拟机-name,您可以使用info name那里的命令检索它。

这就是您运行savevmqemu 命令的地方。但要使用该savevm命令,据我所知,您必须至少将一个qcow2磁盘映像附加到虚拟机,但这似乎不适合您的情况。

要挂起并保存虚拟机的状态,您可以执行以下操作(在提示符下(qemu)):

migrate "exec:gzip>/path/to/savedstate.gz"

这将挂起虚拟机并将压缩状态保存到文件中。然后,您可以通过在命令行中quit添加 来将虚拟机从保存的状态恢复。-incoming 'exec:gunzip</path/to/savestate.gz'qemu-system

如果您熟悉 qemu,您可以做很多事情,但如果您想让您的生活更轻松,您可能会使用 qemu 的管理包装器,例如 libvirt。

相关内容