Как определить имя запущенной виртуальной машины QEMU?

Как определить имя запущенной виртуальной машины QEMU?

Я хотел бы определить имя виртуальной машины QEMU, с которой я начал:

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). Причина моего желания определить имя виртуальной машины заключается в том, что я могу сохранить ее состояние машины (аналогично тому, как это можно сделать для виртуальной машины VirtualBox) с помощью команды savevm. Я пробовал использовать:

virsh -c qemu:///system list

но это возвращает:

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

аналогично работает:

ps -ef | grep qemu-system-x86_64

(заэтот ответ AskUbuntu) не помогает из-за команды, которую я использовал для запуска VM. Если это как-то относится к делу, я использую Gentoo Linux в качестве хостовой ОС.

решение1

virshэто инструмент CLI для работы с libvirtфреймворком управления виртуализацией. В этом фреймворке вы можете определить виртуальные машины, используя любой из поддерживаемых гипервизоров, включая libvirt, qemu, xenчерез virtualboxинтерфейс управления.

libvirtобеспечивает уровень абстракции выше таких вещей, как qemu. С ним вы не начнете qemuнапрямую. Вместо этого libvirtначнете qemuс некоторых специальных опций, которые позволяют взаимодействовать с qemu.

Например, в моей системе 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 shutdown. virsh, передавать их демону libvirtd, который в свою очередь будет переводить их в qemuконкретные инструкции, используя этот канал.

В вашем случае, однако, вы не используете libvirt. Вы не определили виртуальную машину с помощью virt-managerили virt-install(или virsh define/create). Вместо этого вы запустили ее qemuвручную самостоятельно.

libvirt, если он установлен, не имеет знаний об этой виртуальной машине. Поэтому нет смысла пытаться использовать virshдля взаимодействия с ней.

В том, как вы начали qemu, вы не указали никаких конкретныхмониторканал для взаимодействия с ним, поэтому вы получите значение по умолчанию.

По умолчанию вы обычно получаетеСДЛграфическая консоль.

В нем вы можете ввести, Ctrl+Alt+2чтобы получитьчеловекИнтерфейс монитора. Это интерфейс командной строки. Вы увидите

 (qemu) 

подсказка, где можно вводить команды. Попробуйте helpдля резюме.

Если бы вы далиимяна вашу виртуальную машину с помощью -name, вы сможете получить его с помощью info nameкоманды там.

Вот где вы бы запустили savevmкоманду qemu. Но чтобы использовать savevmкоманду, насколько мне известно, у вас должен быть хотя бы один qcow2образ диска, подключенный к виртуальной машине, что, похоже, не ваш случай.

Чтобы приостановить и сохранить состояние виртуальной машины, вы можете выполнить (в командной (qemu)строке):

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

Что приостановит работу VM и сохранит сжатое состояние в файл. А затем вы сможете quitпозже вернуть VM из этого сохраненного состояния, добавив -incoming 'exec:gunzip</path/to/savestate.gz'в qemu-systemкомандную строку.

Если вы хорошо знаете QEMU, вы можете сделать множество вещей, но если вы хотите облегчить себе жизнь, вам, вероятно, следует использовать оболочки управления QEMU, такие как libvirt.

Связанный контент