Блочные устройства qemu

Краткое введение в технологию виртуализации

Начнем с краткого введения в технологию виртуализации, чтобы заложить основу для рассмотрения QEMU.

Под виртуализацией в этой статье подразумевается виртуализация платформы. Для физического оборудования, контролирующая программа может быть операционной системой-хозяином или гипервизором (см. Рисунок 1). В некоторых случаях сама хозяйская операционная система и является гипервизором. Гостевые операционные системы «проживают» на гипервизоре. В некоторых случаях гостевые операционные системы ориентированы на тот же процессор, что и контролирующая программа, но в других случаях платформы могут быть отличными (например, гостевая система PowerPC работает на x86 платформе).

Рисунок 1. Базовая архитектура виртуализации платформы

Реализовать виртуализацию можно множеством путей, но наиболее часто встречаются три основных метода. Первый называется «родной» (или полной) виртуализацией. В этом варианте гипервизор реализует основные элементы изоляции, отделяя физическое оборудование от гостевой операционной системы. Этот подход впервые был продемонстрирован в 1966 году в операционной системе виртуальных машин/виртуальной памяти IBM CP — 40, а сейчас тот же метод используется в VMware ESX Server.

Другой популярный метод виртуализации называется паравиртуализацией. В случае паравиртуализации контролирующая программа реализует интерфейса прикладных программ (API) гипервизора, который используется гостевой операционной системой. Паравиртуализацию используют Xen и Linux Kernel-based Virtual Machine (KVM).

Третий полезный метод называется эмуляцией. Эмуляция, как видно из названия, виртуализует гостевую платформу благодаря полной имитации аппаратной среды. Эмуляция осуществляется в различных формах, даже в пределах одного и того же приложения. Примерами виртуализации посредством эмуляции -являются QEMU и Bochs.

Установка Android на виртуальную машину QEMU

Проект с открытым исходным кодом, лицензированный под Apache Public License 2.0. Некоторые компоненты лицензируются в соответствии с GNU General Public License (GPL) 2.0 или более поздней.
Загружаем любой необходимый образ (stable) Android-x86.
Создаём виртуальный, жёсткий диск:~/QEMU $ qemu-img create -f qcow2 Android.img 8G
Устанавливаем «Android» c загруженого iso образа на созданный виртуальный, жёсткий диск:~/QEMU $ /usr/bin/qemu-system-x86_64 -enable-kvm -m 2048 -smp 4,cores=2 -usb -device usb-kbd -device usb-tablet -hda ./Android.img -boot d -cdrom ./android-x86_64-8.1-r1.iso -name «Android»
Запускаем установку.

Создаём партицию.

Не используем GPT.

Создаём новый раздел на диске.

Делаем его первичным.

Подтверждаем созданный раздел.

Делаем раздел загрузочным.

Записываем данные на раздел.

Подтверждаем запись данных на раздел напечатав yes.

Для окончания работы с диском, выбираем Quit и выходим из создания раздела.

Выбираем только что созданный раздел для установки Android.

Выбираем тип файловой системы Ext4.

Подтверждаем выбор файловой системы Ext4, стрелкой на клавиатуре переместившись в Yes.

Выбираем загрузчик Grub, стрелкой на клавиатуре переместившись в Yes.

Соглашаемся с созданием /system директории.

Перезагружаемся Reboot. Выключаем виртуальную машину.
Убираем ISO образ из стартового скрипта, это удалит установщика Android из загрузочного BIOS.
Запускаем Android:~/QEMU $ /usr/bin/qemu-system-x86_64 -enable-kvm -m 4096 -soundhw hda -smp 4,cores=2 -usb -device usb-kbd -device usb-tablet -boot d -hda ./Android.img -name «Android»
Выбираем язык и нажимаем «Начать».

Переходим к настройкам приложений Android.

Подобным образом Android можно установить на жёсткий диск или флешку.
Для этого загружаем iso образ на загрузочную флешку:root # dd if=./android-x86_64-8.1-r1.iso of=/dev/sdX
При разбивке диска выделяем раздел 8G под установку Android.
Устанавливаем с этой флешки.
Запускаем Installation — Install Android-x86 to harddisk, появится окошко Choose Partition с разделами диска и флешками.
В случае, если разделы диска или флешки не отобразились, выбираем Detect devices и нажимаем OK.
Выбираем раздел диска, или флешку, на которые хотим установить Android, жмём OK.

The -nic option

In case you don’t care about configuring every detail of a NIC, you can also create a NIC together with a host backend by using the -nic parameter. For example, you can replace

-netdev user,id=n1 -device virtio-net-pci,netdev=n1

with:

-nic user,model=virtio-net-pci

Use -nic model=help to get a list of the supported NIC models.

If you don’t care about the NIC model, you can also omit that option. So the shortest way to get a tap device is for example simply:

-nic tap

The NIC option should also be use to configure NICs on embedded systems (which can not be used via -device). For example, to connect such an on-board NIC to the tap backend and change its MAC-address, you can use the -nic option like this:

-nic tap,mac=02:ca:fe:f0:0d:01

Network Monitoring

You can monitor the network configuration using info network and info usernet commands.

You can capture network traffic from within QEMU using the filter-dump object, like this:

-netdev user,id=u1 -device e1000,netdev=u1 \
-object filter-dump,id=f1,netdev=u1,file=dump.dat

Once you’ve shut down QEMU, you can examine the dump.dat file with tools like Wireshark. Please note that network traffic dumping can only work if QEMU has a chance to see the network packets, i.e. this does not work if you use virtio-net with vhost acceleration in the kernel.

Шаг 4: Весёлая часть

Есть три способа получить ускоренный виртуальный дисплей VM с Windows на экране вашей машины.

  • VNC или какой-то другой протокол удалённого доступа (обычно это весьма плохое решение). В этом варианте вам нужно только подключить vGPU и отключить все остальные дисплеи и видеокарты. Также выставьте настройку . Вам не нужна опция , показанная позже.
  • SPICE (у меня не получилось добиться 30 FPS или выше, но работает общий буфер обмена и передача файлов между VM и хостом).
  • Встроенный интерфейс QEMU на GTK+ (общий буфер обмена и передача файлов не работают, но можно добиться 60 FPS с помощью патча).

Что бы вы ни собирались использовать, вам всё равно придётся использовать второй вариант, чтобы установить драйвера для GPU. Встроенные драйвера от Microsoft не очень хорошо работают с GVT-g на момент написания поста, и часто ломаются. До того, как вы подсоедините vGPU к ВМ, желательно скачать последнюю версию драйвера от Intel(Судя по всему, Intel меняет подход к распространению драйверов, так что в будущем этот шаг, возможно, будет другим, либо станет вообще не нужным). Теперь убедитесь, что у вас создан vGPU. Откройте и замените хороший быстрый QXL на медленный Cirrus во избежание конфликтов. Чтобы подключить vGPU к ВМ, нужно открыть и где-нибудь добавить такой фрагмент:

Замечание: Когда я предоставляю XML-фрагмент вроде этого, вам по возможности следует добавить его к текущему, не заменяя ничего.

Проверьте, что вы создали уникальные UUID для всех vGPU, которые вы используете, и что номера слотов не конфликтуют ни с какими из остальных PCI-устройств. Если номер слота находится после Cirrus GPU, виртуальная машина упадёт. Теперь вы можете запустить виртуальную машину. Нужно установить , чтобы увидеть оба дисплея! Подключиться к ВМ можно с помощью команды

Один из дисплеев будет пустой или не инициализированный, второй — уже знакомый маленький не ускоренный дисплей. Раскройте его и, войдя, установите драйвер для GPU. Если вам повезёт, всё заработает сразу же. В противном случае, надо выключить и снова запустить ВМ (не перезагрузить) с помощью работающего экрана. Теперь самое время открыть терминал и запустить внутри . Эта команда выдаст вам некоторую полезную информацию о проблемах и общем ходе работы с использованием vGPU. Например, при загрузке KVM будет жаловаться на заблокированные MSR, затем вы должны получить несколько сообщений о неправильном доступе, когда vGPU инициализируется. Если их слишком много — что-то не так.

Если система загрузилась, можно открыть настройки дисплея и отключить не ускоренный экран. Пустой экран можно скрыть через меню View в . В принципе, ВМ уже можно использовать, но есть ещё пару вещей, которые можно сделать, чтобы добиться более высокого разрешения и более высокой скорости.

Утилита CRU весьма полезна. Можете поиграться с ней, и даже если вы наткнётесь на какие-то графические артефакты или даже почти целиком чёрный экран, как получилось у меня, вы можете запустить файл , идущий в комплекте с программой, чтобы перезагрузить графическую подсистему Windows. Лично я использую эту утилиту для использования более высокого разрешения на более скромном vGPU.

Чтобы добиться прекрасных 60 FPS, нужно переключиться на встроенный монитор QEMU на GTK+ без поддержки общего буфера обмена с хостом и подобных плюшек, а также изменить в нём одну строчку и пересобрать QEMU. Также понадобится добавить пачку противных аргументов командной строки в ваш XML. Удалите дисплей SPICE и видеокарту Cirrus и установите атрибут у вашего vGPU в (libvirt не поддерживает дисплей на GTK+ и не позволит загрузиться с без дисплея).

Масштабирование для HiDPI у монитора QEMU работает из рук вон плохо, поэтому мы его отключим. Также, вам понадобится установить переменную в тот номер дисплея, который вы используете. Чтобы дать пользователю, запускающему qemu, права доступа к X серверу, используйте команду:

Если это не сработало, попробуйте , но убедитесь, что вы используете файрвол. Иначе попробуйте более безопасный метод.

Если вы потерялись где-то по пути, можете посмотреть мой текущий XML для libvirt.

Дорабатываем скрипт run_tests.sh

С самими тестами мы разобрались, осталось немного подумать над нашим скриптом по запуску тестов, который сейчас может успешно отрабатывать только при предварительном прогоне скрипта .

Давайте поразмышляем вот над чем: весь скрипт можно условно разделить на две больших секции: до копирования сборки DPDK-приложения на и после. В чём разница? Дело в том, что по отношению к стенду (системе из виртуальных машин) сборка DPDK-приложения является внешней переменной Х. Мы заранее знаем, как поведёт себя скрипт до появления этой внешней переменной, но мы не знаем насколько успешно пройдут тесты после внедрения внешнего неизвестного элемента. Вдруг сборка окажется неработоспособной и тесты свалятся?

Поэтому мы можем внести элемент кеширования в наш скрипт. Как насчёт фиксации результатов работы скрипта на момент ровно перед появлением внешней переменной, и отката к этому состоянию при повторном запуске скрипта? Ведь мы знаем, что участок скрипта до появления неопределённого элемента должен всегда выполняться одинаково. А фиксацию можно сделать очень просто: мы можем создать снепшот, например с названием , для каждой виртуальной машины после её первоначальной настройки.

Осталось лишь немного подправить скрипт чтобы он учитывал эту новую логику:

Теперь если машина уже существует, то скрипт вместо её создания будет откатывать её к снепшоту .

Для сетей же достаточно просто добавить проверку, чтобы создавать их только в том случае, если они не существуют:

Вот и всё, теперь наш скрипт мало того, что запускается каждый раз без особых проблем, так ещё и экономит нам значительное количество времени на повторных запусках за счёт кеширования процесса подготовки стенда. Ну а Вас остаётся только поздравить: ведь теперь Вы умеете создавать настоящие системные тесты с использованием виртуалок!

Configuration

Permissions

In order to run a KVM accelerated virtual machine without logging as root, add normal users to the kvm group. Replace in the example command below with the appropriate user(s):

Front ends

To make life easier, there are multiple user-friendly front ends to QEMU:

Name Package Homepage Description
AQEMU Graphical interface for QEMU and KVM emulators, using Qt5.
GNOME Boxes GNOME App to manage virtual and remote machines
libvirt C toolkit to manipulate virtual machines.
QtEmu Qt-based front-end for QEMU.
qt-virt-manager A graphical user interface for libvirt written in Qt5.
A graphical tool for administering virtual machines.

virt-manager

NoteWhen using virt-manager, be sure to enable the USE flag on the qemu package for correct operation.

After emerging, to run virt-manager as a normal user, ensure each user has been added to the libvirt group:

Uncomment the following lines from the libvirtd configuration file:

FILE

auth_unix_ro = "none"
auth_unix_rw = "none"
unix_sock_group = "libvirt"
unix_sock_ro_perms = "0777"
unix_sock_rw_perms = "0770"

Be sure to have the user log out then log in again for the new group settings to be applied.

NoteThe libvirt group might not have been created, in which case another group, such as wheel can be used.

Issue the following command to restart the libvirtd service under OpenRC:

Issue the following command to restart the libvirtd service under systemd:

virt-admin should now be launchable as a regular user.

NoteIf permission denied issues are experienced when loading ISO images user directories (somewhere beneath /home/) then the /var/lib/libvirt/images/ directory can be used to store the images.

Перемещаемся назад во времени

Чтобы пройти на один шаг вперёд, нужно выполнить команду stepi (или же просто si). Команда для шага назад называется reverse-stepi (или rsi). Работает это так. Вы даёте отладчику команду, он передаёт её эмулятору, эмулятор загружает более ранний снимок системы, а потом воспроизводит её работу до момента, предшествующего текущему шагу. Кстати, из этого следует, что за самый первый снимок зайти назад нельзя.

Если идти назад по одной инструкции, то до нужного места можно никогда не дойти. К счастью, есть команда reverse-continue (или rc). Правда, её не получится запустить и смотреть, как в песочных часах песок идёт вверх. Она предназначена для другого — искать, какая из точек останова (breakpoint, watchpoint) сработала бы последней, если бы программа выполнялась «нормально». Для этого опять используются снимки машины:

  1. Загружается предшествующий снимок

  2. Работа машины воспроизводится до текущего момента. При этом запоминаются те точки останова, которые бы могли сработать

  3. Снова загружается предшествующий снимок

  4. Если сработавших точек останова не было, эмулятор переходит к п.1 с более ранним снимком, либо останавливается, если снимки кончились

  5. Снова воспроизводится работа машины, но уже до той точки, что срабатывала последней

Вот это и есть обратная отладка. С помощью неё можно найти, например, где интересующий нас указатель стал нулевым:

  1. Ставим watchpoint на ячейку памяти, где хранится испорченный указатель

  2. Выполняем reverse continue

  3. Profit! Пристально смотрим на код, который нам этот указатель перезаписал

nanoMIPS System emulator¶

Executable also covers simulation of 32-bit
nanoMIPS system in little endian mode:

nanoMIPS I7200 CPU

Example of usage for nanoMIPS is shown below:

Download from
https://mipsdistros.mips.com/LinuxDistro/nanomips/buildroot/index.html.

Download from
https://mipsdistros.mips.com/LinuxDistro/nanomips/kernels/v4.15.18-432-gb2eb9a8b07a1-20180627102142/index.html.

Start system emulation of Malta board with nanoMIPS I7200 CPU:

qemu-system-mipsel -cpu I7200 -kernel <kernel_image_file> \
    -M malta -serial stdio -m <memory_size> -hda <disk_image_file> \
    -append "mem=256m@0x0 rw console=ttyS0 vga=cirrus vesa=0x111 root=/dev/sda"

Memory

pageHugePagesTranslation Lookaside BufferTLBTLB missQPI

Storage

persistent storage

  • Block storage (блоковое хранилище) — блок дискового пространства, который может быть использован для установки файловой системы и создания партиций. Если грубо, то можно воспринимать это как обычный диск.
  • Object storage (объектное хранилище) — информация может быть сохранена только в виде объекта (файла), доступного по HTTP/HTTPS. Типичными примерами объектного хранилища являются AWS S3 или Dropbox.

persistent storageздесьqcow2/dev/vda/dev/vdXblock storage

Виртуальная коммутация

Open vSwitch

  • Передача сетевого состояния — при миграции VM между гипервизорами возникает задача передачи ACL, QoSs, L2/L3 forwarding-таблиц и прочего. И OVS умеет это.
  • Реализация механизма передачи пакетов (datapath) как в kernel, так и в user-space
  • CUPS (Control/User-plane separation) архитектура — позволяет перенести функциональность обработки пакетов на специализированный chipset (Broadcom и Marvell chipset, например, могут такое), управляя им через control-plane OVS.
  • Поддержка методов удаленного управления трафиком — протокол OpenFlow (привет, SDN).
  • Datapath — тут обрабатываются пакеты. Аналогия — switch-fabric железного коммутатора. Datapath включает в себя приём пакетов, обработку заголовков, поиск соответствий по таблице flow, который в Datapath уже запрограммирован. Если OVS работает в kernel, то выполнен в виде модуля ядра. Если OVS работает в user-space, то это процесс в user-space Linux.
  • vswitchd и ovsdb — демоны в user-space, то что реализует непосредственно сам функциональность коммутатора, хранит конфигурацию, устанавливает flow в datapath и программирует его.
  • Набор инструментов для настройки и траблшутинга OVS — ovs-vsctl, ovs-dpctl, ovs-ofctl, ovs-appctl. Все то, что нужно, чтобы прописать в ovsdb конфигурацию портов, прописать какой flow куда должен коммутироваться, собрать статистику и прочее. Добрые люди написали статью по этому поводу.

Каким же образом сетевое устройство виртуальной машины оказывается в OVS?

  • TUN (tunnel) — устройство, работающее в L3 режиме и позволяющее записывать/считывать только IP пакеты в/из FD.
  • TAP (network tap) — то же самое, что и tun интерфейс + умеет производить операции с Ethernet-фреймами, т.е. работать в режиме L2.

ip linkifconfigovs-vsctlА если виртуальные машины находятся в разных OVS bridges?veth pair

BSD User space emulator¶

Quick Start

In order to launch a BSD process, QEMU needs the process executable
itself and all the target dynamic libraries used by it.

On Sparc64, you can just try to launch any process by using the
native libraries:

qemu-sparc64 /bin/ls

Command line options

qemu-sparc64 -h -d -L path -s size -bsd type program arguments...

Print the help

Set the library root path (default=/)

Set the stack size in bytes (default=524288)

Start with an empty environment. Without this option, the initial
environment is a copy of the caller’s environment.

Set environment var to value.

Remove var from the environment.

Set the type of the emulated BSD Operating system. Valid values are
FreeBSD, NetBSD and OpenBSD (default).

Debug options:

Activate logging of the specified items (use ‘-d help’ for a list of
log items)

Act as if the host page size was ‘pagesize’ bytes

Run the emulation in single step mode.

Using host drives¶

In addition to disk image files, QEMU can directly access host
devices. We describe here the usage for QEMU version >= 0.8.3.

Linux

On Linux, you can directly use the host device filename instead of a
disk image filename provided you have enough privileges to access
it. For example, use to access to the CDROM.

CD

You can specify a CDROM device even if no CDROM is loaded. QEMU has
specific code to detect CDROM insertion or removal. CDROM ejection by
the guest OS is supported. Currently only data CDs are supported.

Floppy

You can specify a floppy device even if no floppy is loaded. Floppy
removal is currently not detected accurately (if you change floppy
without doing floppy access while the floppy is not loaded, the guest
OS will think that the same floppy is loaded).
Use of the host’s floppy device is deprecated, and support for it will
be removed in a future release.

Hard disks

Hard disks can be used. Normally you must specify the whole disk
( instead of ) so that the guest OS can
see it as a partitioned disk. WARNING: unless you know what you do, it
is better to only make READ-ONLY accesses to the hard disk otherwise
you may corrupt your host data (use the command
line option or modify the device permissions accordingly).

Windows

CD

The preferred syntax is the drive letter (e.g. ). The
alternate syntax is supported. is
supported as an alias to the first CDROM drive.

Currently there is no specific code to handle removable media, so it
is better to use the or monitor commands to
change or eject media.

Hard disks

Hard disks can be used with the syntax:
where N is the drive number (0 is the first hard disk).

WARNING: unless you know what you do, it is better to only make
READ-ONLY accesses to the hard disk otherwise you may corrupt your
host data (use the command line so that the
modifications are written in a temporary file).

Соединяем сетью виртуалку и хост

Вот так вот мы практически незаметно научились автоматически устанавливать виртуалки и даже раскатывать на них готовую ОС. Теперь настало время поговорить о канале управления виртуалкой после её установки и настройки.

Ещё раз хотелось бы отметить, что эталоном автоматизации системных тестов должна выступать автоматизация действий человека: как он нажимает на клавиши, кликает мышкой и совершает другие действия. И ещё раз напомним, что это очень сложный (хоть и правильный) путь. Мы же воспользуемся тем фактом, что нам не требуется взаимодействовать с GUI, нам пока вполне хватит возможности выполнения произвольных bash-команд на гостевой системе.

Для этого существуют разные подходы, но мы с Вами в этой статье рассмотрим только самый простой и, в некоторой степени, топорный вариант: установка SSH-соединения между хостом и виртуалкой.

Для этого нам потребуется сделать несколько манипуляций:

  1. Создать виртуальную сеть между хостом и виртуалкой;
  2. Настроить сетевой интерфейс на виртуалке;
  3. Задать пароль от пользователя на виртуалке;
  4. Подредактировать SSH-настройке на виртуалке, чтобы можно было соединяться по SSH от имени рута с помощью пароля.

Для начала займемся созданием виртальной сети между хостом и виртуалкой. Для этого нам надо сделать две простых операции:

  1. Создать виртуальную сеть;
  2. Подключить виртуалку к этой сети (хост уже будет подключен к сети по-умолчанию).

Итак, поехали.

Для создания виртуальной сети мы воспользуемся ещё одной утилитой , которая работает поверх ещё одной замечательной библиотеки — .

В для создания различных виртуальных объектов (дисков, сетей, виртуалок) используются XML-схемы. XML-схема для создания сети выглядит примерно так:

Где — это адрес, присваиваемый сетевому интерфейсу, который будет автоматически создан на хосте и ассоциирован с новой виртуальной сетью.

Для того, чтобы создать сеть — необходимо передать путь к файлу с xml схемой сети в следующую команду:

После создания сеть создаётся в выключенном состоянии, поэтому её ещё надо включить:

Теперь надо подключить виртуалку к свежесозданной сети. Для этого при создании виртуалки необходимо добавить параметр :

Обратите также внимание на аргумент , который отключает автоматическое подключение к консоли виртуалки через VNC-клиент (впрочем, если Вам всё-равно хочется зайти посмотреть на виртуалку, Вы можете воспользоваться ). Соединение готово, но пропинговать с хоста нашу виртуалку мы всё ещё не можем: сетевой интерфейс пока не настроен

Соединение готово, но пропинговать с хоста нашу виртуалку мы всё ещё не можем: сетевой интерфейс пока не настроен.

NBD access¶

QEMU can access directly to block device exported using the Network Block Device
protocol.

qemu-system-x86_64 linux.img -hdb nbd://my_nbd_server.mydomain.org:1024/

If the NBD server is located on the same host, you can use an unix socket instead
of an inet socket:

qemu-system-x86_64 linux.img -hdb nbd+unix://?socket=/tmp/my_socket

In this case, the block device must be exported using qemu-nbd:

qemu-nbd --socket=/tmpmy_socket my_disk.qcow2

The use of qemu-nbd allows sharing of a disk between several guests:

qemu-nbd --socket=/tmpmy_socket --share=2 my_disk.qcow2

and then you can use it with two guests:

qemu-system-x86_64 linux1.img -hdb nbd+unix://?socket=/tmp/my_socket
qemu-system-x86_64 linux2.img -hdb nbd+unix://?socket=/tmp/my_socket

If the nbd-server uses named exports (supported since NBD 2.9.18, or with QEMU’s
own embedded NBD server), you must specify an export name in the URI:

qemu-system-x86_64 -cdrom nbd://localhost/debian-500-ppc-netinst
qemu-system-x86_64 -cdrom nbd://localhost/openSUSE-11.1-ppc-netinst

The URI syntax for NBD is supported since QEMU 1.3. An alternative syntax is
also available. Here are some example of the older syntax:

Installation

KQEMU Compilation (Linux only)

First ensure that you have a recent version of QEMU (> 0.9.1) with the KQEMU support enabled (this is the default).

Then decompress the KQEMU sources:

 cd /tmp
 tar zxvf kqemu-x.y.z.tar.gz
 cd kqemu-x.y.z

Then you configure KQEMU and build it (usually no options are needed):

 ./configure
 make

Then type as root user:

 make install

to install KQEMU in `/usr/local’.

QEMU Accelerator Installation for Linux

If you use x86 Linux, the compilation of the QEMU Accelerator Kernel Module (KQEMU) is automatically activated provided you have the necessary kernel headers. If nonetheless the compilation fails, you can disable its compilation with the `—disable-kqemu’ configure option.

Note that KQEMU cannot currently work if the Xen virtualizer is running on your host.

If you are using a 2.6 host kernel, then all the necessary kernel headers should be already installed. If you are using a 2.4 kernel, then you should verify that properly configured kernel sources are installed and compiled. On a Redhat 9 distribution for example, the following must be done:

  1. Install the kernel-source-xxx package
  2. cd /usr/src/linux-xxx
  3. make distclean
  4. Copy /boot/config-vvv in .config (use uname -r to know your configuration name ‘vvv’)
  5. Edit the Makefile to change the EXTRAVERSION line to match your current configuration name:
  6. make menuconfig # Just save the configuration
  7. make dep bzImage

The installation of KQEMU is not fully automatic because it is highly distribution dependent. When launching

 make install

KQEMU is installed in /lib/modules/kernel_version/misc.

If you want that KQEMU is installed automatically at boot time, you can add

 # Load the KQEMU kernel module
 /sbin/modprobe kqemu

in `/etc/rc.d/rc.local’.

By default, kqemu assumes that your distribution uses udev to have the device `/dev/kqemu’ automatically created. It is usually necessary to change the device access rights set by udev. With the Fedora Core >= 4, you can do:

 echo 'KERNEL=="kqemu", NAME="%k", MODE="0666"' \
      > /etc/udev/rules.d/60-kqemu.rules

If you don’t want to use udev, you can specify a specific major number for the `/dev/kqemu’ device:

 /sbin/modprobe kqemu major=250

The device should be created with something like:

 mknod /dev/kqemu c 250 0
 chmod 666 /dev/kqemu

Other

raw

Linux and other Unix-like hosts can mount images created with the raw format type using a loopback device. From a root login (or using sudo), mount a loopback with an offset of 32,256:

# mount -o loop,offset=32256 /path/to/image.img /mnt/mountpoint

For example, to copy some files across to a FreeDOS hard drive image:

# mkdir -p /mnt/freedos
# mount -o loopback,offset=32256 freedos-c.img /mnt/freedos
# cp oldgames /mnt/freedos
# umount /mnt/freedos

Note: if you have an image without partitions you should omit the ,offset=32256 part. This is for instance the case if you want to mount linux-0.2.img (which can be found at the QEMU web site at the time of writing).

qcow2

You will need a 2.6.26 kernel or newer, so Lenny will do. Load the ndb module:

# modprobe nbd max_part=8

If you leave off the max_part attribute, partitions are not supported and you’ll be able to access the disk, but not have device nodes for any of the partitions.

Assuming your qcow2 image filename is imagename.qcow, run:

# kvm-nbd --connect=/dev/nbd0 imagename.qcow

Now you can check the partition table with:

# fdisk -l /dev/nbd0

and mount, e.g., the first partition on /mnt with:

# mount /dev/nbd0p1 /mnt

Qemu installation

  • Go to http://www.emaculation.com/forum/viewtopic.php?f=34&t=9028 and download our latest build from the official Qemu source.
  • Create a folder for Qemu-related files and unpack the download. Put your Mac OS/OSX disk images in this folder.
  • Create an empty disk image with qemu-img.exe. Open a command prompt and navigate to your Qemu folder.
qemu-img.exe create -f raw -o size=2G MacOS9.2.img 
  • Open your favorite text editor and create a file called qemu.bat in your qemu folder. (If one is contained in the download, edit that one).
  • Paste the code below into the file:
qemu-system-ppc.exe -L pc-bios -boot d -M mac99,via=pmu -m 512 ^
-prom-env "auto-boot?=true" -prom-env "boot-args=-v" -prom-env "vga-ndrv?=true" ^
-drive file=MacOS9.2.iso,format=raw,media=cdrom ^
-drive file=MacOS9.2.img,format=raw,media=disk ^
-sdl ^
-netdev user,id=network01 -device sungem,netdev=network01 ^
-device VGA,edid=on 

Save qemu.bat

Short explanation of the content of the file:

qemu-system-ppc.exe starts qemu with all of the following as parameters:

  • -L pc-bios defines the location of bios files to be used.
  • -boot d defines to boot from a drive entry marked as a cdrom, “-boot c” would define to boot from a drive entry marked as disk.
  • -M mac99,via=pmu defines the mac model used(*).
  • -m 512 defines the amount of memory (in Mb) for OS9/OSX.
  • -prom-env “auto-boot?=true” -prom-env “boot-args=-v” define boot parameters for openbios and Mac OSX. The “-v” makes the boot process verbose
  • -prom-env “vga-ndrv?=true” loads the qemu-vga.ndrv file to provide on the fly resolution swithing. Setting this to false ignores the driver
  • -drive file=MacOS9.2.iso,format=raw,media=cdrom defines the name, location, format, and type of a cdrom (or dvd) image file to be used
  • -drive file=MacOS9.2.img,format=raw,media=disk defines the name, location, format, and type of a hard disk image file to be used
  • -sdl instructs Qemu to use SDL for the graphical display
  • -netdev user,id=network01 -device sungem,netdev=network01 tell qemu to use the sungem network device on a qemu-internal DHCP server
  • -device VGA,edid=on presents additional resolutions to choose from in the guest

(*)The mac model entry accepts 3 options for the via parameter:

mac99,via=pmu (with PMU, supporting usb mouse and keyboard)

mac99,via=pmu-adb (this allows some older Mac OS/Mac OS server builds to use a keyboard and mouse through the adb bus)

mac99,via=cuda (default, this allows use of the older adb (Apple Desktop Bus), now less supported cuda)

Double-click qemu.bat. This starts Qemu and boots the MacOS9.2.iso installation CD image.

Оцените статью
Рейтинг автора
5
Материал подготовил
Андрей Измаилов
Наш эксперт
Написано статей
116
Добавить комментарий