Я хотел бы определить имя виртуальной машины 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.