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 savevm
comando. 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 libvirt
estrutura de gerenciamento de virtualização. Nessa estrutura, você definiria máquinas virtuais usando qualquer hipervisor compatível, libvirt
incluindo qemu
, xen
, virtualbox
por meio da interface de gerenciamento.
libvirt
fornece um nível de abstração acima de coisas como qemu
. Com ele, você não começaria qemu
diretamente. Em vez disso libvirt
, começaria qemu
com algumas opções especiais que permitem interagir com qemu
.
Por exemplo, no meu sistema, libvirt
iniciei 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 libvirt
pode interagir qemu
(usando algum canal baseado em JSONmáquinaprotocolo)
Mas você não usaria isso diretamente. Você emitiria virsh
comandos como virsh shutdown
. virsh
os transmitiria ao libvirtd
daemon que por sua vez os traduziria em qemu
instruçõ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-manager
ou virt-install
(ou virsh define/create
). Em vez disso, você começou qemu
manualmente sozinho.
libvirt
, se estiver instalado, não tem conhecimento dessa VM. Portanto, não adianta tentar usar virsh
para 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 help
um resumo.
Se você tivesse dado umnomepara sua VM com -name
, você poderá recuperá-la com o info name
comando lá.
É onde você executaria seu savevm
comando qemu. Mas para usar o savevm
comando AFAIK, você precisa ter pelo menos uma qcow2
imagem 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 quit
trazer de volta a VM desse estado salvo adicionando um -incoming 'exec:gunzip</path/to/savestate.gz'
à sua qemu-system
linha 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.