Я использую эмулятор qemu для aarch64 и хочу создать внешнюю контрольную точку (или быструю переадресацию), чтобы сохранить все, что мне нужно для перезапуска системы, только с того момента, когда я создаю контрольную точку. (На самом деле, я хочу пропустить шаг загрузки) Я нашел кое-что только по снапшоту ВМ qemu и быстрой переадресации, но это не работает для эмулятора. Есть ли функция контрольной точки для эмулятора qemu?
Есть ли в эмуляторе qemu функция контрольной точки?
Ответы (2)
Снимок savevm должен делать то, что вы хотите. Короткий ответ: вам нужно настроить диск QCOW2 для сохранения моментальных снимков, а затем в мониторе вы можете использовать команду «savevm», чтобы сделать снимок. Затем параметр командной строки «-loadvm» позволит вам продолжить оттуда. Все это отлично работает в эмуляции AArch64.
https://translatedcode.wordpress.com/2015/07/06/tricks-for-debugging-qemu-savevm-snapshots/ содержит более подробное руководство.
Минимальный пример
Ответ Питера только что сработал для меня, но позвольте мне привести полностью воспроизводимый пример.
Я полностью автоматизировал все по адресу: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/1e0f0b492855219351b0bfa2eec4d3a6811fcaaa#snapshot
Ключевым шагом является преобразование изображения в qcow2, как описано по адресу: https://docs.openstack.org/image-guide/convert-images.html
cd buildroot/output.x86_64~/images
qemu-img convert -f raw -O qcow2 rootfs.ext2 rootfs.ext2.qcow2
И последняя использованная команда QEMU:
./buildroot/output.x86_64~/host/usr/bin/qemu-system-x86_64 -m 128M -monitor telnet::45454,server,nowait -netdev user,hostfwd=tcp::45455-:45455,id=net0 -smp 1 -M pc -append 'root=/dev/vda nopat nokaslr norandmaps printk.devkmsg=on printk.time=y console=ttyS0' -device edu -device virtio-net-pci,netdev=net0 -drive file=./buildroot/output.x86_64~/images/rootfs.ext2.qcow2,if=virtio,format=qcow2 -kernel ./buildroot/output.x86_64~/images/bzImage -nographic
Чтобы проверить это, войдите в виртуальную машину и запустите:
i=0; while true; do echo $i; i=$(($i + 1)); sleep 1; done
Затем в другой оболочке откройте монитор:
telnet localhost 45454
savevm my_snap_id
Подсчет продолжается. Затем, если мы загрузим виртуальную машину:
loadvm my_snap_id
отсчет возвращается к тому месту, где мы сохранили. Это показывает, что состояния ЦП и памяти были восстановлены.
Мы также можем убедиться, что состояние диска также изменилось на противоположное. Гость:
echo 0 >f
Монитор:
savevm my_snap_id
Гость:
echo 1 >f
Монитор:
loadvm my_snap_id
Гость:
cat f
И выход 0
.