- Налаштування Linux системи для запуску KVM
- Перевіряємо наявність апаратної підтримки
- Налаштування мережі для віртуальних машин
- Установка віртуальної машини
- Підготовка до завантаження FreeBSD
- Перший запуск і установка FreeBSD в ВМ
- Другий запуск і настройка драйверів virtio
- Що таке virtio і навіщо він взагалі потрібен?
- третій запуск
- Гостьова консоль
Запускаємо FreeBSD під Linux KVM.
Для KVM гипервизора можна використовувати будь-який дистрибутив Linux, ми будемо використовувати Ubuntu 12.10 x64.
У віртуальній машині будемо використовувати FreeBSD 9.1 i386. 32-бітна архітектура обрана через меншого споживання пам'яті 32-бітними програмами в порівнянні з 64-бітними.
Налаштування Linux системи для запуску KVM
Нехай все потрібні образи дисків і файли налаштувань зберігаються в домашньому каталозі в підкаталозі virt:
Встановлюємо в Linux необхідне для запуску KVM ПО:
apt-get update && apt-get -y install kvmЗа віртуалізацію відповідає модуль в складі ядра, але при цьому нам потрібні керуючі і допоміжні утиліти, KVM-специфічні настройки для основних Linux-сервісів, що знаходяться в пакетах, які apt-get встановить по залежностям.
Перевіряємо наявність апаратної підтримки
kvm-okДля запуску віртуальних машин з використанням KVM нам потрібна апаратна віртуалізація, яка підтримується процесором і дозволена в BIOS'e.
Якщо віртуалізація не підтримуються апаратно, KVM буде перемикатися в режим програмної віртуалізації на базі QEMU, що працює набагато повільніше.
Налаштування мережі для віртуальних машин
Для реального застосування найкраще підходять два варіанти:
- базова система надає гостьовим прозорий доступ в зовнішню мережу через т.зв. мережевий міст ( «network bridge»),
- базова система працює як маршрутизатор між зовнішньою і гостьовий мережею ( «router»).
Обидва вимагають суперпользовательскіх привілеїв, мають в нашому випадку однаковий набір параметрів для "-net ...», але відрізняються набором дій в сценарії «-net ..., script = ...«, який KVM викликає при старті контейнера для настройки мережевого інтерфейсу, створеного в базовій системі . Варіант з мостом дещо простіше, тому наш сценарій ~ / virt / kvm-ifup-bridge.sh робитиме наступне:
- якщо міст відсутня - створює його і додає в нього зовнішній фізичний інтерфейс,
- призначає мосту такий же IP, як у фізичної інтерфейсу,
- переміщує всі маршрути з фізичного інтерфейсу на міст,
- підключає в міст віртуальний інтерфейс для зв'язку з гостьової системою.
У різних посібниках рекомендується налаштовувати міст заздалегідь, редагуючи / etc / network / interfaces, але для тестових цілей на робочої станції простіше створювати його в той момент, коли він стає дійсно потрібен, тобто в момент першого запуску першого контейнера.
Якщо у зовнішній мережі неприпустимо засвічувати додаткові MAC-адреси, то замість моста можна використовувати маршрутизацію і ProxyARP . Якщо зовнішня мережа дозволяє рівно один MAC і один IP, тоді в базовій системі для виходу гостьових систем до зовнішнього світу доведеться використовувати маршрутизацію, IP-адреса на внутрішніх інтерфейсах і NAT. В обох випадках потрібно або налаштовувати в гостьових системах статичні IP, або налаштовувати в базовій системі DHCP-сервер для конфігурації гостей.
MAC-адреси для гостьових мережевих інтерфейсів KVM здатний генерувати автоматично при старті, але якщо планується випускати гостей до зовнішнього світу через мережевий міст, краще призначити їм постійні MAC-адреси. Зокрема, якщо у зовнішній мережі запущений DHCP-сервер, це допоможе гостьовий системі отримувати від нього однаковий IP при кожному запуску. Спочатку «складемо» базовий MAC-адресу:
perl -e '$ XEN_RESERVED = "00: 16: 3e"; printf "% s:% 02x:% 02x:% 02x \ n", $ XEN_RESERVED, int (rand (0x7f)), int (rand (0xff)), int (rand (0xff)); 'Для контейнерів будемо замінювати останнє число на їх порядковий номер. Цей же номер будемо використовувати для їх імен і для VNC-консолей. Наприклад, контейнер з номером 25 буде називатися «kvm_25», мати MAC 00: 16: 3e: xx: xx: 25 і слухати VNC-підключення на порту 59 25. Щоб не осадити геморою з різними системами числення не мати зайвих проблем, рекомендується вибирати номери від 10 до 99. Зрозуміло, такий підхід не використовується в VDS-хостингу, але для особистих потреб він годиться.
Установка віртуальної машини
1. Завантажуємося з образу CD, інсталюємо ОС на порожній образ hdd, вимикаємо VM.
2. Редагуємо сценарій запуску (відключаємо CD), завантажується з hdd, налаштовуємо в гостьовій ОС підтримку virtio, вимикаємо VM.
3. Редагуємо сценарій запуску (типи диска і мережі міняємо з IDE і Realtek на virtio), завантажуємося.
Підготовка до завантаження FreeBSD
Викачуємо ISO-образ інсталяційного диска FreeBSD:
wget http://mirror.yandex.ru/freebsd/releases/ISO-IMAGES/9.1/FreeBSD-9.1-RELEASE-i386-disc1.isoСтворюємо образ жорсткого диска:
kvm-img create -f qcow2 freebsd9.img 8G kvm-img info freebsd9.imgФормат образу вибирається ключем «-f»: raw (default), qcow2, vdi, vmdk, cloop і т.д. Raw зрозумілий кожному ПО, але надає мінімум можливостей і відразу займає максимально можливе місце. Qcow2 компактніше (підтримує динамічне збільшення розміру) і функціональніша (підтримує знімки, стиснення, шифрування і т.д.), але розпізнається тільки системами на основі QEMU.
Перший запуск і установка FreeBSD в ВМ
Сценарій для запуску ~ / virt / freebsd9.start
#! / Bin / sh MACBASE = "00: 16: 3e: 33: 28" VM_ID = 10 DIR = $ HOME / virt sudo kvm \ -net "nic, model = rtl8139, macaddr = $ MACBASE: $ VM_ID" \ - net "tap, ifname = tap $ VM_ID, script = $ DIR / kvm-ifup-bridge.sh, downscript = / bin / true" \ -name "kvm_ $ VM_ID" \ -enable-kvm \ -m 512M \ -hda $ DIR / freebsd9.img \ -cdrom "$ DIR / FreeBSD-9.1-RELEASE-i386-disc1.iso" \ -boot order = d \ ## END ##У вікні, повинні запуститися CD Loader і установник FreeBSD. Виконуємо установку звичайним чином. Майже всі параметри можна залишити за замовчуванням.
Пояснення до команди запуску
Sudo необхідний, тому що для створення TAP-інтерфейсу KVM-завантажувачу потрібні права суперкористувача.
Два ключа «-net» створюють два з'єднаних один з одним мережевих інтерфейсу: TAP в базовій системі і віртуальний Realtek-8139 в гостьовій.
Ключ «-enable-kvm» гарантує, що QEMU не вибере автоматично режим програмної емуляції, якщо KVM не зміг запуститися.
Ключ «-name» визначає заголовок консольного вікна, може використовуватися для пошуку в списку процесів і т.д.
Завантажувальним диском обраний CD ( «-boot order = d»). Опція має силу тільки при включенні контейнера, тобто при перезавантаженні пошук системи почнеться з першого диска.
Ключ «-m» задає розмір гостьового ОЗУ. За замовчуванням - 128 мегабайт. Для роботи установника цього може бути достатньо, але вже після успішної установки перша ж спроба зібрати з портів великий проект при «-m 256M» і розділі підкачки на 512 мегабайт (розмір автоматично обраний монтажником) викликала kernel trap.
Завантажувач KVM працює як звичайний користувальницький процес, тому для виключення віртуальної машини досить просто натиснути в консолі Ctrl + C (природно, при запущеній гостьовий ОС краще цього не робити і користуватися poweroff в гостьовій консолі). Зв'язок з системою віртуалізації в ядрі завантажувач здійснює через символьне псевдопристроїв / dev / kvm, тому запускати віртуальні машини може будь-який користувач, який має право писати в нього. Як правило, для таких користувачів в системі створюється група «kvm«.
Для запуску у фоновому режимі у завантажувача є ключ «-daemonize«.
Другий запуск і настройка драйверів virtio
Перед запуском в сценарії freebsd9.start необхідно закомментировать рядки «boot» і «cdrom«. Потім запускаємо його і після завершення завантаження FreeBSD входимо в її командний рядок з правами суперкористувача.
Гостьові драйвери підтримки virtio для FreeBSD поки не включені в базову ядро, а поширюються у вигляді порту, тому нам буде потрібно встановити дерево портів:
portsnap fetch extractДля збірки драйверів потрібні вихідні тексти поточного ядра:
csup -h cvsup2.ru.FreeBSD.org / usr / share / examples / cvsup / standard-supfileПісля цього збираємо і інсталюємо самі драйвери:
make -C / usr / ports / emulators / virtio-kmod install cleanУ /boot/loader.conf обов'язково повинні бути додані наступні рядки:
virtio_load = "YES" virtio_blk_load = "YES" virtio_pci_load = "YES" virtio_balloon_load = "YES" if_vtnet_load = "YES"Їх можна скопіювати з / var / db / pkg / virtio-kmod * / + DISPLAY. Якщо забудете - ядро FreeBSD випаде при завантаженні в запрошення «mountroot>» , Тому що не зможе побачити накопичувач на комп'ютері з кореневої ФС. Буде потрібно перезавантажуватися, заходити в командний рядок boot-менеджера і вручну завантажувати перед ядром ці модулі командою «load».
У /etc/rc.conf треба вставити одну з двох рядків:
ifconfig_vtnet0 = "DHCP" # ..ifconfig_re0 можна видалити ifconfig_vtnet0_name = "re0" # ..ifconfig_re0 треба залишити!Якщо до старого мережному інтерфейсу вже прив'язане велику кількість налаштувань, другий варіант дозволяє уникнути їх повсюдного зміни. Але він же робить загальну схему трохи більш заплутаною.
В / etc / fstab треба замінити всі «/ dev / ada» на «/ dev / vtbd«. Якщо диск розмічають монтажником автоматично, fstab стане таким:
# Device Mountpoint FStype Options Dump Pass # / dev / vtbd0p2 / ufs rw 1 + 1 / dev / vtbd0p3 none swap sw 0 0Якщо забудете або неправильно відредагуєте fstab - при наступному завантаженні потрапите в запрошення «mountroot» і будете змушені вручну набирати в ньому «ufs: / dev / vtbd0p2».
Що таке virtio і навіщо він взагалі потрібен?
Якщо в контейнер надається віртуальна копія реально існуючого устрою (такого як мережева карта Realtek або SCSI-диск), звернення до нього спочатку проходять через драйвер пристрою в гостьовій системі. Драйвер перетворює високорівневі виклики читання-запису даних в низькорівневі операції з перериваннями, регістрами, портами введення-виведення і т.д. Їх перехоплює система віртуалізації і виконує зворотну роботу - переводить в високорівневі виклики для зовнішньої системи (наприклад, читання-запису файлу-образу диска).
Якщо в контейнер надається пристрій типу virtio, драйвер гостьової системи негайно передає дані в зовнішню систему і назад. Драйвер спрощується, низкоуровневая віртуалізація фізичних ресурсів не потрібно.
Пишуть, що перехід на virtio прискорює в гостьовій системі диск вдвічі , а мережу майже на порядок .
Ще одна цікава можливість virtio пов'язана з динамічним виділенням пам'яті для гостьової системи ( « ballooning «) І об'єднанням блоків пам'яті з однаковим вмістом ( KSM , «Kernel Samepage Merging»).
VirtualBox і KVM використовують сумісний механізм virtio, тому набір гостьових драйверів для них однаковий. У Linux гостьові драйвери вже включені в стандартне ядро, для FreeBSD поширюються в вигляді порту (див.вище), для Windows написані розробниками KVM (див. тут ).
третій запуск
Міняємо в ~ / virt / freebsd9.start рядки із зазначенням мережевого інтерфейсу і диска:
-net "nic, model = rtl8139, macaddr = $ MACBASE: $ VM_ID" \ -hda $ DIR / freebsd9.img \... на наступні:
-net "nic, model = virtio, macaddr = $ MACBASE: $ VM_ID" \ -drive "file = $ DIR / freebsd9.img, if = virtio" \Якщо завантаження FreeBSD пройде успішно, можете переконатися за допомогою наступних команд, що віртуальні пристрої тепер використовуються:
ifconfig df; swapinfo kldstat dmesg | grep vtГостьова консоль
За замовчуванням KVM отрісовиваєт гостьову консоль в графічному вікні за допомогою бібліотеки SDL. Такий варіант погано підходить для запуску контейнера в фоновому режимі, для запуску на сервері без графіки і для доступу до консолі по мережі.
Для вирішення цього завдання KVM-контейнер може надавати доступ до гостьової консолі з мережевого протоколу VNC. В ~ / virt / freebsd9.start вставте в параметри запуску:
-vnc localhost: $ VM_ID \Тепер при запуску контейнера KVM відкриється не графічне вікно, а підключення до мережі. Побачити його можна, наприклад, командою «sudo netstat -ntlp | grep -w kvm «.
Встановіть клієнтську програму (наприклад, tightvncviewer) і встановіть з'єднання з консолі:
apt-get install vncviewer vncviewer: 10Примітка: якщо у вікні VNC немає реакції на клавіатуру, клікніть по ньому.
VNC-з'єднання може бути захищене паролем, але призначити пароль безпосередньо з командного рядка, на жаль, неможливо. Буде потрібно або підключатися до керуючої консолі контейнера через окремий керуючий сокет ( короткий опис , Як її налаштувати і як до неї підключитися), або відкривати її в основному VNC-вікні натисканням Ctrl + Alt + Shift + 2.
На додаток до SDL і VNC, підтримується текстовий інтерфейс на базі curses (ключ «-curses» або «-display curses»). Теоретично він міг би бути зручний для фонового запуску в screen. На практиці KVM направляє в створювану консоль власний діагностичний сміття і робить її використання незручним.
Що таке virtio і навіщо він взагалі потрібен?