Перейти к содержимому

Qemu windows 10 как пользоваться

  • автор:

QEMU/KVM и установка Windows

Хотим мы того или нет, но программы, для которых необходима Windows, никуда из офисов не исчезли. В ситуации, когда их использование безальтернативно, лучше иметь виртуальную ОС, например для того, чтобы подключиться к аудио-конференции через Skype for Business.

В этой статье я расскажу, как можно с минимальными издержками установить гостевую ОС Windows на гипервизоре QEMU с помощью графического интерфейса virt-manager . Мы нанесем на карту все подводные камни и рифы, а жучков аккуратно посадим в банку.

Подготовка

Самый первый шаг — настройка параметров ядра. Обязательна поддержка KVM и vhost-net , желательна поддержка туннельных интерфейсов [1] и сетевого моста [2] . Полный список на Gentoo вики-странице QEMU.

Подготовьте дисковое пространство. Я выделил 70 GiB, и Windows 8.1 за пару месяцев использовала почти 50 GiB так, что для обновления до 10-й версии места на диске не хватило.

Далее, нам понадобится набор редхатовских драйверов virtio-win . Если у вас установлен RedHat, достаточно запустить

[root@server ~]# yum install virtio-win

и образ iso будет записан в каталог /usr/share/virtio-win/ . Также можно его скачать с репозитариев Fedora.
Убедитесь, что поддержка аппаратной виртуализация включена в BIOS/UEFI. Без этого KVM не будет активирован, а virt-manager выдаст вот такую ошибку.

В качестве проверки можно прочитать файл устройства.

(2:506)$ ll /dev/kvm crw-rw----+ 1 root kvm 10, 232 ноя 9 02:29 /dev/kvm

Если файл не обнаружен, а опции ядра выставлены верно, значит дело в настройках BIOS/UEFI .
Устанавливаем нужные пакеты.

(5:519)$ sudo emerge -av qemu virt-manager

Для RedHat 7 достаточно установить только virt-manager , так как QEMU устанавливается по умолчанию.

[root@server ~]# yum install virt-manager

Дебианщикам надо установить пакет qemu .

root# aptitute install qemu

Можно теперь переходить к установке.

Запуск и инсталляция

Запускаем virt-manager и создаем новую виртуальную машину из локального хранилища.

Указываем путь к установочному iso образу Windows.

Далее, на 3-м и 4-м шаге будет выбор количества CPU, объем RAM и размер дискового пространства, после чего на 5-м шаге следует выбрать дополнительные конфигурации перед настройкой.

Окно дополнительных настроек нужно для того, чтобы выполнить финт ушами. Его смысл в том, чтобы добавить виртуальный флопарь с драйверами из набора virtio-win . Это даст возможность изменить тип жесткого диска: удалить диск с шиной IDE и добавить его же, но с шиной VirtIO. Подробно, в доках RedHat.

Прописываем драйвер /usr/share/virtio-win/virtio-win.vfd и добавляем виртуальный флоппи-диск. Затем переходим на вкладку [Шина] Диск № и проделываем финт с заменой шины диска: удаляем с IDE и добавляем с VirtIO.

Чуть не забыл сказать, для чего нужен этот фокус. Специалисты утверждают, что с шиной VirtIO, производительность диска ощутимо выше.

В принципе, уже можно начинать инсталляцию, но мы забыли добавить CD-ROM с драйверами virtio-win , а они нам пригодятся, когда диспетчер устройств засверкает желтыми иконками вопросительного знака.

Ну вот теперь можно начать установку.

Ну хорошо, начали мы установку. А что, если установщик Windows попросит сменить диск? Мне из-за этого пришлось пару раз прервать и начать всю карусель заново, но с вами такого уже не случится.

(qemu) change ide1-cd0 /tmp/windows_8.1_x64_disk2.iso

Драйвера и доводка

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

Ethernet Controller PCI Simple Communication Controller SCSI Controller

Нужно скормить им драйвера из набора virtio-win , что подключены через IDE CD-ROM в предыдущем разделе.

Делается это стандартно: правой кнопкой на желтый знак вопроса, обновить драйвера, путь к файлам.

Вот весь список, а это соседняя страница RedHat доков, где установка драйверов показана подробнее.

  • Balloon, the balloon driver, affects the PCI standard RAM Controller in the System devices group.
  • vioserial, the serial driver, affects the PCI Simple Communication Controller in the System devices group.
  • NetKVM, the network driver, affects the Network adapters group. This driver is only available if a virtio NIC is configured. Configurable parameters for this driver are documented in Appendix E, NetKVM Driver Parameters.
  • viostor, the block driver, affects the Disk drives group. This driver is only available if a virtio disk is configured.

Оборудование

Тут постепенно начинается область безграничных возможностей и 101 способов сделать по-своему, поэтому я покажу, как это работает у меня, а вы можете настроить более точно под свои нужды.

У меня выбран дисплей Сервер Spice и звуковое устройство ich6 . Нет, конечно, если у вас уйма времени и желание во всем разобраться до самых тонкостей — дерзайте и пробуйте альтернативные подходы, но у меня звук взлетел, вернее завибрировал, только с такими настройками. Во второй части, посвященной прогулке по граблям и отлову багов, я расскажу об этом подробнее. В закладке видео я выставил QXL , ибо с этой опцией, благодаря волшебному драйверу, мне удалось добиться нормального разрешения экрана.

Подключаться к ВМ можно разнообразно.

  1. Через графический интерфейс virt-manager
  2. Выбрать дисплей VNC-сервер и подключаться через vnc-клиента
  3. Установить Spice-клиента и подключаться через него
  4. К Windows можно подключиться через rdp, если включен терминальный сервер

У меня вариант 3, для Gentoo это программа spice-gtk

$ eix spice-gtk [I] net-misc/spice-gtk Доступные версии: 0.31 ~0.32-r1 ~0.32-r2 **9999 Установленные версии: 0.31(16:05:41 18.06.2016)(gtk3 introspection pulseaudio python usbredir -dbus -gstreamer -libressl -lz4 -policykit -sasl -smartcard -static-libs -vala -webdav PYTHON_SINGLE_TARGET="python2_7 -python3_4" PYTHON_TARGETS="python2_7 python3_4") Домашняя страница: http://spice-space.org https://cgit.freedesktop.org/spice/spice-gtk/ Описание: Set of GObject and Gtk objects for connecting to Spice servers and a client GUI

Сеть

Сеть для ВМ можно настроить по-разному, на Хабре умельцы уже об этом писали. Я перепробовал несколько способов, и в конце простота опять взяла вверх. Сама ВМ запускается из под рута [3] , но графический интерфейс spice-gtk — из под обычного непривилегированного пользователя. Это позволяет решить дилемму: для сетевых опций нужны права рута, а для звукового демона pulseaudio, рут запрещен. Я пробовал навешать все права на обычного пользователя, но ничего не получалось, то pulse не пульсирует, то сеть не создается, там много а тут мало. В итоге решил так и доволен. Буду рад, если в комментариях будет найден лучший способ.

Такой простой выбор сетевых опций дает результат превосходящий ожидания. Создаются 3 дополнительных сетевых интерфейса: virbr0, virbr0-nic, vnet0.

$ ip addr . 4: virbr0: mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 52:54:00:cc:2a:1e brd ff:ff:ff:ff:ff:ff inet 192.168.102.1/24 brd 192.168.102.255 scope global virbr0 valid_lft forever preferred_lft forever 5: virbr0-nic: mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000 link/ether 52:54:00:cc:2a:1e brd ff:ff:ff:ff:ff:ff 11: vnet0: mtu 1500 qdisc pfifo_fast master virbr0 state UNKNOWN group default qlen 1000 link/ether fe:54:00:fb:50:45 brd ff:ff:ff:ff:ff:ff inet6 fe80::fc54:ff:fefb:5045/64 scope link valid_lft forever preferred_lft forever

В iptables создается свод правил, вот основные:

$ sudo iptables -L . Chain FORWARD (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere 192.168.102.0/24 ctstate RELATED,ESTABLISHED ACCEPT all -- 192.168.102.0/24 anywhere 
C:\Users\user>ipconfig Windows IP Configuration Ethernet adapter Ethernet 2: Connection-specific DNS Suffix . : Link-local IPv6 Address . . . . . : fe80::90c3:a458:6645:7b9a%7 IPv4 Address. . . . . . . . . . . : 192.168.102.203 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : 192.168.102.1 Tunnel adapter isatap.: Media State . . . . . . . . . . . : Media disconnected Connection-specific DNS Suffix . : Tunnel adapter IPHTTPSInterface: Connection-specific DNS Suffix . : IPv6 Address. . . . . . . . . . . : 2620:0:a13:8a7:51af:79ae:92b8:828a Temporary IPv6 Address. . . . . . : 2620:0:a13:8a7:b49d:81fe:e509:16e7 Link-local IPv6 Address . . . . . : fe80::51af:79ae:92b8:828a%15 Default Gateway . . . . . . . . . :

Повторяю, все это libvirtd создает сам, ничего для этого делать не надо. В результате имеем нормальный роутинг между хостом и ВМ, можно обмениваться файлами по ssh / scp . Можно пойти дальше и создать шару на Windows, а на Linux хосте настроить samba, но мне это показалось избыточным.

В завершение

Трудно рассказать в одной статье обо всех аспектах Windows + QEMU/KVM, поэтому завершим в следующей. А там будет самый смак, командный интерфейс, разрешение экрана максимум 1024×768, Сцилла pulseaudio и Харибда сети, команда virsh и настройка ВМ из конфиг файла, фейл с tpm , двоичный синтаксис устройств и прочие тихие радости.

  • Настройка Linux
  • Системное администрирование
  • *nix
  • Виртуализация
  • Серверное администрирование

Как незаметно запускать виртуальный Linux на QEMU

В некоторых задачах Linux просто необходим. И самым ярким тому примером на сегодня является наличие системы WSL. Однако не везде ею можно пользоваться. Некоторые предприятия принципиально застревают на Win7. И их можно понять. Эта система не столь требовательна к железу (особенно к видео-подсистеме), не ломится чуть-что в интернет, да и в Ultimate варианте вообще не требует подключения к глобальной сети.

В большей части случаев можно обойтись родными для системы средствами разработки и сторонними инструментами. Но представьте себе, что для работы Вашего комплекса нужно собрать вместе более десятка не маленьких opensource проектов с перекрёстными зависимостями. Причём часть из них написана под python (и тут никаких проблем нет — виртуальная среда и всё ок), а часть собирается в бинарные исполняшки, от которых зависят другие модули. И тут может быть как минимум три решения:

  • собрать всё с помощью mingw-тулчейна;
  • воспользоваться msys2 или cygwin;
  • собрать всё быстро и удобно на виртуальной машине с Linux.

Однако у всех перечисленных способов есть свои недостатки:

  • Для mingw-тулчейна вам потребуется руками собирать неимоверное количество библиотек-зависимостей.
  • Среды msys2 или cygwin хороши тем, что в их репозиториях уже есть почти всё, что может пригодиться (а в вашем случае может быть и вообще всё). Но вот беда: заказчик хочет, чтобы система была монолитной и не требовала установки дополнительного ПО, а обе среды в базовой реализации не совсем портабельны. Что-то может перестать работать после переноса на новое место и в новую систему. Есть их портабелизации на portableapps.com, но тут тоже могут ожидать подводные камни: в обоих случаях при исследовании были пакеты, которые ставились как-то не так. Например binutils в portable msys2 не устанавливал исполняемые файлы. О какой сборке чего бы то ни было в таком случае может идти речь?
  • Виртуальная машине с Linux с точки зрения сборки комплекса безусловно является оптимальным решением (если конечно не требуется CUDA). Но тут возникает уже человеческий фактор. При словах «Linux» и «виртуальная машина» у довольно большого количества людей возникает примерно одинаковая реакция: «Не, не, не! Люди не умеют этим пользоваться. Учить долго и/или дорого. Делай так, чтобы было только на Винде».

Конкретно в моей задаче проблема была именно в том, что там уж слишком много всего накручено. Собрать это под Windows скорее всего можно, но вот время, которое на это придётся затратить меня не устраивало. Значит нужно прятать факт использования виртуальной машины. Благо пользователи Windows по большей части не сталкиваются с QEMU, и считают, что для работы с виртуальной машиной обязательно нужно устанавливать в систему VMWare или VirtualBox, а потом с их интерфейса запускать окошко с виртуалкой.

Я не буду здесь писать о чём-то новом. На просторах Хабра всё, что будет описано ниже уже не раз встречалось. Но вот применительно к конкретной задаче маскировки работы виртуальной машины под работу обычной консольной программы Windows, текст будет интересен.

Я буду описывать весь процесс на примере Manjaro. Во первых, я её очень Люблю. Во вторых это Arch-дистрибутив с установленным из коробки pamac и AUR. Конечно при использовании чистого Arch Linux итоговый образ получился бы меньше, но не на много.

Идея заключается в том, что создаваемый комплекс должен вести некоторую обработку файлов и выдавать файловый же результат. То есть он должен вести себя, как консольная программа. Для Windows-пользователей также будет не лишним добавить диалог открытия файлов (а, если нужно, и ввода параметров), чтобы им не пришлось параметры в командную строку вбивать.

На хосте должны быть установлены пакеты из группы qemu-full. Образ установщика гостевой системы находится на https://manjaro.org/download/. В принципе можно брать любой. Потом всё равно нужно будет удалять лишние пакеты. Но вот беда: некоторые пакеты (например tesseract) ставят себе в зависимость пакеты окружения рабочего стола. Так что лучше сразу поставить что-то полегче (xfce, например), чтобы потом не жалко было его оставлять.

Создаём диск виртуальной машины:

qemu-img create -f qcow2 image.qcow2 32G

И запускаем её установку:

qemu-system-x86_64 \ -enable-kvm \ -cpu host \ -hda image.qcow2 \ -drive file=manjaro-xfce-21.0-210318-linux510.iso,media=cdrom \ -boot d \ -smp 4 \ -m 4G \ -display gtk \ -vga std \ -device virtio-net,netdev=vmnic -netdev user,id=vmnic

Советую собирать на единственном разделе. Либо вообще без свопа, либо со своп-файлом. Это нужно для того, чтобы образ в итоге занял меньше места и не имел тенденции к чрезмерному росту.

Из дополнительных пакетов нам понадобится samba для получения доступа к папке Windows-хоста.

Также далее будем считать, что пользователя гостевой системы зовут user, а его пароль pass.

После установки команда запуска поменяется на:

qemu-system-x86_64 \ -enable-kvm \ -cpu host \ -hda image.qcow2 \ -smp 4 \ -m 4G \ -display gtk \ -vga std \ -device virtio-net,netdev=vmnic -netdev user,id=vmnic

Мы изъяли установочный диск:

 -drive file=manjaro-xfce-21.0-210318-linux510.iso,media=cdrom \ -boot d \

Теперь можно устанавливать и настраивать свой программный комплекс в приятной Linux-среде. Раз уж мы работаем в Manjaro, откроем сразу GUI pamac’а и в настройках разрешим использование AUR-репозитория, также изменив сборочную директорию на ~/AUR. Теперь собирать стало ещё проще. Найти что-то, чего нет в AUR — это не так-то просто.

Пришло время маскироваться под Windows-приложение. Для этого нам потребуется portable python. Забираем любой понравившийся с https://github.com/oskaritimperi/portablepython/releases. Я буду писать на примере python3. Естественно нужен QEMU с https://qemu.weilnetz.de/w64/.

Создаём папки SystemName/workdir/qemu. В workdir распаковываем содержимое папки python’а из архива и перемещаем образ image.qcow2. A в qemu копируем содержимое установленного QEMU (установить его можно и wine’ом).

Для теста системы на поддержку виртуализации нам потребуется cpuinfo в portable python’е на Windows, а для передачи параметров (да и мало ли ещё чего) через подключаемый iso-образ pycdlib:

# Опять-таки можно и через wine запустить. python.exe -m pip install py-cpuinfo pycdlib

В папке SystemName создаём run.bat с простеньким содержимым:

cd workdir python.exe run.py cd ..

А в workdir создаём скрипт run.py, который и будет заниматься получением параметров запуска, запуском виртуальной машины и выводом лога работы программы на консоль:

import cpuinfo import os import sys import subprocess import time import getpass from io import BytesIO import pycdlib from tkinter import * from tkinter import filedialog user = getpass.getuser() qemu_bin = 'qemu/qemu-system-x86_64.exe' password = getpass.win_getpass(f', введите свой пароль: ') # Проверяем на включенность виртуализации и предупреждаем пользователя, если что. if len(set(cpuinfo.get_cpu_info()['flags']).intersection()) > 0: cpu = '-cpu host' else: cpu = '-cpu qemu64' print('Если включить в BIOS поддержку Intel VT-x, программа будет работать быстрее.') # Открываем диалог выбора папки и просим пользователя показать, где лежат данные. # При необходимости сюда и окно с параметрами можно записать. # Но спрашивать нужно именно папку, чтобы записать туда конфигурацию для программы # на виртуальной машине. base_root = Tk() base_dialog = filedialog.Directory(base_root) base_root.withdraw() base = base_dialog.show().strip().replace('\\', '/') # Приводим слеши в порядок. if base[-1] != '/': base += '/' # Пишем диск с конфигурацией (здесь только пользователь и пароль к разделяемой папке). iso = pycdlib.PyCdlib() iso.new() conf = bytes(f'\n\n', 'utf-8') iso.add_fp(BytesIO(conf), len(conf), '/CONFIG.;1') iso.write_fp(BytesIO(conf)) iso.write('config.iso') iso.close() # Команда запуска виртуальной машины. # Обратите внимание на параметр -display none. # Это позволяет не показывать экран виртуальной машины. run_qemu = f'  -hda ./image.qcow2 -smp \ -m 4G -display none -vga std -device virtio-net,netdev=vmnic \ -netdev user,id=vmnic -drive file=config.iso,media=cdrom'.replace('/', '\\') open(f'system.log', 'w') # Очищаем лог. # Команда запуска черезчур сложна для subprocess.Popen, поэтому нужен скрипт. open(f'./qemu.bat', 'w').write(run_qemu) # На Windows-хосте нужно расшарить папку и только потом запускать виртуальную машину. base_win = base.replace('/', '\\')[: -1] os.system(f'net share vmshare= /GRANT:",FULL"') qemu = subprocess.Popen(['qemu.bat']) # Начинаем читать лог. print('Загрузка. ') lines_printed = 0 while qemu.poll() is None: # Пока виртуальная машина запущена. log = open(f'system.log', 'rb').read() if b'\n' in log: if log[-1] != b'\n': log = log[: log.rfind(b'\n')] log = log.split(b'\n') if len(log[-1]) == 0: log = log[: -1] log = log[lines_printed:] if len(log) > 0: lines_printed += len(log) for line in log: try: # На случай битого вывода. print(line.decode('utf-8')) except: pass else: time.sleep(1) # Отключаем папку. os.system('net share /delete vmshare') print('Завершено')

Ключевыми особенностями нового скрипта запуска QEMU (в переменной run_qemu) являются два параметра:

# Не показывать пользователю экран виртуальной машины. -display none # Подключить сгенерированный CD с параметрами. -drive file=config.iso,media=cdrom

Стоит отметить, что на подключаемый CD можно складывать всё, что угодно. Например, так удобно обновлять ПО внутри системы прямо на лету.

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

#!/bin/bash # Пример скрипта запуска комплекса run.sh # Весь полезный вывод перенаправляется в /mnt/system.log. # Файл конфигурации все могут прочитать в config на подключаемом CD. # Пусть в этой папке лежат все исполняемые файлы комплекса. cd /home/user/SystemName # Чтение параметров. echo "pass" | sudo -S umount /dev/sr0 mkdir /home/user/SystemName/config echo "pass" | sudo -S mount /dev/sr0 /home/user/SystemName/config user=`sed -n "1p" < /home/user/SystemName/config` pass=`sed -n "2p" < /home/user/SystemName/config` echo "pass" | sudo -S umount /dev/sr0 # Монтирование рабочей директории. echo "pass" | sudo -S mount -t cifs -o username=$user,password=$pass,workgroup=workgroup,iocharset=utf8,uid=user //10.0.2.2/vmshare /mnt ./it_works_all_the_time.py >> /mnt/system.log & all_time_worker=$! # Здесь все данные, с которыми комплекс должен работать. base="/mnt/" # То, что нельзя распараллелить. ./1_line.py >> /mnt/system.log ./2_line.py >> /mnt/system.log ./3_line.py >> /mnt/system.log # То, что может быть выполнено параллельно. ./4_parallel.py >> /mnt/system.log & pid_41=$! -S ./4_parallel.py >> /mnt/system.log & pid_42=$! ./4_parallel.py >> /mnt/system.log & pid_43=$! # Ожидание распараллеленных процессов. wait $pid_41 wait $pid_42 wait $pid_34 echo "pass" | sudo -S ./5_end.py >> /mnt/system.log # Завершение. kill $all_time_worker echo "pass" | sudo -S umount /mnt echo "pass" | sudo -S poweroff

Всё! Виртуальная машина запускается, делает, что ей положено и выключается, передавая все строки вывода в файл, который читается скриптом на хосте.

После сборки всего необходимого мой образ весил 22 ГБ — неприлично много, но там точно около 13 ГБ «полезной» нагрузки. Нужно уменьшать. Опять открываем pamac на гостевой системе и в меню переходим в «Режим приложений». Удаляем всё ненужное. Теперь возвращаемся в обычный режим, в закладку «Установлены» и группу «Неиспользуемые». Итеративно удаляем всё, пока список не опустеет. И выключаем систему.

Теперь нужно по возможности уменьшить размер образа, удалив лишние файлы, дефрагментировав и обрезав его:

### В гостевой системе. # Удаляем кэш пакетов. Устанавливать нам больше нечего. pacman -Sc # Дважды соглашаемся. rm -f /var/cache/pacman/pkg/* rm -rf ~/AUR ### На хосте. # Подключаем модуль ядра. modprobe nbd max_part=8 # Монтируем файловую систему. qemu-nbd --connect=/dev/nbd0 image.qcow2 mkdir /mnt/qcow2 mount /dev/nbd0p1 /mnt/qcow2 # Дефрагментируем. Всё свободное место скапливается # в конце диска. e4defrag /dev/nbd0p1 /mnt/qcow2 # Заполняем свободное место нулями. # Будьте внимательны. В процессе диск раздуется до # предельного размера. dd if=/dev/zero of=/mnt/qcow2/tempfile rm -f /mnt/qcow2/tempfile # Отключаем файловую систему. umount /mnt/qcow2 qemu-nbd --disconnect /dev/nbd0 rmmod nbd # Пересобираем диск, чтобы он занимал минимум места. mv image.qcow2 image.qcow2.old qemu-img convert -O qcow2 image.qcow2.old image.qcow2 rm -f image.qcow2.old

Вот теперь 13 ГБ. Точно, как и ожидалось.

Пара слов о том, как понять, какой объём системы является «полезным»:

import pacman import locale from ipywidgets import IntProgress from IPython.display import display from datetime import datetime locale.setlocale(locale.LC_TIME, 'ru_RU.UTF-8') print('Получение списка установленных пакетов.') installed = pacman.get_installed() installed = print('Получение информации о пакетах.') progress = IntProgress(min=0, max=len(installed)) display(progress) specially_installed = [] all_installed = [] for pkg in installed: info = pacman.get_info(pkg) if info['Причина установки'] != 'Установлен как зависимость другого пакета': specially_installed.append(info) all_installed.append(info) progress.value = progress.value + 1 installed_dict = print('Получение пакетов, зависящих от пакета.') progress = IntProgress(min=0, max=len(installed)) display(progress) dependensies = dict() for pkg in installed: dependensies[pkg] = set() try: for depend in pacman.depends_for(pkg): if depend != pkg and depend in installed: dependensies[pkg].add(depend) except: dependensies.pop(pkg) progress.value = progress.value + 1 # Ищем нужные пакеты и их зависимости. needed_words = < 'В', 'этом', 'списке', 'должны', 'быть', 'солва', ',', 'являющиеся', 'базовыми', 'формами', 'имён', 'пакетов', ',', 'необходимых', 'Вашему', 'комплексу', '.', 'То', 'есть', ',', 'если', 'пакет', 'называется', 'python-pip', ',', 'то', 'в', 'списке', 'должен', 'быть', 'просто', 'pip', '.'>needed = set() for name in needed_words: for pkg in installed: if name in pkg: needed.add(pkg) new_needed = set() for pkg in list(needed): if pkg in dependensies: for dep in dependensies: if dep not in needed: needed.add(dep) new_needed.add(dep) print(f'Добавлено пакетов. Всего пакетов.') # Вычисляем "полезный" объём. sizes = size_needed = 0 size_not_needed = 0 for pkg in installed: size = float(installed_dict[pkg]['Установленный размер'].split()[0].replace(',', '.')) * sizes[installed_dict[pkg]['Установленный размер'].split()[1][0]] if pkg in needed: size_needed += size else: size_not_needed += size print(f'Размер необходимых пакетов MB') print(f'Размер пакетов для удаления MB') print('Завершено.')

В итоге, получен универсальный способ сборки громоздких opensource комплексов с кучей зависимостей под Windows. По производительности, конечно, не ах. Всё-таки виртуализация (а-то и без VT-x может запуститься). Но при ограничениях, описанных в начале статьи, лучшего добиться можно, но неимоверно сложно. Напомню, что это должно было выглядеть, как программа, собранная исключительно под Windows.

Всем, дочитавшим до этого места, спасибо! Буду рад комментариям.

  • Python
  • Виртуализация
  • Разработка под Linux
  • Разработка под Windows

Как пользоваться qemu

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

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

Table of Contents

  • Что такое qemu?
  • Установка qemu
  • Как пользоваться qemu?
    • 1. Использование qemu-system
    • 2. Использование эмуляции окружения

    Что такое qemu?

    Qemu — это бесплатный инструмент с открытым исходным кодом для эмуляции и виртуализации работы операционных систем на компьютере. Программа может работать в Windows, Linux, MacOS и даже на Android. Ресурсы хоста, такие как процессор, жесткий диск, память, разделяются между виртуальными машинами.

    Qemu использует аппаратную виртуализацию, поэтому может выполнять гостевые операционные системы почти так же быстро, как и на основном железе. Может использоваться гипервизор XEN или модуль ядра KVM в Linux. Qemu может работать в двух режимах работы:

    • Полная эмуляция системы — в этом режиме qemu полностью эмулирует устройство, например, компьютер, включая все его компоненты, процессор и различные периферийные устройства. Он может использоваться для запуска нескольких операционных систем без перезагрузки или отладки системного кода.
    • Эмуляция пользовательского режима — работает только для Linux хоста, позволяет запускать процессы Linux, скомпилированные для одной архитектуры в другой, например, ARM программы в x86. Полезно для разработки, кросс-компиляции и отладки.

    Эмулировать можно такие архитектуры: x86 (32 и 64 бит), PowerPC (32 и 64 бит), ARM, MIPS (32 бит), Sprac (32 и 64 бит), Alpha, ColdFire(m68k), CRISv2 и MicroBlaze. Этот список уже более внушительный чем у Virtualbox.

    Установка qemu

    Перед тем как мы сможем использовать программу, необходимо ее установить. Если вы используете дистрибутив Linux, например, Ubuntu, то сможете найти программу в официальных репозиториях. Для Ubuntu команда будет выглядеть вот так:

    sudo apt install qemu-kvm qemu

    Для Fedora и других систем RedHat можно установить группу Virtualization:

    sudo dnf install @virtualization

    В ArchLinux используйте Pacman:

    Для Windows или MacOS вам нужно скачать исполняемый файл из официального сайта. Программа управляется только через терминал, так что вы главном меню системы ничего не появиться после установки. А теперь перейдем к тому как настроить qemu.

    Как пользоваться qemu?

    Теперь, когда программа установлена и готова к использованию попытаемся разобраться как ее запустить и применять. Но сначала нужно разобраться какие команды и для чего используются. Эмулятор qemu создает много команд, но их можно разделить на группы:

    • qemu-архитектура — эмуляция окружения пользователя для указанной архитектуры;
    • qemu-system-архитектура — эмуляция полной системы для архитектуры;
    • qemu-img — утилита для работы с дисками;
    • qemu-io — утилита для работы с вводом/выводом на диск;
    • qemu-user — оболочка для qemu-архитектура, позволяет запускать программы других архитектур в этой системе;
    • qemu-system — оболочка для qemu-system-архитектура, позволяет полностью эмулировать систему нужной архитектуры.

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

    1. Использование qemu-system

    Чтобы вы понимали что и откуда берется для начала рассмотрим опции утилиты qemu-system. Синтаксис команды такой:

    $ qemu-system параметры

    Куда сложнее здесь синтаксис каждого из параметров:

    -имя_параметра имя_опции = значение : значение2

    Мы рассмотрим только основные параметры, и их опции, которые нам понадобятся:

    • -machine указывает тип компьютера, который вы собрались эмулировать, можно выбрать ubuntu, pc, pc-q35 и другие варианты, смотрите подробнее командой -machine help;
    • -cpu — тип процессора, можно передать непосредственно тип процессора, а также дополнительные флаги;
    • -smp — включает симуляцию мультипроцессорной архитектуры;
    • -boot — позволяет настроить порядок загрузки устройств, a,b — дискета, с — первый жесткий диск, d — CDROM, n-p — загрузка через сеть, по умолчанию виртуальная машина загружается из жесткого диска;
    • -m — указывает количество оперативной памяти, доступной машине;
    • -k — раскладка клавиатуры по умолчанию;
    • -soundhw — подключить звуковую карту к системе;
    • -device — подключить указанное устройство к машине, нужно указать драйвер и его опции;
    • -name — имя гостевой системы, будет отображаться в верху окна;
    • -uuid — установить UUID для системы;
    • -fda, fdb — подключить дискету из файла;
    • -hda, hdb — подключить жесткий диск из файла;
    • -cdrom — подключить оптический диск;
    • -usb — включить поддержку USB;
    • -usbdevice — подключить USB устройство;
    • -display — выбрать тип отображения, доступно sdl, curses, gtk, none, vga и другие;
    • -full-screen — запустить в полный экран;
    • -no-acpi — отключить поддержку ACPI;
    • -net — создать сетевой интерфейс;
    • -realtime включить режим реального времени, опции mclock нужно передать значение on;
    • -gdb — ожидать подключения отладчика gdb;
    • -enable-kvm — включить поддержку kvm;
    • -loadvm — загрузить сохраненное состояние;
    • -daemonize — сделать процесс фоновым;
    • -snapshot — записывать изменения не в файл жесткого диска, а в отдельные файлы;
    • -nographic — отключить графический вывод.
    • -kernel — использовать указанный образ ядра linux.
    • -append — командная строка для ядра;
    • -initrd — файл initrd для загрузки Linux.

    Мы рассмотрели опции для qemu-system-x86-64, для других архитектур, они могут немного отличаться. А теперь разберем несколько простых примеров как использовать qemu, как создать машину qemu и настроить ее.

    Сначала нужно создать жесткий диск для установки. Вы можете использовать реальные жесткие диски, но работать с образами намного удобнее. Можно просто создать пустой файл, заполненный нулями, а затем форматировать его в нужную файловую систему во время установки, но также можно создать файл формата qcow2, этот формат используется по умолчанию в qemu. Воспользуемся командой qemu-img:

    qemu-img create -f qcow2 ubuntu.qcow 10G

    Опция -f указывает формат нового файла. Теперь мы можем непосредственно перейти к запуску qemu-system. Вот так будет выглядеть самая простая команда запуска системы:

    qemu-system-x86_64 -hda ubuntu.qcow -boot d -cdrom ~/downloads/ubuntu-17.04-server-amd64.iso -m 640

    Здесь мы подключаем наш жесткий диск как hda, затем указываем что нужно загружаться с cdrom и подключаем образ системы ubuntu к нему. Последний параметр указывает сколько оперативной памяти будет выделено для машины.

    Дальше откроется окно, похожее на VritualBox и начнется установка системы. После того как установка будет завершена, вы сможете запускать машину командой:

    qemu-system-x86_64 -hda ubuntu.img -m 640

    Создавать виртуальную машину с другой архитектурой не очень сложно, достаточно изменить команду. Например, сделаем виртуальную машину ppc:

    qemu-system-ppc -hda ubuntu.qcow -boot d -cdrom ~/downloads/ubuntu-17.04-server-amd64.iso -m 640

    Поскольку сейчас мы не используем kvm, то система будет работать очень медленно все можно очень сильно ускорить, если его включить с помощью опции -enable-kvm:

    qemu-system-x86_64 -hda ubuntu.qcow -m 640 -enable-kvm

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

    qemu-system-x86_64 -hda ubuntu.qcow -m 640 -enable-kvm -soundhw ac97

    Не всегда мы запускаем машину только в качестве сервера, иногда нужно запустить обычную десктопуную систему, в таком случае нам придется настроить виртуальную видеокарту, потому что того, что идет по умолчанию хватит только на консоль. Для этого используется опция -vga:

    qemu-system-x86_64 -hda ubuntu.qcow -m 640 -enable-kvm -soundhw ac97 -vga qxl

    С помощью опции -global qxl-vga.vram_size можно задать объем видеопамяти, доступный машине, значение указывается в байтах, например:

    qemu-system-x86_64 -hda ubuntu.qcow -m 640 -enable-kvm -soundhw ac97 -vga qxl -global qxl-vga.vram_size=4294967

    Для многих машин важно чтобы из них был доступ в сеть интернет. Настройка сети qemu — это достаточно обширная тема, которую мы не будем полностью раскрывать в этой статье. Если кратко, то, в qemu используется специальный виртуальный шлюз vlan, который позволяет соединять машины с внешней сетью или между собой. Каждый vlan имеет свой номер. Самый простой способ настроить сеть — использовать такие параметры:

    qemu-system-x86_64 -hda ubuntu.qcow -m 640 -enable-kvm -net nic,vlan=0 -net user,vlan=0

    Здесь мы два раза вызываем опцию -net, в первый раз создаем виртуальную сетевую карту с помощью параметра -nic и подключаем ее к vlan с номером 0. Вторая же опция -net создает наш vlan 0 с типом конфигурации user, которая не требует дополнительной настройки и автоматически подключается к сети хоста.

    2. Использование эмуляции окружения

    Теперь рассмотрим использование qemu для эмуляции архитектуры в окружении пользователя. Команда qemu-user или qemu-архитектура позволяет выполнять программы, собранные для другой архитектуры прямо в вашей системе. Это очень часто используется для отладки программ, собранных для arm на компьютере или других подобных задач. Команде достаточно передать команду и ее параметры:

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

    Выводы

    В этой статье мы очень кратко рассмотрели как пользоваться qemu, основные настройки этой утилиты и опции. На самом деле там намного больше опций и возможностей. Одна только возможность эмулировать такое огромное количество архитектур чего стоит. Если для вас эмулятор qemu слишком сложен через терминал, то можно использовать графический интерфейс, например, virt-manager. А вы используете qemu? Или предпочитаете другие виртуальные машины? Почему? Напишите в комментариях!

    Обзор и установка QEMU

    Обзор и установка QEMU

    QEMU – это приложение виртуализации, бесплатный инструмент с открытым исходным кодом, который используется для эмуляции различных архитектур.

    Перед знакомством с QEMU стоит рассказать о том, что такое виртуализация и эмуляция в частности.

    Виртуализация и виртуальная машина

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

    А виртуальная машина, в свою очередь, это программа, которая эмулирует (имитирует) работу другого компьютера. То есть на виртуальную машину можно установить операционную систему, она имеет свою оперативную память, жесткий диск и так далее.

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

    Поэтому чаще всего виртуальные машины используются в тех случаях, когда нужно получить новое рабочее окружение без переустановки основной операционной системы (например, Linux на машине с Windows и наоборот). Виртуальные машины позволяют эмулировать архитектуры игровых приставок. Также они используются для защиты информации и ограничения возможностей запускаемых процессов. Виртуальную машину удобно переносить на другой компьютер: для этого нужно только установить на нем программу эмуляции и перенести образ нужной виртуальной машины. В общем, существует множество преимуществ использования виртуальных машин.

    Популярные программы виртуализации это:

    О последней и пойдет речь в этой статье.

    Комьюнити теперь в Телеграм
    Подпишитесь и будьте в курсе последних IT-новостей

    QEMU

    QEMU – это программа, которая используется для эмуляции программного обеспечения разных платформ. Она распространяется бесплатно и имеет открытый исходный код. Работает во всех популярных операционных системах – Microsoft Windows, Linux, MacOS, а также ее можно запускать на Android.

    Существует программная и аппаратная виртуализация – QEMU использует вторую. Аппаратная виртуализация дает возможность использовать изолированные гостевые операционные системы, которые будут управляться гипервизором (используется гипервизор XEN либо модуль ядра KVM в Linux).

    Два режима работы, в которых может работать QEMU, это:

    1. Полная эмуляция системы (full-system emulation) – в этом режиме QEMU полностью эмулирует устройство со всеми его компонентами и периферийными устройствами. Режим используется для запуска операционных систем.
    2. Эмуляция пользовательского режима (user-mode emulation) – режим позволяет программы, созданные на одном процессоре, запускать на другом, эмулируемом движке.

    QEMU может эмулировать следующие архитектуры:

    • x86 (32 и 64 бит),
    • ARM,
    • SPARC,
    • PowerPC (32 и 64 бит),
    • MIPS,
    • m68k (Coldfire),
    • SH-4,
    • CRISv2,
    • Alpha,
    • MicroBlaze.

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

    Установка QEMU

    Информация об установке есть на официальном сайте, в разделе Download QEMU . Тем, кто использует Windows, нужно будет скачать установочный файл (в зависимости от разряда своей системы).

    Команда для установки QEMU на Linux выглядит следующим образом (для примера взята Ubuntu):

    # apt-get install qemu

    Все довольно просто, так как QEMU есть в официальных репозиториях Ubuntu.

    Для изучения всех возможностей QEMU стоит обратиться к официальной документации .

    Команда для создания образа:

    # qemu-img create myimage.img mysize
    • myimage.img — название файла с образом диска;
    • mysize — размер в килобайтах (для размера в мегабайтах в конце надо добавить M, в гигабайтах — G: 10G).

    Если нужно указать формат (qcow2 — формат, который используется QEMU по умолчанию), то нужно использовать ключ -f:

    # qemu-img create -f qcow2 myimage.img 10G

    Более подробную информацию о команде qemu-img можно посмотреть здесь .

    Команда для запуска системы:

    # qemu-system-x86_64 -hda myimage.img -boot d -cdrom ~/downloads/ubuntu-17.04-server-amd64.iso -m 640
    • жесткий диск подключается как -hda (другие возможные варианты: -hdb, -hdc, -hdd);
    • если указать -boot d, то загрузка будет начинаться с CD-ROM (в противном случае – с жесткого диска);
    • -cdrom указывает, что файл будет использоваться как образ CD-ROM (поэтому нельзя одновременно использовать ключи -cdrom и -hdc);
    • в конце указывается количество оперативной памяти, которое будет выделено для машины.

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

    # qemu -hda myimage.img -m 640

    Для того чтобы включить поддержку KVM, нужно добавить -enable-kvm в конце.

    Заключение

    QEMU – хороший инструмент виртуализации, обладающий широкими возможностями. Он подойдет не всем, однако может составить конкуренцию даже VirtualBox.

    А вы пользуетесь программами виртуализации? Какими именно?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *