Виртуализация операционных систем с помощью QEMU. Основы работы с эмулятором
Виртуализация — наиболее доступный способ запустить на одном ПК вторую операционную систему, не устанавливая ее непосредственно на жесткий диск. Вместо этого вторая ОС устанавливается на диск виртуальный, представленный специальным файлом-контейнером, созданным в гипервизоре — программе, позволяющей эмулировать работу гостевой системы в системе хостовой. Наибольшей популярностью среди домашних юзеров пользуются гипервизоры VirtualBox и VMware с мощным функционалом и наглядным GUI .
Но есть и другие, в чём-то даже более гибкие и продуктивные решения хотя и куда менее удобные в использовании. Например, QEMU — бесплатная программа с открытым исходным кодом, предназначенная для эмуляции программного обеспечения и операционных систем. Инструмент использует аппаратную виртуализацию, поддерживая два режима работы:
• Полная эмуляция — данный режим применяется для запуска операционных систем, в его рамках QEMU эмулирует физическое устройство со всеми его компонентами, встроенными и периферийными.
• Эмуляция пользовательского режима — дает возможность запускать программы, созданные для конкретной архитектуры на другой архитектуре, например, приложения ARM в x86 . Режим доступен только в хостовой системе Linux.
QEMU поддерживается эмуляция архитектуры x86 , ARM , MIPS , PowerPC , m68k , Alpha , SPARC , SH-4 , CRISv2 , MicroBlaze и это более солидный список, чем у того же Виртуалбокс.
Как установить QEMU в Windows
Скачать установочный файл эмулятора можно с официального сайта www.qemu.org/download/#windows,
есть редакции 32-битные и 64-битные, версию выбираем последнюю.
Устанавливается QEMU как обычная программа в папку Program Files\qemu , но можно выбрать и другое расположение.
Установку выполняем с параметрами по умолчанию, ничего менять не нужно, просто жмем в окне мастера «Next».
Виртуализация операционных систем в QEMU
В отличие от VirtualBox и подобных гипервизоров, QEMU не имеет графического интерфейса, работа с ней ведется через командную строку. Команд и параметров для создания и управления виртуальными машинами много, но для начала вам нужно знать хотя бы эти шесть.
• qemu-system — задает архитектуру виртуальной машины.
• qemu-img create — создает файл виртуального IMG -диска, на который будет устанавливаться операционная система.
• -m — выделяет виртуальной ОС указанный объем оперативной памяти.
• -hda — подключает созданный виртуальный диск.
• -boot IMG — указывает, что загрузка должна производиться с виртуального диска, вместо IMG следует указать имя IMG -файла.
• cdrom — содержит путь к установочному образу ISO , эмулирует дисковод.
Чтобы вам стало всё немного понятнее, установим и запустим с помощью QEMU какую-нибудь операционную систему. Для примера мы выбрали Windows XP, так как она легкая и занимает на диске мало места. QEMU у нас уже установлен, открываем командную строку, переходим в каталог установки и создаем виртуальный жесткий диск следующей командой:
qemu-img.exe create -f raw c.img 5000M
Файл qemu-img.exe в эмуляторе отвечает за создание IMG -образов, с — это название образа, 5000 — размер виртуального диска в мегабайтах. По умолчанию образ будет создан в папке QEMU .
Теперь сформируем следующую команду:
qemu-system-i386w.exe -boot c -m 350 -hda c.img -cdrom «E:\WinXP_SP3.iso»
Исполняемый файл в начале команды отвечает за создание виртуальной машины с архитектурой х86 , -boot с ключом -с сообщает, что грузиться она будет с диска, в значение параметра -hda подставляем созданный образ, а в качестве значения параметра –cdrom указываем путь к дистрибутиву Windows.
После выполнения команды появляется окошко QEMU с загрузочным меню, в котором мы выбираем установку на диск.
Далее проходим все этапы установки операционной системы вплоть до локальных настроек и загрузки рабочего стола.
Чтобы запустить закрытую виртуальную машину, выполните команду qemu-system-i386w.exe -hda name.img , где name — название вашего виртуального диска, чтобы удалить ставшую ненужной VM, просто удалите из каталога установки QEMU созданный IMG -образ.
Управлять QEMU можно с помощью клавиатуры и мыши, для переключения между эмулятором и хостовой машиной используйте комбинацию Ctrl + Alt + G . Запущенная с минимальными настройками ОС не будет иметь доступа к аудио- и сетевой карте, не будет также возможности обмена файлами между виртуальной и хостовой системами.
Нельзя сказать, что QEMU лучше или хуже VirtualBox либо VMware, это альтернативное средство виртуализации, имеющие как свои плюсы, так и минусы. QEMU менее удобен, требует знания документации и демонстрирует весьма небольшую производительность. Для ускорения работы в Windows требуется установка и настройка Диспетчера аппаратного ускорения HAXM, в Linux – подключение загружаемого модуля ядра KVM . С другой стороны, инструмент позволяет эмулировать работу устройств на базе разных архитектур, не поддерживаемые популярными гипервизорами.
Источник
Linux для ARM в эмуляторе qemu
Вывести что-нибудь на экран эмулируемого устройства VersatilePB не так-то просто. Все примеры простых ядер для ARM, которые удалось найти на момент написания статьи, ограничиваются работой с последовательным портом.
Этот пост — начало серии, рассказывающей о том, как собиралось простое ядро для вывода на экран эмулируемого устройства.
На примере 2-х с небольшим тысяч строк кода будет подробно рассказано об инициализации памяти, зонах памяти, slab-аллокаторе применяемых в Linux.
Сборка ядра для архитектуры ARM (на примере linux-2.6.32.3)
Команды, приводимые далее взяты из файлов *.cmd. Эти файлы формируются автоматически системой сборки ядра, но никто не запрещает использовать команды непосредственно.
Ядро запускаемое в qemu ./arch/arm/boot/zImage получается отсечением ненужных секций от скомпилированного кода распаковки:
Этот код собирается из библиотеки(libgcc.a), файла содержащего точку входа (head.o), файла в который включены двоичные данные упакованного ядра (piggy.o) и кода на Си выполняющего распаковку (misc.o):
Упакованное ядро добавляется в piggy.S строкой:
piggy.o компилируется командой:
Файл piggy.gz получается командой:
Обратите внимание на две точки между директориями compressed и Image. Они означают переход на один уровень вверх в дереве файловой системы, т.е. Image расположен в arch/arm/boot/.
Такие сложности обусловлены автоматической генерацией команд сборки.
Image получается отсечением ненужных секций от скомпилированного ядра.:
Не упакованое ядро (vmlinux) получается так:
И наконец файл main.c, который мы будем рассматривать входит в состав init/built-in.o:
После окончания работы по отделению необходимого кода от дерева исходников ядра получилась следующая последовательность команд, позволяющая собрать минимальное ядро, способное выводить информацию на дисплей эмулятора архитектуры ARM:
user/arm-2011.09/bin/ — путь начинающийся от домашнего каталога автора до директории, содержащий тулчейн. Если вы скопируете тулчейн для ARM в свой домашний каталог и измените «user», на имя пользователя, то у Вас всё должно получиться.
Команды объединены в исполняемый файл make (не путайте с одноименной утилитой).
Код непосредственно после отделения от дерева исходников ядра, включая всё, о чем пойдет речь в следующих постах arm_qemu_max.
Сокращенный вариант, без инициализации памяти и slab-аллокатора (только вывод на экран) arm_qemu_min.
Текст остальных статей написан. Остается только опубликовать.
Источник
luk6xff / ARMonQEMUforDebianUbuntu.md
You might want to read this to get an introduction to armel vs armhf.
If the below is too much, you can try Ubuntu-ARMv7-Qemu but note it contains non-free blobs.
Running ARM programs under linux (without starting QEMU VM!)
First, cross-compile user programs with GCC-ARM toolchain. Then install qemu-arm-static so that you can run ARM executables directly on linux
If there’s no qemu-arm-static in the package list, install qemu-user-static instead
Then compile your programs in amd64 directly:
If you want a dynamically-linked executable, you’ve to pass the linker path too:
If you want to run an ARM64 binary:
For running the C++ program:
Notice that the version number of the libcstdc++ might change
Create a hard disk
Create a hard disk for your virtual machine with required capacity.
You can then install Debian using an ISO CD or directly from vmlinuz
Netboot from vmlinuz
First, you should decide what CPU and machine type you want to emulate.
You can get a list of all supported CPUs (to be passed with -cpu option, see later below):
You can get a list of all supported machines (to be passed with -M option, see later below):
In this example, I chose the cortex-a9 CPU and vexpress-a9 machine. This is an ARMv7 CPU which Debian calls as armhf (ARM hard float). You must download vmlinuz and initrd files for, say Wheezy armhf netboot. Cortex-A8, A9, A15 are all ARMv7 CPUs.
You can emulate ARMv6 which Debian calls as armel by downloading the corresponding files for Wheezy armel netboot. Note that you need armel for ARMv5, v6. Raspberry Pi uses ARMv6. In this case, the cpu is arm1176 and machine is versatilepb .
Create a virtual machine with 1024 MB RAM and a Cortex-A9 CPU. Note that we must -sd instead of -sda because vexpress kernel doesn’t support PCI SCSI hard disks. You’ll install Debian on on MMC/SD card, that’s all it means.
Specifying -cpu is optional. It defaults to -cpu=any . However, -M is mandatory.
This will start a new QEMU window and the Debian installer will kick-in. Just proceed with the installation (takes maybe 3 hours or so). Make sure you install «ssh-server» in tasksel screen.
NOTE: For creating ARMv6, just pass versatilepb :
Netboot from ISO
Download netboot ISO for armhf or armel as needed.
WAIT! Apparently, these Debian CD images are not bootable! But Ubuntu’s ARM CD image works [2].
First boot from newly installed system
You need to copy vmlinuz from the installed disk image and pass it again to qemu-system-img [Qemu wiki] (http://en.wikibooks.org/wiki/QEMU/Images#Mounting_an_image_on_the_host»).
Then pass the copied kernel and initrd to qemu-system-img. Also note that we are now booting from /dev/sda1 because that is where Linux was installed
And there you go, play with ARM to your heart’s extent!
Extract & copy the boot files exactly as before (but for armhf.img) and pass while invoking:
Once again, note the device ( mmcblk0p1 ) and partition ( armhf.img ) reflect SD-card usage.
Connecting to the SSH server
Login to the guest OS and create a private/public key pair: ssh-keygen -t rsa .
On the host, just redirect some random port from the host to guest’s port 22 (or whichever port the SSH server is running on, see /etc/ssh/sshd_config)
Then you can connect to SSH just like ssh -p 5555 localhost .
Chroot Voodoo your ARM VM (architectural chroot with QEMU)
After the install of your ARM, you will probably see that it is really slow. To speed up your arm, you can chroot it natively and let qemu-user-static interpret the ARM instruction. [5]
We mount the image using loopback
Copy the static binary
We register qemu-arm-static as ARM interpreter to the kernel linux. [6]
Now we chroot to our VM.
Let see if it work:
N.B: After test, qemu 1.1 (Debian wheezy) had some strange behaviour but the 1.5 (Ubuntu saucy) was working perfectly !
When you finished your work you should unmount everything to avert bad behaviour. Do not forget to not start your VM with Qemu before unmount everything !
Источник
billti / arm64-on-Win10.md
Below are the steps to get an ARM64 version of Ubuntu running in the QEMU emulator on Windows 10.
Install for Windows from https://qemu.weilnetz.de/w64/ (I used qemu-w64-setup-20181211.exe )
Put C:\Program Files\qemu on your PATH, and run the below to check it’s working (which will list out the CPUs the AArch64 emulator can emulate):
Copy the Firmware and OS images
Into your working directory.
Create the configuration data image
The Ubuntu server images require configuration data be provided as an image, such as setting auth credentials.
The tool used to convert the config text file into an image file only runs on Linux, so I’ve attached a user-data.img file (and the text file used to create it) in a zip file to this Gist. Extract the user-data.img file to the working directory.
The user-data.img file was created for password authentication as outlined in https://stackoverflow.com/a/53373376
Launch the emulator from the working directory
Run the below to boot the image, you will some some benign errors at startup. Wait until the output settles down (even after you see the login prompt, as the post-boot config may not have completed yet).
To break down these lines:
- qemu-system-aarch64 -m 2048 -cpu cortex-a72 -smp 4 -M virt -nographic — run the ARM64 virtual platform emulator with 2GB RAM and 4 Cortex-A72 cores with no GUI support.
- -bios QEMU_EFI.fd — use the firmware downloaded above.
- -drive if=none,file=ubuntu-16.04-server-cloudimg-arm64-uefi1.img,id=hd0 — use the Ubuntu image file
- -device virtio-blk-device,drive=hd0 — mount drive from above as a block device
- -drive file=user-data.img,format=raw — use the configuration data image file
- -device virtio-net-device,netdev=net0 — create a virtual network device
- -netdev user,hostfwd=tcp:127.0.0.1:2222-:22,id=net0 — set up the networking stack and forward the SSH port
Then from a good Terminal emulator (I recommend the new Windows Terminal app with one of the Powerline fonts) you can connect over SSH with the below, and the configured password ( asdfqwer ):
Источник