суббота, 9 января 2016 г.

Установка виртуальной машины Qemu-KVM на домашний ПК с Linux

Ранее я уже писал об установке Qemu-KVM в Debian. Но, на мой взгляд, информация получилась неполной. Плюс я не учёл некоторые нюансы. Потому предлагаю вашему вниманию обновлённую статью по установке виртуальной машины Qemu-KVM. Старую статью, естественно, удалю.




Думаю, объяснять что такое виртуальная машина, не стоит. Вы наверняка это знаете (раз читаете эту статью). Если нет - прочитайте это. Мы же остановимся непосредсвенно на сабже. Qemu-KVM - это проект по объединению двух замечтальнейшийх (на мой взгляд) технологий полной виртуализации. Qemu - это своего рода "эмулятор компьютера", который поддерживает великое множество аппаратных архитектур. В нём можно запустить практически любую ОС для любого устройства (к примеру я запускал старые версии Mac OS X, который для PowerPC). Недостатком Qemu является его медлительность вследствии отсутствия аппратного ускорения. И тут на помощь приходит другой проект - KVM. Или Kernel Virtual Machine. KVM - это технология ядра Linux, которая позволяет обеспечить аппаратное ускорение при полной виртуализации. Недостатком KVM является поддержка только архитектуры x86

Почему Qemu-KVM? Для Linux это самый рекомендуемый проект виртуализации. Он работает быстрее, чем VirtualBox и VMware Player (по моим тестам), KVM - это родная для Линукса технология. Плюс, если вы обладатель хорошего игрового компьютера с двумя видеокартами, вы можете установить в Qemu-KVM Windows, пробросить в неё одну из видеокарт, и забыть о перезагрузке в другую ОС. Захотели поиграть - запустили виртуалку с виндой и играете. Производительность будет 95% от производительности установленной на "железо" винды. Но это просто шикарно, на мой взгляд. Об этом я напишу отдельную статью. Будет интересно :)

А теперь опишу план наших действий. Во первых, установку я буду проводить на примере Debian 8.2 GNOME 64 bit, хотя, особых различий в других графических окружениях не будет. Во-вторых - я буду описывать работу с KVM только в графическом режиме (мы ведь не на сервер будет его ставить). Поэтому никаких терминалов, скриптов и так далее, как обычно поступают в случае серверной виртуализации. В третьих - советую вам дополнительно прочитать документацию к Qemu и KVM (ссылки дам в конце статьи). Вам это очень пригодится, если вы хотите по-максимуму использовать весь потенциал этой связки. Ну чтож, план наших действий ясен. Теперь этапы действий:

  • установка qemu-kvm;
  • установка графического менеджера и дополнительных утилит;
  • настройка сетевого моста;
  • создание хранилища для виртуальных машин;
  • установка гостевой системы.

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

egrep '(vmx|svm)' /proc/cpuinfo

В выводе команды должны присутствовать либо vmx, либо svm. Если их нет - проверьте включена ли виртуализация в BIOS (ищите пункты Intel VT-i или аналогичный для AMD). Если ничего нет - значит не повезло.

Устанавливаем необходимые компоненты:

sudo apt install qemu-kvm bridge-utils libvirt-bin virt-manager

Добавляем себя в группу libvirt:

sudo adduser $USER libvirt

Теперь настроим сеть. Для того чтобы все виртауальные машины могли выходить в сеть и связываться друг с другом, нужно создать сетевой мост и виртаульные сетевые карты для каждой виртуалки (tap-устройства). Так как виртуальные машины мы будем устанавливать из графического интерфейса, то создавать вручную tap'ы не нужно. Virt Manager сделает это за нас при каждом запуске. Нам нужно только настроить мост. Для начала включим маршрутизацию в ядре:

sudo nano /etc/sysctl.conf

Ищем строку net.ipv4_forward=0 и меняем её значение на 1. Сохраняем и:

sudo sysctl -p

Далее я буду предполагать следующее: 1) на вашем компьютере есть одна сетевая карта, получающая ip-адрес от роутера. 2) вы выходите в интернет через 3G-модем, и сетевая карта у вас свободна. Этот вариант предполагает побольше ручной работы, но он проверен неоднократно (у самого так на одной из машин). Итак, открываем файл interfaces:

sudo nano /etc/network/interfaces

Его содержимое по умолчанию такое:

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

Меняем его содержимое. Для первого варианта:

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
address 192.168.0.2
gateway 192.168.0.1
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
        bridge_ports eth0
        bridge_stp off
        bridge_maxwait 0
        bridge_fd 0

Для второго варианта:

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

auto ppp0
iface ppp0 inet wvdial

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
address 192.168.0.2
gateway 192.168.0.1
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
        bridge_ports eth0
        bridge_stp off
        bridge_maxwait 0
        bridge_fd 0
up route del default br0

Примечание: если вам не нужно автоматическое подключение Интернета через модем после старта системы, уберите из конфига строки  auto ppp0 и
iface ppp0 inet wvdial. В противном случае, убедитесь что при запуске системы, модем вставлен в USB-порт.

Сохраняем. Теперь для варианта с модемом, нужно установить программу дозвона wvdial:

sudo apt install wvdial

Правим конфиг (обратите внимание: в качестве примера используется 3G-модем Beeline. Примеры конфигов для других модемов вы без труда найдёте в интернете):

sudo nano /etc/wvdial.conf

[Dialer Defaults]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Init3 = AT+CGDCONT=1,"IP","home.beeline.ru"
Stupid Mode = 1
ISDN = 0
Modem Type = USB Modem
New PPPD = yes
Phone = *99#
Modem = /dev/ttyACM0
Username = beeline
Password = beeline
Baud = 9600
Country = Russia
Auto Reconnect = on
Auto DNS = off
Idle Seconds = 0

Сохраняем. Теперь модем будет включаться сразу после загрузки системы. Строка up route del default br0 удаляет маршрут по умолчанию через мост. Если этого не сделать, вы не сможете соединиться с Интернетом, так как трафик будет идти по мосту, а не через 3G-модем.

Последним этапом нам нужно сказать фаерволлу, чтобы он пропускал в сеть трафик от наших виртуалок и обратно. Для этого можно пойти двумя путями: написать скрипт с несколькими правилами для iptables, который будет запускаться вместе с системой, или ввести эти правила вручную и сохранить их. Я воспользуюсь первым вариантом. Для второго вам нужно будет установить пакет iptables-persistent и просто поочерёдно вводить правила (с использованием sudo). Итак. создаём скрипт (в любом текстовом редакторе). Вставляем туда следующее содержимое:

#!/bin/sh

# Определяем выходной интерфейс для которого будет применяться замена адресов (NAT)
iptables -v -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

# Пересылаем все пакеты, пришедшие на модем из глобальной сети (0.0.0.0/0) в локальную сеть (192.168.0.0/24)
iptables -v -A FORWARD -i ppp0 -o br0 -s 0.0.0.0/0 -d 192.168.0.0/24 -j ACCEPT

# Пересылаем все пакеты, пришедшие из локальной сети (192.168.0.0/24) в глобальную (0.0.0.0/0)
iptables -v -A FORWARD -i br0 -o ppp0 -s 192.168.0.0/24 -d 0.0.0.0/0 -j ACCEPT

Сохраняем его как gateway.sh и даём права на выполнение (либо в свойствах файла, либо в терминале командой chmod +x gateway.sh). Теперь вы можете либо запускать его вручную, после того как загрузилась система, либо добавить в автозагрузку. Для этого переместите скрипт в ~/.config/autostart (в файловом менеджере включите показ скрытых файлов, и вы увидите каталог .config в домашней директории).

Теперь всё готово для установки виртуальной машины. Из меню приложений запускаем Virt Manager (менеджер виртуальных машин):



Кликаем правой кнопкой на строке localhost и выбираем Детали. Переходим на вкладку Хранилище. Нам нужно указать каталог (или раздел диска/диск) для хранения виртуальных машин.



В левом нижнем углу жмём на плюсик (Добавить пул), указывам тип хранилища и путь к нему.



На вкладке Сетевые интерфейсы, можете проверить, всё ли работает.



Теперь нажимаем Файл - New virtual machine. Указываем путь к образу диска, тип виртуальной машины. Далее указываем количество оперативной памяти для неё и количество ядер процессора. Далее указываем наше хранилище и нажимаем Новый том. Указываем название, тип оставляем qcow2, и размер. Это будет виртуальный жёсткий диск. Если планируете устанавливать систему с графической оболочкой и кучей программ, дайте места побольше (гигов 50). На последней вкладке ставим галочку на Изменить настройки перед запуском, проверяем что в качестве сетевого устройства выбран наш мост, пишем любое название для виртуалки и жмём Завершить. Перед вами откроется окно параметров этой виртуальной машины.







Переходим на вкладку Процессор, и ставим галочку на Скопировать настройки процессора хост-системы.



Далее на вкладку Диск, и указываем тип шины VirtIO (самая производительная).



Далее на вкладку Сеть (следующая), и также указываем vitio. На вкладке Дисплей укажите Spice, а на вкладке Видео - QXL. Обычно эта связка обеспечивает максимальную производительность отрисовки графики, но, если хотите, можете поэксперементировать. Учтите, что для гостевых систем Windows, требуется отдельная установка QXL-драйвера (в самой Windows).




Теперь когда всё готово, в левом верхнем углу жмём Начать установку. И ставим систему как обычно, за одним исключением: как только установщик начнёт автоматически настраивать сеть, нажмите Отмена, и выберите Настроить сеть вручную. Укажите для виртуалки желаемый IP-адрес (в нашем случае 192.168.0.3), маску подсети (255.255.255.0), шлюз (шлюзом будет адрес хоста, тоесть 192.168.0.2) и DNS-сервер (здесь просто укажите Гугловский 8.8.8.8). И всё. Дальше ничего делать не нужно. Ставьте систему и настраивайте. В общем-то, всё. Описанные действия - это способ заменить, скажем, VirtualBox на более лучшую альтернативу. Прочитав документацию, вы поймёте, насколько широки возможности Qemu-KVM. Я намеренно не стал описывать здесь дополнительные консольные параметры и методы запуска виртуальных машин через терминал, так как это далеко не всегда нужно на домашней машине. Об этом я напишу отдельную статью, по настройке домашнего многофункционального сервера (который также сможет выступать в качестве сервера виртуальных машин). Для тех, кто по каким-то причинам не понял написанное, или остались непонятные моменты - предлагаю посмотреть ролик, в котором я уже не опишу, а покажу, как всё это добро устанавливать и настраивать. Если у вас есть предложения или дополнения к статье - пишите в комментариях.

Дополнение: для работы графических окружений, которым необходимо 3D ускорение, установите пакеты spice-vdagent и xserver-xorg-video-qxl



Ссылки:

man-страница Qemu
Руководство Qemu
Документация к Qemu от IBM
Основы виртуализации с KVM
Дополнительная информация по использованию Qemu-KVM в Debian
Виртуализация (описание из Debian Administrator Handbook) 

5 комментариев:

  1. Александр, благодарю за статьи очень полезно! Хотелось бы продолжения темы про переборску видео карты. И создания общей папки на Qemu-KVM

    ОтветитьУдалить
    Ответы
    1. Обязательно. Сейчас немного с делами разберусь - и напишу ещё пару статей о Qemu-KVM

      Удалить
    2. Стоит ли ждать статью про проброс видеокарты ?

      Удалить
  2. Анонимный26 мая 2016 г., 21:20

    Поставил ему библиотеку, которую он просил, запускаю, он запускается, но окна с ВМ нет.

    Мануал для Гном только.

    ОтветитьУдалить
    Ответы
    1. У меня оно в KDE стоит на Debian 8. Всё работает отлично

      Удалить