Translate

пʼятниця, 10 травня 2013 р.

Віртуалізація з KVM

KVM (або Kernel-based Virtual Machine) - це програмне рішення, що забезпечує віртуалізацію в середовищі Linux на платформі x86 (а з версією ядра 3.9 для ARMv7 також), яка підтримує апаратну віртуалізацію на базі Intel VT або AMD SVM.
Програмне забезпечення KVM складається з завантаження модуля ядра (що зветься kvm.ko), що надає базовий сервіс віртуалізації, специфічного для процесора модуля kvm-amd.ko або kvm-intel.ko, і компонентів для користувача режиму (модифікованого QEMU). Всі компоненти KVM є програмним забезреченням із відкритим вихідним кодом. Компонент ядра, необхідний для роботи KVM, включений в основну гілку Linux починаючи з версії 2.6.20 (лютий 2007). Тож для роботи з даним типом віртуалізації варто мати лише ядро більш-менш сучасної версії.
Самостійно KVM не виконує емуляції. Замість цього програма (QEMU), що працює в просторі користувача, використовує інтерфейс /dev/kvm для налаштування адресного простору гостя віртуальної машини, через нього ж і емулює пристрої введення-виведення і відеоадаптер. (c) Wikipedia

Тож приступаємо! Установка КVM віртулізації буде проведено для Ubuntu 12.10. Спершу перевіримо чи підтримує процесор хост-системи апаратну віртуалізацію:

# egrep '(vmx|svm)' --color=always /proc/cpuinfo

Має видати щось на зразок цього:

flags:  fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt lahf_lm arat dtherm tpr_shadow vnmi flexpriority ept vpid

Якщо вивід відсутній - то можна завершувати спроби встановлення KVM, адже даний тип віртуалізації не працює на процесорах без підтримки SVM чи Intel VT. Як варіант можна використати XEN PV (паравіртуалізацію), що власне є також дуже хорошим варіантом. Але загалом у всіх відносно сучасних процесорах не має бути таких проблем.
Тепер встановимо супутнє програмне забезпечення:

# sudo -i
# apt-get install ubuntu-virt-server python-vm-builder kvm-ipxe

vm-builder - це python-скрипт для зручного створення віртуальних машин Ubuntu.
Додамо користувача root в групи libvirtd та kvm:

# adduser `id -un` libvirtd
# adduser `id -un` kvm

Перелогінюємось і перевіряємо чи коректно було встановлено KVM:

# virsh -c qemu:///system list
  Id    Name                           State
----------------------------------------------------

Якщо все саме так і немає жодних помилок - то поки все йде в правильному руслі.
Наразі будемо налаштувувати мережевий міст (bridge) задля того, щоб в гостевій операційній системі було підключення до мережі.

Встановлюємо пакет для бріджингу:

# apt-get install bridge-utils

Одразу згадаю, що драйвери wifi-карток далеко не всі підтримують режим бріджинга, тож краще експериментувати з провідним інтерфейсом eth. Мої мережеві налаштування /etc/network/interfaces до правки виглядали так: 

# cat /etc/network/interfaces
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
        address 192.168.1.26
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
        gateway 192.168.1.1
        dns-nameservers 8.8.8.8 8.8.4.4

А після так:

# cat /etc/network/interfaces
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        address 192.168.1.26
        network 192.168.1.0
        netmask 255.255.255.0
        broadcast 192.168.0.255
        gateway 192.168.1.1
        dns-nameservers 8.8.8.8 8.8.4.4
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

    У випадку коли мережею управляє Network Manager, то interfaces-налаштування звісно будуть майже пустими. Також бажано взагалі зупинити Network Manager.
    Перевантажуємо мережу:

# /etc/init.d/networking restart

І перевіряємо налаштування і наявність інтерфейсу br0:

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP qlen 1000
link/ether 64:31:50:04:7c:49 brd ff:ff:ff:ff:ff:ff

4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 64:31:50:04:7c:49 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.26/24 brd 192.168.0.255 scope global br0
inet6 fdee:cbcd:a595:0:c81c:78ee:72ef:6a31/64 scope global temporary dynamic

5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 2a:bf:a7:d5:3a:d7 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0


Після цього бажано перевантажити сервер.
    Власне підготовчі кроки було виконано, переходимо до установки гостевої операційної системи. Для створення віртуалки із Ubuntu можна скористуватись скриптом vmbuilder, проте перед цим створимо директорію для віртуальної машини та скопіюємо template-файли для майбутньої машини:

# mkdir -p /var/lib/libvirt/images/vm-ubuntu/mytemplates/libvirt
# cp /etc/vmbuilder/libvirt/* /var/lib/libvirt/images/vm-ubuntu/mytemplates/libvirt/

Також опишимо віртуальний диск майбутньої інсталяції:

# vi /var/lib/libvirt/images/vm-ubuntu/vmbuilder.partition
root 2048
swap 1024
---
/var 2048

Розмір задано в МБ, а лінія "---" створить директорії var на другому віртуальному диску. Тобто до віртуалки буде підключено два віртуальних HDD.

Користуючись вищезгаданим скриптом переходимо до самого процесу установки:

# vmbuilder kvm ubuntu \
--suite=precise \
--flavour=virtual \
--arch=amd64 \
--mirror=http://de.archive.ubuntu.com/ubuntu \
-o \
--libvirt=qemu:///system \
--ip=192.168.1.30 \
--gw=192.168.1.1 \
--part=vmbuilder.partition \
--templates=mytemplates \
--user=vmipeacocks \
--name=vmipeacocks --pass=blogspot \
--addpkg=vim-nox --addpkg=unattended-upgrades \
--addpkg=openssh-server --addpkg=acpid \
--mem=1024 \
--hostname=vm-ubuntu \
--bridge=br0

Загалом опції очевидні і мають бути зрозумілими. Опція --addpkg встановлює вищезгадані пакети до нової системи, --libvirt=qemu:///system - додає нову машину до списку існуючих машин KVM, а ключ --mirror - указує на використання репозиторіїв, із яких завантажиться операційна система.

За декілька хвилин гостьову систему буде встановлено:

# virsh -c qemu:///system list

 Id    Name                           State
----------------------------------------------------
 12    vm-ubuntu                      running

Також можна підключить по ssh на ip 192.168.1.30, так як було попередньо встановлено відповідний пакет ключем -addpkg=openssh-server.

Якщо ж необхідний консольний доступ через virsh-меню, то слід налаштувати консоль в гостевій операційній системі (попредньо підключившись, наприклад, по ssh):

# vim /etc/init/ttyS0.conf

# ttyS0 - getty
#
# This service maintains a getty on ttyS0 from the point the system is
# started until it is shut down again.

start on stopped rc or RUNLEVEL=[2345]
stop on runlevel [!2345]

respawn
exec /sbin/getty -L 115200 ttyS0 vt102

І запустити її як процес:

$ sudo start ttyS0

Тепер гостева операційна система буде доступна також через virsh-консоль:

# virsh console vm-ubuntu
Connected to domain vm-ubuntu
Escape character is ^]
Ubuntu 12.04.2 LTS vm-ubuntu ttyS0

vm-ubuntu login:


Установка інших дистрибутивів/операційних систем відбувається за допомогою скрипта virt-install. Наведу приклад установлення CentOS.
Встановлюємо virt-install:

apt-get install virtinst

Качаємо net-install/minimal образ CentOS і монтуємо його:

# wget http://ftp.colocall.net/pub/centos/6.4/isos/x86_64/CentOS-6.4-x86_64-netinstall.iso

# mkdir /mnt/centos64
# mount -o loop CentOS-6.4-x86_64-netinstall.iso /mnt/centos64

Створюємо диск розміром 8 ГБ для гостьової операційної системи:

# dd if=/dev/zero of=/var/lib/libvirt/images/vm-centos.img bs=1M count=8192

Запускаємо virt-install:

# sudo virt-install \
--connect qemu:///system \
-n vm-centos \
-r 1024 \
--vcpus=2 \
--disk path=/var/lib/libvirt/images/vm-centos.img \
-l /mnt/centos64 \
--os-type linux \
--accelerate \
--nographics \
-v \
--network=bridge:br0 \
-x "console=ttyS0"

Ключ --nographics дозволяє завантажити ос в консольному режимі, -x "console=ttyS0" - додає описує консоль, а інші опції ніби доволі очевидні.

Після виконання команди стартує псевдографічний інтерфейс установки CentOS, де потрібно буде указати налаштування мережі і таке інше.


Також можна скористатись програмою Virt-manager для управління віртуальними машинами


Управління віртуальними машинами може виконуватись через virsh-меню:

# virsh list
# virsh list --all
# virsh dominfo vm
# virsh start vm
# virsh shutdown vm
# virsh console vm
# virsh edit vm
# virsh destroy vm
# virsh undefine vm
# virsh help

Щоб мати можливість вимикати/вмикати віртуальну машину за допомогою virsh-меню необхідно пересвідчитись, що в гостевій операційній системі установлено i запущено acpid.

Посилання:
http://www.howtoforge.com/virtualization-with-kvm-on-ubuntu-12.04-lts-p2
http://sysadminman.net/blog/2011/kvm-virtualization-text-centos-guest-install-2098
http://www.howtoforge.com/installing-kvm-guests-with-virt-install-on-ubuntu-12.04-lts-server-p2
http://opennodecloud.com/documentation/howtos/kvm-guests-virt-install-examples/
http://linuxguru.ru/virtualization/kvm/ustanovka-virtualizacii-kvm-v-debian-squeeze/
http://forum.likg.org.ua/kvm/setup-serial-console-device-for-virsh-console-centos-t504.html
http://ubuntuforums.org/showthread.php?t=1159220&p=9610421#post9610421

1 коментар: