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 savevm
comando. 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
virsh
es la herramienta CLI para operar el libvirt
marco de gestión de virtualización. En ese marco, definiría máquinas virtuales utilizando cualquiera de los hipervisores admitidos , libvirt
incluido , a través de la interfaz de administración.qemu
xen
virtualbox
libvirt
proporciona un nivel de abstracción por encima de cosas como qemu
. Con él no empezarías qemu
directamente. En lugar de eso libvirt
, comenzaría qemu
con algunas opciones especiales que permitan interactuar con él qemu
.
Por ejemplo, en mi sistema, libvirt
inicié 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 libvirt
se puede interactuar qemu
(usando algún formato basado en JSON).máquinaprotocolo)
Pero no lo usarías directamente. Emitirías virsh
comandos como virsh shutdown
. virsh
los transmitiría al libvirtd
demonio que a su vez los traduciría a qemu
instrucciones específicas usando ese canal.
Sin embargo, en tu caso no estás usando libvirt
. No ha definido una máquina virtual usando virt-manager
o virt-install
(o virsh define/create
). En lugar de eso, ha comenzado qemu
manualmente usted mismo.
libvirt
, si está instalado, no tiene conocimiento de esa VM. Así que no tiene sentido intentar usarlo virsh
para 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 help
con un resumen.
Si hubieras dado unnombrea su VM con -name
, podrá recuperarlo con el info name
comando allí.
Ahí es donde ejecutarías tu savevm
comando qemu. Pero para usar el savevm
comando, AFAIK, debes tener al menos una qcow2
imagen 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 quit
recuperar la VM desde ese estado guardado agregando un -incoming 'exec:gunzip</path/to/savestate.gz'
a su qemu-system
lí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.