¿Cómo determinar el nombre de una máquina virtual QEMU en ejecución?

¿Cómo determinar el nombre de una máquina virtual QEMU en ejecución?

Me gustaría determinar el nombre de una VM QEMU con la que comencé:

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

(según elGuía de instalación de la máquina virtual GuixSD). La razón por la que deseo determinar el nombre de la VM es para poder guardar el estado de su máquina (de manera similar a como se puede hacer con una VM VirtualBox) usando el savevmcomando. He intentado usar:

virsh -c qemu:///system list

pero esto regresa:

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

ejecutando igualmente:

ps -ef | grep qemu-system-x86_64

(poresta respuesta de AskUbuntu) no es útil debido al comando que utilicé para iniciar la VM. Si de alguna manera es relevante, estoy ejecutando Gentoo Linux como mi sistema operativo host.

Respuesta1

virshes la herramienta CLI para operar el libvirtmarco de gestión de virtualización. En ese marco, definiría máquinas virtuales utilizando cualquiera de los hipervisores admitidos , libvirtincluido , a través de la interfaz de administración.qemuxenvirtualbox

libvirtproporciona un nivel de abstracción por encima de cosas como qemu. Con él no empezarías qemudirectamente. En lugar de eso libvirt, comenzaría qemucon algunas opciones especiales que permitan interactuar con él qemu.

Por ejemplo, en mi sistema, libvirtinicié qemu con esos parámetros para una de sus máquinas virtuales:

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

La mayor parte es especificación del hardware virtual de la máquina virtual, pero también verá:

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

El cual especifica un canal con el cual libvirtse puede interactuar qemu(usando algún formato basado en JSON).máquinaprotocolo)

Pero no lo usarías directamente. Emitirías virshcomandos como virsh shutdown. virshlos transmitiría al libvirtddemonio que a su vez los traduciría a qemuinstrucciones específicas usando ese canal.

Sin embargo, en tu caso no estás usando libvirt. No ha definido una máquina virtual usando virt-managero virt-install(o virsh define/create). En lugar de eso, ha comenzado qemumanualmente usted mismo.

libvirt, si está instalado, no tiene conocimiento de esa VM. Así que no tiene sentido intentar usarlo virshpara interactuar con él.

Por la forma en que has empezado qemu, no has especificado ningún detalle en particular.monitorcanal para interactuar con él, por lo que obtendrás el valor predeterminado.

De forma predeterminada, normalmente obtendrá elSDLconsola gráfica.

En él, puedes escribir Ctrl+Alt+2para obtener elhumanointerfaz del monitor. Esa es una interfaz de línea de comando. Verás un

 (qemu) 

mensaje donde puede ingresar comandos. Pruebe helpcon un resumen.

Si hubieras dado unnombrea su VM con -name, podrá recuperarlo con el info namecomando allí.

Ahí es donde ejecutarías tu savevmcomando qemu. Pero para usar el savevmcomando, AFAIK, debes tener al menos una qcow2imagen de disco adjunta a la VM, lo cual no parece ser tu caso.

Para suspender y guardar el estado de la VM, puede hacer (cuando (qemu)se le solicite):

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

Lo que suspendería la VM y guardaría el estado comprimido en un archivo. Y luego, puede quitrecuperar la VM desde ese estado guardado agregando un -incoming 'exec:gunzip</path/to/savestate.gz'a su qemu-systemlínea de comando.

Hay muchas cosas que puedes hacer si conoces bien qemu, pero si quieres hacer tu vida más fácil, probablemente usarías contenedores de administración alrededor de qemu como libvirt.

información relacionada