неділя, 14 травня 2017 р.

Налаштування Ubuntu для роботи з docker


Додати офіційний ключ GPG репозиторію пакунків Docker:

# curl -fsSL https://apt.dockerproject.org/gpg | sudo apt-key add -

Перевірити контрольну сигнатуру ключа:

# apt-key fingerprint 58118E89F3A912897C070ADBF76221572C52609D
pub   4096R/2C52609D 2015-07-14
      Key fingerprint = 5811 8E89 F3A9 1289 7C07  0ADB F762 2157 2C52 609D
uid                  Docker Release Tool (releasedocker) <docker@docker.com>

Додати репозиторій пакунків Docker:

# apt-add-repository "deb https://apt.dockerproject.org/repo/ \
       ubuntu-$(lsb_release -cs) main"

Оновити інформацію про пакунки в репозиторіях

# apt update

Встановити пакунок docker-engine останньої версії:

# apt install docker-engine

Демон docker стартує автоматично:

# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2017-05-14 20:58:56 EEST; 24s ago

...

Отримати інформацію про встановлений пакунок:

# docker version
Client:
 Version:      17.05.0-ce
 API version:  1.29
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:20:42 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.05.0-ce
 API version:  1.29 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   89658be
 Built:        Thu May  4 22:20:42 2017
 OS/Arch:      linux/amd64
 Experimental: false


# docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
Server Version: 17.05.0-ce
...

Завантажити docker-образ і запустити тестовий контейнер:

# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
78445dd45222: Pull complete 
Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

В результаті виконання останньої команди були виконані наступні дії.
  • Виконаний пошук docker-образу hello-world на локальному диску
  • Оскільки на локальному диску docker-образу hello-world не знайдено, виконано звернення до репозиторію образів на Docker Hub
  • Завантажено образ hello-world з Docker Hub
# docker image ls
REPOSITORY      TAG             IMAGE ID            CREATED             SIZE
hello-world     latest          48b5124b2768        4 months ago        1.84kB

  • З завантаженого образу створено контейнер з ідентифікатором db8d8d79e7b4 та іменем upbeat_kepler
# docker container ls --all
CONTAINER ID  IMAGE        COMMAND   CREATED        STATUS      PORTS          NAMES
db8d8d79e7b4  hello-world  "/hello"  6 minutes ago  Exited (0)  6 minutes ago  upbeat_kepler

  • Під час свого запуску контейнер виконує команду /hello
  • Вивід команди відображається в термінальному вікні
  • Контейнер завершує своє функціювання
У разі, якщо потрібно, створений контейнер може бути видалений:

# docker container rm db8d8d79e7b4
db8d8d79e7b4

Контейнер може видалятися автоматично після завершення виконання, якщо його запуск здійснюється з опцією --rm:

# docker container run --rm hello-world

Завантажений образ також може бути видалений:

# docker image rm 48b5124b2768
Untagged: hello-world:latest
Untagged: hello-world@sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Deleted: sha256:48b5124b2768d2b917edcb640435044a97967015485e812545546cbed5cf0233
Deleted: sha256:98c944e98de8d35097100ff70a31083ec57704be0991a92c51700465e4544d08

Джерела

неділя, 5 лютого 2017 р.

Міграція віртуальних машин з Oracle VirtualBox до KVM з оболонкою virt-manager

Задача

Віртуальна машина під гіпервізором KVM, який використовується сумісно з демоном libvirtd, утворюється образом диску (або декількома образами дисків) та конфігураційним файлом в форматі XML. Для того, щоб перенести (мігрувати) віртуальну машину з середовища VirtualBox до KVM+libvirtd необхідно виконати дві дії:
1) перенести образ диску
2) створити конфігураційний XML-файл


Перенесення образу диску


На всякий випадок створюємо резервну копію вмісту підкаталога, який містить образи дисків віртуальних машин в VirtualBox (зрозуміло, всі віртуальні машини і сам VirtualBox мають бути вимкнені):

$ cd
$ mkdir -p backup
$ cd backup
$ tar czvf vbox_vms.tgz -C ~ 'VirtualBox VMs'
Образи дисків в VirtualBox зберігаються в форматі VDI. Libvirt підтримує формат VDI, втім є сенс під час міграції перетворити образи дисків в "сирий" (raw) формат. Певною перевагою формату raw є те, що він характеризується найменшими накладними витратами серед всіх форматів. Втім, формат raw не підтримує створення миттєвих знімків (snapshots) диску і стискання з метою економії простору для розміщення образів дисків.


Конвертація образу диску з формату VDI в формат raw:

$ mkdir VMs
$ cd VMs
$ qemu-img convert -f vdi -O raw  \
   ../VirtualBox\ VMs/C7-BASE/C7-BASE.vdi C7-BASE.img
$ ls -lh
total 2,0G
-rw-r--r-- 1 chd chd 8,0G січ  5 21:10 C7-BASE.img


Конфігурація віртуальної машини

Запускаємо оболонку virt-manager. Виконуємо команду 'File' -- 'Create a new virtual machine'. У вікні, що з'явилося, обираємо 'Import existing disk image' та натискаємо 'Forward'.

За допомогою кнопки 'Browse' знаходимо створений образ диску, в даному випадку -- C7-BASE.img. Також обираємо тип операційної системи віртуальної машини та її версію, наприклад, 'Linux', 'Red Hat Enterprise Linux 7.0'. Натискаємо 'Forward'.

Визначаємо потрібний обсяг оперативної пам'яті (RAM) та кількість процесорних ядер (CPU). Натискаємо 'Forward'.

Встановлюємо ім'я нової віртуальної машини, наприклад 'C7-BASE', та відмічаємо опцію 'Customize configuration before install'. Вказуємо конфігурацію мережі, наприклад 'Virtual network default: NAT'. Натискаємо 'Finish'.

У вікні, що з'явилося, є можливість детально визначити всі параметри віртуальної машини, та, у разі потреби додати компоненти.

Машина готова і може бути стартована.

понеділок, 9 січня 2017 р.

Налаштування середовища для віртуалізації на основі KVM в Ubuntu

Мета

На персональному комп’ютері під операційною системою Ubuntu налаштувати середовище для роботи з віртуальними машинами на основі гіпервізора Kernel Virtual Machine (KVM). Здійснити міграцію до KVM віртуальних машин, раніше створених в гіпервізорі Oracle VirtualBox. В даній публікації розглядається початкове налаштування KVM під Ubuntu 16.04.

Перевірка підтримки віртуалізації процесором


Якщо на комп’ютері попередньо успішно використовувався VirtualBox, зрозуміло, що з підтримкою віртуалізації в нього скоріше за все проблем немає. Втім, якщо відомостей про підтримку віртуалізації комп'ютером немає, доречно виконання наступних перевірок.
Перевіряємо чи підтримує апаратно процесор комп’ютера віртуалізацію. На сьогодні це вже суто формальна перевірка, адже всі сучасні процесори мають апаратну підтримку віртуалізації. Отже:

# egrep -c ‘(vmx|svm)’ /proc/cpuinfo
8

Результат виконання команди -- кількість ядер процесора, які апаратно підтримують віртуалізацію. Прапорець vmx присутній в процесорах Intel, svm -- в процесорах AMD. Вочевидь, отримана кількість ядер процесора дорівнюватиме загальній кількості ядер процесора, адже всі вони однакові. Також ця кількість буде вдвічі більшою за кількість апаратних ядер процесора у разі ввімкнення гіпертрідінгу (hyper-threading), який зазвичай ввімкнено (можливою причиною для вимкнення гіпертрідінгу може бути бажання оптимізувати продуктивність процесору для виконання одно-трідових (single-threaded) процесів, але це не типовий випадок).

Інший метод для перевірки підтримки процесором віртуалізації -- виконання команди lscpu, приклад виводу якої наведено нижче:

# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 58
Model name:            Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz
Stepping:              9
CPU MHz:               1301.179
CPU max MHz:           3200,0000
CPU min MHz:           1200,0000
BogoMIPS:              4390.05
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              6144K
NUMA node0 CPU(s):     0-7
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 eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm epb tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms xsaveopt dtherm ida arat pln pts

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

Ще однією альтернативою перевірки спроможності процесора апаратно підтримувати віртуалізацію на основі KVM є виконання команди kvm-ok (для цього може бути потрібним встановлення пакунку cpu-checker). Вивід команди у разі підтримки розширень, які використовує KVM:

$ kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used


Для системи з віртуалізацією доречно використовувати 64-бітну операційну систему (ОС). Пересвідчитися, що використовувана ОС є 64-бітною можна командами arch або uname -a, у виводі яких має бути наявним ідентифікатор 64-бітної архітектури -- x86_64:

$ arch x86_64

Також ознакою 64-бітної архітектури ОС є наявність флагу lm в інформації з /proc/cpuinfo:

$ egrep -c ' lm ' /proc/cpuinfo
8

У разі відсутності апаратної підтримки віртуалізації процесором продуктивність системи буде низькою, а у разі використання 32-бітової ОС максимальний обсяг пам’яті створюваних віртуальних машин не зможе перевищувати 2 Гбайти.

Встановлення пакунків для віртуалізації на основі KVM


Для віртуалізації на основі KVM необхідно встановити додаткові пакунки, якщо вони не були встановлені раніше:

$ sudo apt install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils
Встановлення вказаних пакунків призведе до автоматичного встановлення додаткових необхідних пакунків.

У разі, якщо на комп’ютері встановлено сервер графічного інтерфейсу користувача X- Window, доречно додатково встановити графічну утіліту роботи з віртуалізацією virt-manager:

$ sudo apt install virt-manager

Додаткові корисні утіліти:

$ sudo apt install virt-top

Після встановлення необхідних пакунків комп’ютер доречно перезавантажити. Під час завантаження системи можна помітити повідомлення: Starting Virtualization Daemon. Після завантаження перевірити стан гіпервізора для віртуалізації libvirtd можна командою:

$ sudo systemctl status libvirtd
● libvirt-bin.service - Virtualization daemon
  Loaded: loaded (/lib/systemd/system/libvirt-bin.service; enabled; vendor preset: enabled)
  Active: active (running) since пн 2017-01-02 22:46:19 EET; 6min ago
    Docs: man:libvirtd(8)
          http://libvirt.org
Main PID: 1428 (libvirtd)
  CGroup: /system.slice/libvirt-bin.service
          ├─1428 /usr/sbin/libvirtd

творення та керування віртуальними машинами
          ├─1708 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/
          └─1709 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/

Команда для огляду стану існуючих віртуальних машин повертає пустий список:

# virsh list --all
Id    Name                           State
----------------------------------------------------

Створення та керування віртуальними машинами

Для створення та керування віртуальними машинами зручно скористатися графічною утілітою virt-manager. Утіліта надає можливість виконання всіх необхідних дій з віртуальними машинами:
  • створення нової віртуальної машини
  • імпорт віртуальної машини, створеної в іншому гіпервізорі
  • запуск (start), зупинення (shut down), призупинка (pause) віртуальної машини
  • створення миттєвих знімків (snapshots)
  • створення нової віртуальної машини шляхом клонування існуючої

Джерела

  • https://help.ubuntu.com/community/KVM/Installation
  • https://help.ubuntu.com/community/KVM/CreateGuests