Наша совместная команда Banwar.org

Связаться с нами

  • (097) ?601-88-87
    (067) ?493-44-27
    (096) ?830-00-01

Статьи

KVM - FreeBSD в віртуальній машині під Linux - Як стати програмістом

  1. Налаштування Linux системи для запуску KVM
  2. Перевіряємо наявність апаратної підтримки
  3. Налаштування мережі для віртуальних машин
  4. Установка віртуальної машини
  5. Підготовка до завантаження FreeBSD
  6. Перший запуск і установка FreeBSD в ВМ
  7. Другий запуск і настройка драйверів virtio
  8. Що таке virtio і навіщо він взагалі потрібен?
  9. третій запуск
  10. Гостьова консоль

Запускаємо 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, що працює набагато повільніше.

Налаштування мережі для віртуальних машин

Для реального застосування найкраще підходять два варіанти:

  1. базова система надає гостьовим прозорий доступ в зовнішню мережу через т.зв. мережевий міст ( «network bridge»),
  2. базова система працює як маршрутизатор між зовнішньою і гостьовий мережею ( «router»).

Обидва вимагають суперпользовательскіх привілеїв, мають в нашому випадку однаковий набір параметрів для "-net ...», але відрізняються набором дій в сценарії «-net ..., script = ...«, який KVM викликає при старті контейнера для настройки мережевого інтерфейсу, створеного в базовій системі . Варіант з мостом дещо простіше, тому наш сценарій ~ / virt / kvm-ifup-bridge.sh робитиме наступне:

  • якщо міст відсутня - створює його і додає в нього зовнішній фізичний інтерфейс,
  • призначає мосту такий же IP, як у фізичної інтерфейсу,
  • переміщує всі маршрути з фізичного інтерфейсу на міст,
  • підключає в міст віртуальний інтерфейс для зв'язку з гостьової системою.
#! / Bin / sh # Constants BRIDGE_IFACE = "br0" # Variables iface = "$ 1" gwdev = "$ (ip route get 8.8.8.8 | grep 'via' | sed -e 's,. * Dev ,,' - e 's,. * ,,' | head -1) "my_ip =" $ (ip addr list dev $ gwdev | grep 'inet' | sed -e 's,. * inet ,,' -e 's,. * ,, '| head -1) "# Create and configure bridge if! ip link list "$ BRIDGE_IFACE"> / dev / null 2> & 1 then echo "Create bridge $ BRIDGE_IFACE ..." brctl addbr "$ BRIDGE_IFACE" brctl addif "$ BRIDGE_IFACE" "$ gwdev" ​​ip link set "$ BRIDGE_IFACE" up ip addr add "$ my_ip" dev "$ BRIDGE_IFACE" fi # Move routes from physical iface to bridge if test "$ gwdev"! = "$ BRIDGE_IFACE" then ip route list dev "$ gwdev" ​​| grep -v 'scope link' \ | while read line; do ip route delete $ line dev "$ gwdev" ​​ip route add $ line dev "$ BRIDGE_IFACE" done fi # Add virtual iface to bridge ip link set "$ iface" up brctl addif "$ BRIDGE_IFACE" "$ iface"

У різних посібниках рекомендується налаштовувати міст заздалегідь, редагуючи / 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 і навіщо він взагалі потрібен?

Новости

Banwar.org
Наша совместная команда Banwar.org. Сайт казино "Пари Матч" теперь доступен для всех желающих, жаждущих волнения и азартных приключений.