AWS оголосила про перехід від Xen до KVM. Отже, що таке KVM?

Зв’язане в оголошенні AWS про новий тип екземпляра високого класу EC2 (C5) - це сильна припущення, що гігантський хмарний обчислювальний гігант Amazon почав переміщувати свої сотні тисяч фізичних серверів від гіпервізора Xen з відкритим кодом, який запускає їх до тепер, до альтернативи з відкритим кодом, KVM.

Незалежно від того, чи є ваша кар’єра та / або іпотека на житло глибоко вкладені в майбутнє Xen, чи ви ніколи не знали, що вона існує, вам може бути цікаво дізнатись більше про KVM. Отже, ось загальний вступ, адаптований з моєї книги «Навчіть себе віртуалізації Linux та високій доступності»: підготуйтеся до іспиту на сертифікацію LPIC-3 304.

Потрібна додаткова інформація про сервери Linux або AWS? Мої лінукси в дії та вивчення веб-служб Amazon за місяць обіду можуть допомогти книги від Manning, а також мої курси адміністрування серверів Linux у Pluralsight. Існує також гібридний курс під назвою Linux in Motion, який складається з понад двох годин відео та близько 40% тексту Linux в дії.

КВМ

Як і Xen, KVM (віртуальна машина на основі ядра) - це технологія гіпервізора з відкритим кодом для віртуалізації обчислювальної інфраструктури, що працює на x86 сумісному обладнанні. Подібно до Xen, KVM має як активну спільноту користувачів, так і значні корпоративні розгортання.

Хост KVM фактично працює на ядрі Linux разом із двома модулями ядра KVM (модулем kvm.ko та kvm-intel.ko або kvm-amd.ko). Завдяки тісній інтеграції ядра - включаючи підключення вводу / виводу з блоком ядра та мережевими драйверами, що надаються Virtio - KVM може запропонувати своїм гостям безперебійний доступ до всіх складних апаратних та мережевих профілів, з якими вони можуть зіткнутися.

Розширення апаратної віртуалізації, вбудовані в сучасні конструкції центрального процесора та необхідні для розгортання KVM, означають, що гості KVM безпосередньо можуть безпечно отримати доступ лише до тих апаратних ресурсів, які їм потрібні, не турбуючись про витік у більшу систему.

Де саме вкладається QEMU у все це? Окрім того, що здатний діяти як гіпервізор, сила QEMU - це і емулятор. KVM, виконуючи роль віртуалізації гіпервізора, може скористатися можливостями емуляції QEMU, щоб доповнити власні функції апаратного прискорення, подарувавши своїм гостям емульований чіпсет і шину PCI. Ціле, як кажуть, може бути більшим, ніж сума його частин.

Багато функцій управління для KVM часто насправді надає Libvirt. Тому іноді вам може знадобитися звернутися до детальної інформації про функції, пов’язані з KVM, такі як мережа, сховище та макети файлової системи, яка міститься у п’ятому розділі книги Навчіть себе віртуалізації та високій доступності Linux (“Libvirt та супутні інструменти”) .

Встановлення

Перш за все, вам потрібно переконатися, що фізична машина, яку ви плануєте використовувати як хост KVM, підтримує апаратну віртуалізацію. Окрім налаштування BIOS та вмісту / proc / cpuinfo (про що ми говорили в першому розділі), ви також можете швидко перевірити це з запущеної системи Linux за допомогою kvm-ok: $ kvm-ok

Також непогано переконатися, з якою апаратною архітектурою - 64 або 32-розрядною - ви працюєте: $ uname -m

Але навіть якщо ваш апаратний профіль відповідає задачі, вам доведеться включити ядро ​​Linux у свої плани. Якщо їх там ще немає, слід додати модулі ядра kvm та kvm-intel або kvm-amd. # Modprobe kvm-intel

Якщо ці модулі не завантажуються (а у файловій системі немає пристрою / dev / kvm), тоді є велика ймовірність, що ваш процесор просто не відповідає роботі, яку ви хотіли б зробити. Однак, якщо все це вдалося, ви готові встановити пакет qemu-kvm (і, якщо потрібно, libvirt, virt-install та bridge-utils).

Робота з інструментами управління KVM

Не секрет, що платформи віртуалізації мають заслужену репутацію складності. Але є дві речі, які можуть зробити початок роботи з KVM трохи складнішим, ніж деякі інші:

  • Доступно досить багато наборів інструментів управління, кожен із яких пропонує подібну, але не однакову функціональність.
  • У них є неприємна звичка змінювати імена, що використовуються для ключових двійкових файлів, залежно від того, який дистрибутив та випуск ви використовуєте.

Я познайомлю вас із Libvirt Tools та vmbuilder у п’ятому розділі, але тут ми обговоримо набір інструментів KVM.

Будівництво нових гостей за допомогою того, що ми називатимемо способом «KVM», - це двоетапний процес. По-перше, ви будете використовувати qemu-img, щоб створити нове зображення - або змінити або перетворити старе. Потім ви будете використовувати qemu-kvm для налаштування віртуальної машини, яка запускатиме установку.

Чи я щойно сказав “ти будеш використовувати qemu-kvm ...”? Дурний я. qemu-kvm давно був об'єднаний у qemu і замінений на qemu-system-x86_64. Тим часом деякі системи пропонують вам kvm як обгортку, яка виконує qemu-system-x86_64 -enable-kvm - хоча вам не слід плутати обгортку kvm зі старим двійковим файлом kvm, який використовував дещо інший синтаксис.

Тож давайте подивимось, як працюють ці два кроки. Ви створюєте образ диска за допомогою qemu-img (який, до речі, може бути дуже ефективно використаний і для інших гіпервізорів), де “мій диск” - це назва зображення, яке ви хочете створити, максимальний розмір зображення складатиме 6 ГБ, а qcow2 - це формат файлу. qcow, до речі, розшифровується як “QEMU Copy On Write”.

qemu-img create -f qcow2 /home/username/myimages/my-disk.img 6G \ Formatting ‘/home/username/myimages/my-disk.img’, \ fmt=qcow2 size=6442450944 \ encryption=off \ cluster_size=65536 \ lazy_refcounts=off \ refcount_bits=16

Вибір формату файлу буде залежати від ваших конкретних потреб. Якщо вам потрібна більша сумісність та гнучкість - включаючи можливість створювати складні знімки - тоді qcow2, мабуть, стане вашим найкращим вибором.

Формат образу qcow на диску дозволяє розподілу дискового простору зростати лише за необхідності, тобто використання простору завжди є максимально ефективним. Зміни до зображення, доступного лише для читання, можна зберегти в окремому файлі, який внутрішньо посилається на вихідне зображення. qcow2 додав можливість створювати кілька знімків зображень.

Тепер ми готові до другого кроку. Ось як ми створимо нашу віртуальну машину:

kvm -name my-VM \ -hda /home/username/myimages/my-disk.img \ -cdrom /home/username/Downloads/ubuntu-16.04-server-amd64.iso \ -boot d -m 1024

Часто з’являється нове вікно SDL (хоча і не обов’язково для всіх дистрибутивів), де ви можете завершити процес встановлення операційної системи. Щоб відновити контроль над мишею з терміналу Qemu, потрібно натиснути CTRL + ALT.

Пояснити: використовуючи “kvm” (хоча точна команда, яка вам знадобиться для вашої версії, може відрізнятися), ми будемо називати нашого нового гостя “my-VM”, позначимо файл my-disk.img як hda (“жорсткий диск a ”), вкажіть на місце розташування операційної системи ISO (у цьому випадку сервер Ubuntu 16.04) і встановіть 1024 МБ як максимальну пам’ять, виділену для ВМ.

За замовчуванням KVM налаштує гостя на мережу на рівні користувача (як би були вказані параметри -netdev user, id = user.0 -device e1000, netdev = user.0). Це забезпечить гостю IP-адресу через власну службу DHCP від ​​KVM та доступ до вашого хосту, Інтернету та ресурсів на основі локальної мережі. Хоча конфігурація за замовчуванням проста, вона може бути надто обмежувальною для деяких сценаріїв, оскільки часто існують певні обмеження продуктивності та функцій.

Besides these, you can use command line flags to control various VM configuration parameters, including:

  • -smp 2 provides two processors (“smp” = symmetric multiprocessing).
  • The -net argument (example: -net nic,model=virtio,macaddr =52:54:00:05:11:11) establishes a network connection for your guest.
  • You can provision a network bridge using something like -net bridge,vlan=0,br=br0 — although this will require a matching -net definition on the host. The two are connected through a special “vlan” parameter.
  • -balloon virtio will allow me to expand or reduce a guest’s memory size without having to reboot it.
  • You can also use the -drive file= flag to define additional block storage devices. Adding a value for format= (qcow2, for instance).

The -M flag will assign a specific machine type hardware emulation. pc. For example, will provide a standard PC profile. For a complete list of available machine types, you can run kvm -M ?:

kvm -M ? Supported machines are: ubuntu Ubuntu 15.04 PC (i440FX + PIIX, 1996) (alias of pc-i440fx-wily) pc-i440fx-wily Ubuntu 15.04 PC (i440FX + PIIX, 1996) (default) ubuntu Ubuntu 15.04 PC (i440FX + PIIX, 1996) (alias of pc-i440fx-vivid) pc-i440fx-vivid Ubuntu 15.04 PC (i440FX + PIIX, 1996) (default) pc-i440fx-utopic Ubuntu 14.10 PC (i440FX + PIIX, 1996) pc-i440fx-trusty Ubuntu 14.04 PC (i440FX + PIIX, 1996) pc Standard PC (i440FX + PIIX, 1996) (alias of pc-i440fx-2.5) pc-i440fx-2.5 Standard PC (i440FX + PIIX, 1996) pc-i440fx-2.4 Standard PC (i440FX + PIIX, 1996) pc-i440fx-2.3 Standard PC (i440FX + PIIX, 1996) pc-i440fx-2.2 Standard PC (i440FX + PIIX, 1996) pc-i440fx-2.1 Standard PC (i440FX + PIIX, 1996) pc-i440fx-2.0 Standard PC (i440FX + PIIX, 1996) pc-i440fx-1.7 Standard PC (i440FX + PIIX, 1996) pc-i440fx-1.6 Standard PC (i440FX + PIIX, 1996) pc-i440fx-1.5 Standard PC (i440FX + PIIX, 1996) pc-i440fx-1.4 Standard PC (i440FX + PIIX, 1996) pc-1.3 Standard PC (i440FX + PIIX, 1996) pc-1.2 Standard PC (i440FX + PIIX, 1996) pc-1.1 Standard PC (i440FX + PIIX, 1996) pc-1.0 Standard PC (i440FX + PIIX, 1996) pc-0.15 Standard PC (i440FX + PIIX, 1996) pc-0.14 Standard PC (i440FX + PIIX, 1996) pc-0.13 Standard PC (i440FX + PIIX, 1996) pc-0.12 Standard PC (i440FX + PIIX, 1996) pc-0.11 Standard PC (i440FX + PIIX, 1996) pc-0.10 Standard PC (i440FX + PIIX, 1996) q35 Standard PC (Q35 + ICH9, 2009) (alias of pc-q35–2.5) pc-q35–2.5 Standard PC (Q35 + ICH9, 2009) pc-q35–2.4 Standard PC (Q35 + ICH9, 2009) pc-q35–2.3 Standard PC (Q35 + ICH9, 2009) pc-q35–2.2 Standard PC (Q35 + ICH9, 2009) pc-q35–2.1 Standard PC (Q35 + ICH9, 2009) pc-q35–2.0 Standard PC (Q35 + ICH9, 2009) pc-q35–1.7 Standard PC (Q35 + ICH9, 2009) pc-q35–1.6 Standard PC (Q35 + ICH9, 2009) pc-q35–1.5 Standard PC (Q35 + ICH9, 2009) pc-q35–1.4 Standard PC (Q35 + ICH9, 2009) isapc ISA-only PC none empty machine xenfv Xen Fully-virtualized PC xenpv Xen Para-virtualized PC

KVM Monitor

While working with QEMU, you can open a monitor console and interact with your clients in ways that might be difficult or even impossible using a regular headless server. You can launch the KVM Monitor by pressing CTRL+ALT, and then SHIFT+2, and a new console will open on your desktop. SHIFT+1 will close the console. You can also access the console from the command line using something like:

kvm -monitor stdio

You will probably NOT be able to launch the monitor as root (i.e., via sudo). Naturally, your version may require “qemu-system-x86_64” rather than kvm. This approach allows you to add command line arguments (like that -monitor which specified a console target). Consult man qemu-system-x86_64 for details on the kinds of operations the monitor allows.

This example (borrowed from en.wikibooks.org/wiki/QEMU/Monitor) will list all the block devices currently available to your system, and then point one of them to an ISO file you want to use:

(qemu) info block ide0-hd0: type=hd removable=0 file=/path/to/winxp.img ide0-hd1: type=hd removable=0 file=/path/to/pagefile.raw ide1-hd1: type=hd removable=0 file=/path/to/testing_data.img ide1-cd0: type=cdrom removable=1 locked=0 file=/dev/sr0 ro=1 drv=host_device floppy0: type=floppy removable=1 locked=0 [not inserted] sd0: type=floppy removable=1 locked=0 [not inserted] (qemu) change ide1-cd0 /home/images/my.iso

Networking

By default, a KVM guest will receive an IP address within the 10.0.2.0/24 subnet, and have outgoing access (including SSH access) both to its host, and to the wider network beyond. By that same default however, it won’t be able to host services for network clients. If you need to open up incoming network connectivity, you’ll probably want to create a network bridge on your host that’s similar to the one we used for Xen in the previous chapter. As before, you will install bridge-utils on the host and, assuming you’re running a Debian-based system and you want your host to receive its IP from a network DHCP server, edit the /etc/network/interfaces to look something like this (on CentOS machines, edit files in the /etc/sysconfig/network-scripts/ directory):

auto lo iface lo inet loopback auto eth0 iface eth0 inet manual auto br0 iface br0 inet dhcp bridge_ports eth0 bridge_stp off bridge_fd 0 bridge_maxwait 0

On CentOS, you’ll need to create an ifcfg-br0 file in the /etc/sysconfig/network-scripts/ directory to look something like this:

DEVICE=br0 TYPE=Bridge BOOTPROTO=static DNS1=192.168.0.1 GATEWAY=192.168.0.1 IPADDR=192.168.0.100 NETMASK=255.255.255.0 ONBOOT=yes SEARCH=”example.com”

…And then add a line reading BRIDGE=br0 line to your primary network interface file (which will often be: /etc/sysconfig/network-scripts/ifcfg-eth0).

You will then stop and restart your network services (or reboot).

Looking for a solid introduction to Linux or AWS administration? Check out my Linux in Action and Learn Amazon Web Services in a Month of Lunches books and the Linux in Motion text-video hybrid course from Manning. Prefer your tech learning in video? I’ve got Linux administration courses at Pluralsight just waiting to be watched.