Como determinar o nome de uma máquina virtual QEMU em execução?

Como determinar o nome de uma máquina virtual QEMU em execução?

Gostaria de determinar o nome de uma VM QEMU com a qual comecei:

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

(de acordo comGuia de instalação da VM GuixSD). A razão do meu desejo de determinar o nome da VM é para que eu possa salvar o estado da máquina (da mesma forma que se faz para uma VM VirtualBox) usando o savevmcomando. Eu tentei usar:

virsh -c qemu:///system list

mas isso retorna:

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

da mesma forma executando:

ps -ef | grep qemu-system-x86_64

(poresta resposta do AskUbuntu) não é útil por causa do comando que usei para iniciar a VM. Se for de alguma forma relevante, estou executando o Gentoo Linux como meu sistema operacional host.

Responder1

virshé a ferramenta CLI para operar a libvirtestrutura de gerenciamento de virtualização. Nessa estrutura, você definiria máquinas virtuais usando qualquer hipervisor compatível, libvirtincluindo qemu, xen, virtualboxpor meio da interface de gerenciamento.

libvirtfornece um nível de abstração acima de coisas como qemu. Com ele, você não começaria qemudiretamente. Em vez disso libvirt, começaria qemucom algumas opções especiais que permitem interagir com qemu.

Por exemplo, no meu sistema, libvirtiniciei o qemu com esses parâmetros para uma de suas VMs:

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

A maior parte disso é especificação do hardware virtual da máquina virtual, mas você também vê:

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

Que especifica um canal com o qual libvirtpode interagir qemu(usando algum canal baseado em JSONmáquinaprotocolo)

Mas você não usaria isso diretamente. Você emitiria virshcomandos como virsh shutdown. virshos transmitiria ao libvirtddaemon que por sua vez os traduziria em qemuinstruções específicas usando aquele canal.

No seu caso, porém, você não está usando libvirt. Você não definiu uma VM usando virt-managerou virt-install(ou virsh define/create). Em vez disso, você começou qemumanualmente sozinho.

libvirt, se estiver instalado, não tem conhecimento dessa VM. Portanto, não adianta tentar usar virshpara interagir com ele.

Do jeito que você começou qemu, você não especificou nenhummonitorcanal para interagir com ele, então você obterá o padrão.

Por padrão, você normalmente obterá oSDLconsole gráfico.

Nele, você pode digitar Ctrl+Alt+2para obter ohumanointerface do monitor. Essa é uma interface de linha de comando. Você verá um

 (qemu) 

prompt onde você pode inserir comandos. Tente helpum resumo.

Se você tivesse dado umnomepara sua VM com -name, você poderá recuperá-la com o info namecomando lá.

É onde você executaria seu savevmcomando qemu. Mas para usar o savevmcomando AFAIK, você precisa ter pelo menos uma qcow2imagem de disco anexada à VM, o que não parece ser o seu caso.

Para suspender e salvar o estado da VM, você poderia fazer (no (qemu)prompt):

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

O que suspenderia a VM e salvaria o estado compactado em um arquivo. E então, você pode quittrazer de volta a VM desse estado salvo adicionando um -incoming 'exec:gunzip</path/to/savestate.gz'à sua qemu-systemlinha de comando.

Há muitas coisas que você pode fazer se conhecer bem o qemu, mas se quiser tornar sua vida mais fácil, provavelmente usaria wrappers de gerenciamento em torno do qemu, como o libvirt.

informação relacionada