- Вступ
- Серія Linux Administration
- Основи віртуалізації
- Архітектура QEMU та KVM
- Встановлення KVM та QEMU
- Створення віртуальних машин з QEMU
- Керування ВМ за допомогою libvirt та virsh
- Віртуальна мережа
- Керування сховищем віртуальних машин
- Жива міграція
- Контейнери LXC
- Кращі практики для продакшн середовищ
- Усунення несправностей
- Висновок
- Часті запитання
Вступ
Віртуалізація є наріжним каменем сучасної інфраструктури, забезпечуючи ефективне використання ресурсів, ізоляцію робочих навантажень та гнучкі стратегії розгортання. Цей вичерпний посібник охоплює технології віртуалізації Linux: QEMU/KVM для повної віртуалізації, libvirt для керування ВМ та LXC для легковагової контейнеризації.
Ми дослідимо архітектури гіпервізорів, створення та керування віртуальними машинами, конфігурації сховища, налаштування мережі, живу міграцію та ізоляцію контейнерів. Кожен розділ включає практичні приклади, архітектурні діаграми та кращі практики для продакшн середовищ.
Серія Linux Administration
📚 Переглянути повний посібник Linux Administration - Опануйте всі 7 частин з нашим комплексним шляхом навчання.
Це Частина VI нашого комплексного 7-частинного посібника з адміністрування Linux:
- ← Частина I: Файлова система та управління процесами
- Частина II: Аутентифікація користувачів та LDAP
- Частина III: Фаєрвол UFW та мережі
- Частина IV: systemd та SSH Hardening
- Частина V: Поштовий сервер Postfix
- Частина VI: Віртуалізація QEMU KVM ← Ви тут
- Частина VII: Сховище LVM та RAID →
Основи віртуалізації
Типи віртуалізації та архітектура
Технології віртуалізації:
-
Повна віртуалізація (KVM/QEMU):
- Повна емуляція обладнання
- Гостьова ОС працює без модифікацій
- Апаратна віртуалізація (Intel VT-x, AMD-V)
- QEMU забезпечує емуляцію пристроїв
- KVM забезпечує прискорення на рівні ядра
-
Паравіртуалізація (Xen):
- Гостьова ОС модифікована для взаємодії з гіпервізором
- Пряма комунікація з обладнанням
- Краща продуктивність ніж повна емуляція
- Потребує модифікацій гостьової ОС
-
Контейнеризація (LXC/Docker):
- Віртуалізація на рівні ОС
- Спільне ядро хоста
- Легковагова та швидкий запуск
- Ізоляція процесів та ресурсів
Архітектура QEMU та KVM
Стек QEMU/KVM
Ключові компоненти:
- KVM (Kernel-based Virtual Machine): Модуль ядра Linux, що забезпечує віртуалізацію CPU та пам'яті (документація KVM: https://www.linux-kvm.org/page/Documents)
- QEMU (Quick Emulator): Програма користувацького простору для емуляції апаратних пристроїв (документація QEMU: https://www.qemu.org/docs/master/)
- VirtIO: Паравіртуалізовані драйвери пристроїв для оптимальної продуктивності
- libvirt: API та демон для керування віртуалізацією
Встановлення KVM та QEMU
Системні вимоги та встановлення
Перевірка підтримки віртуалізації CPU:
# Перевірка на Intel VT-x або AMD-V
egrep -c '(vmx|svm)' /proc/cpuinfo
# Ненульовий вивід означає підтримку віртуалізації
# Перевірка доступності KVM
lsmod | grep kvm
# Очікуваний вивід:
# kvm_intel (Intel) або kvm_amd (AMD)
# kvm
Встановлення KVM та QEMU:
# Оновлення списку пакетів
sudo apt update
# Встановлення QEMU, KVM та утиліт (документація qemu-img: https://www.qemu.org/docs/master/tools/qemu-img.html)
sudo apt install qemu-kvm qemu-system qemu-utils
# Встановлення додаткових інструментів
sudo apt install libvirt-daemon-system libvirt-clients bridge-utils
# Додавання користувача до необхідних груп
sudo usermod -aG kvm $USER
sudo usermod -aG libvirt $USER
# Перезавантаження або повторний вхід для застосування змін груп
newgrp kvm
newgrp libvirt
# Перевірка встановлення
virsh --version
qemu-system-x86_64 --version
# Перевірка прискорення KVM
kvm-ok
# Очікується: "KVM acceleration can be used"
Створення віртуальних машин з QEMU
Формати образів дисків
Створення образів дисків:
# Створення образу QCOW2 (рекомендується для більшості випадків)
qemu-img create -f qcow2 ubuntu-vm.qcow2 60G
# Створення raw образу (краща продуктивність, без функцій)
qemu-img create -f raw ubuntu-vm.raw 60G
# Перегляд інформації про образ
qemu-img info ubuntu-vm.qcow2
# Конвертація між форматами
qemu-img convert -f raw -O qcow2 source.raw destination.qcow2
# Зміна розміру образу
qemu-img resize ubuntu-vm.qcow2 +20G
# Створення образу зі знімками
qemu-img create -f qcow2 -o backing_file=base-image.qcow2 snapshot1.qcow2
Створення та запуск віртуальних машин
Базове створення ВМ:
# Завантаження Ubuntu ISO (приклад)
wget https://releases.ubuntu.com/22.04/ubuntu-22.04.3-live-server-amd64.iso
# Створення образу диска
qemu-img create -f qcow2 ubuntu-server.qcow2 40G
# Завантаження ВМ з ISO (встановлення)
qemu-system-x86_64 \
-enable-kvm \
-m 4G \
-cpu host \
-smp cores=2,threads=1 \
-cdrom ubuntu-22.04.3-live-server-amd64.iso \
-drive file=ubuntu-server.qcow2,format=qcow2 \
-boot d \
-vnc :1
# Завантаження встановленої ВМ
qemu-system-x86_64 \
-enable-kvm \
-m 4G \
-cpu host \
-smp cores=2,threads=1 \
-drive file=ubuntu-server.qcow2,format=qcow2,if=virtio \
-net nic,model=virtio \
-net user,hostfwd=tcp::2222-:22 \
-display sdl
Пояснення опцій команди QEMU:
-enable-kvm: Використання прискорення KVM-m 4G: Виділення 4ГБ оперативної пам'яті-cpu host: Використання моделі CPU хоста (найкраща продуктивність)-smp cores=2,threads=1: 2 ядра CPU-drive file=...,if=virtio: VirtIO диск (паравіртуалізований)-net nic,model=virtio: VirtIO мережева карта-net user,hostfwd=tcp::2222-:22: Переадресація портів (хост:2222 → гість:22)-vnc :1: VNC сервер на дисплеї :1 (порт 5901)-display sdl: Використання графічного дисплею SDL
Розширені конфігурації ВМ:
# ВМ з кількома дисками
qemu-system-x86_64 \
-enable-kvm \
-m 8G \
-cpu host \
-smp 4 \
-drive file=system.qcow2,format=qcow2,if=virtio \
-drive file=data.qcow2,format=qcow2,if=virtio \
-net nic,model=virtio \
-net bridge,br=br0
# ВМ з проброшенням USB
qemu-system-x86_64 \
-enable-kvm \
-m 4G \
-usb \
-device usb-host,vendorid=0x1234,productid=0x5678
# ВМ з проброшенням PCI (GPU)
qemu-system-x86_64 \
-enable-kvm \
-m 8G \
-device vfio-pci,host=01:00.0
Керування ВМ за допомогою libvirt та virsh
Архітектура libvirt
Встановлення libvirt та virt-manager:
# Встановлення повного стеку віртуалізації (документація libvirt: https://libvirt.org/docs.html)
sudo apt install virt-manager libvirt-daemon-system libvirt-clients bridge-utils
# Запуск та увімкнення libvirt
sudo systemctl start libvirtd
sudo systemctl enable libvirtd
# Перевірка статусу
sudo systemctl status libvirtd
# Додавання користувача до групи libvirt
sudo usermod -aG libvirt $USER
Створення ВМ за допомогою virt-install
Базове створення ВМ:
# Створення Ubuntu ВМ (документація virt-install: https://manpages.ubuntu.com/manpages/focal/man1/virt-install.1.html)
virt-install \
--name ubuntu-server \
--memory 4096 \
--vcpus 2 \
--disk size=40,format=qcow2,path=/var/lib/libvirt/images/ubuntu-server.qcow2 \
--cdrom ~/Downloads/ubuntu-22.04.3-live-server-amd64.iso \
--os-variant ubuntu22.04 \
--network bridge=virbr0 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole
# Підключення до консолі ВМ
virt-viewer ubuntu-server
# Або використання VNC
# VNC порт = 5900 + номер дисплея (перевірте за допомогою: virsh vncdisplay ubuntu-server)
Розширене створення ВМ:
# ВМ з конкретною моделлю CPU та функціями
virt-install \
--name production-server \
--memory 8192 \
--vcpus 4,maxvcpus=8,cores=2,threads=2,sockets=1 \
--cpu host-passthrough,cache.mode=passthrough \
--disk path=/var/lib/libvirt/images/production.qcow2,size=100,format=qcow2,bus=virtio,cache=writeback \
--disk path=/var/lib/libvirt/images/production-data.qcow2,size=200,format=qcow2,bus=virtio \
--network bridge=br0,model=virtio \
--graphics spice,listen=0.0.0.0,port=5901 \
--video qxl \
--os-variant ubuntu22.04 \
--import
# Імпорт існуючого диска (пропуск встановлення)
virt-install \
--name imported-vm \
--memory 2048 \
--vcpus 1 \
--disk path=/path/to/existing-disk.qcow2,format=qcow2 \
--import \
--os-variant ubuntu22.04 \
--network bridge=virbr0
Керування ВМ за допомогою virsh
Керування життєвим циклом ВМ:
# Список всіх ВМ
virsh list --all
# Запуск ВМ
virsh start ubuntu-server
# Коректне вимкнення ВМ
virsh shutdown ubuntu-server
# Примусова зупинка ВМ
virsh destroy ubuntu-server
# Перезавантаження ВМ
virsh reboot ubuntu-server
# Призупинення ВМ
virsh suspend ubuntu-server
# Відновлення призупиненої ВМ
virsh resume ubuntu-server
# Автозапуск ВМ при завантаженні
virsh autostart ubuntu-server
virsh autostart ubuntu-server --disable
# Видалення ВМ (зберігає диски)
virsh undefine ubuntu-server
# Видалення ВМ та всього сховища
virsh undefine ubuntu-server --remove-all-storage
Конфігурація та інформація про ВМ:
# Перегляд інформації про ВМ
virsh dominfo ubuntu-server
# Перегляд конфігурації ВМ (XML)
virsh dumpxml ubuntu-server > ubuntu-server.xml
# Редагування конфігурації ВМ
virsh edit ubuntu-server
# Перегляд консолі ВМ
virsh console ubuntu-server
# Перегляд VNC дисплея
virsh vncdisplay ubuntu-server
# Зняття скріншоту ВМ
virsh screenshot ubuntu-server screenshot.ppm
Керування ресурсами:
# Перегляд поточної пам'яті
virsh dominfo ubuntu-server | grep memory
# Встановлення пам'яті (потребує вимкнення ВМ)
virsh setmem ubuntu-server 4G --config
# Встановлення максимальної пам'яті
virsh setmaxmem ubuntu-server 8G --config
# Зміна кількості vCPU (онлайн)
virsh setvcpus ubuntu-server 4 --live
# Постійне встановлення кількості vCPU
virsh setvcpus ubuntu-server 4 --config
# Перегляд статистики CPU
virsh cpu-stats ubuntu-server
# Перегляд статистики пам'яті
virsh dommemstat ubuntu-server
Віртуальна мережа
Архітектура мережі
Режими мережі:
- NAT (Network Address Translation): За замовчуванням, ВМ використовують спільний IP хоста
- Bridged: ВМ з'являються у фізичній мережі
- Host-only: ВМ спілкуються тільки з хостом
- Isolated: ВМ спілкуються тільки між собою
Налаштування мережі bridge:
# Встановлення утиліт bridge
sudo apt install bridge-utils
# Створення конфігурації bridge
sudo vim /etc/netplan/01-netcfg.yaml
# Конфігурація:
network:
version: 2
ethernets:
eth0:
dhcp4: no
bridges:
br0:
interfaces: [eth0]
dhcp4: yes
# Застосування конфігурації
sudo netplan apply
# Перевірка bridge
brctl show
ip addr show br0
# Створення ВМ з мережею bridge
virt-install \
--name bridged-vm \
--memory 2048 \
--vcpus 1 \
--disk size=20 \
--network bridge=br0 \
--os-variant ubuntu22.04 \
--cdrom ubuntu.iso
Керування віртуальними мережами:
# Список мереж
virsh net-list --all
# Перегляд деталей мережі
virsh net-info default
virsh net-dumpxml default
# Створення нової мережі
cat > isolated-network.xml <<EOF
<network>
<name>isolated</name>
<bridge name='virbr1'/>
<ip address='192.168.100.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.100.100' end='192.168.100.200'/>
</dhcp>
</ip>
</network>
EOF
virsh net-define isolated-network.xml
virsh net-start isolated
virsh net-autostart isolated
# Видалення мережі
virsh net-destroy isolated
virsh net-undefine isolated
Керування сховищем віртуальних машин
Пули сховищ
Створення та керування пулами сховищ:
# Список пулів сховищ
virsh pool-list --all
# Перегляд деталей пула
virsh pool-info default
virsh pool-dumpxml default
# Створення пула на основі директорії
mkdir -p /mnt/vm-storage
virsh pool-define-as vmpool dir --target /mnt/vm-storage
virsh pool-start vmpool
virsh pool-autostart vmpool
# Створення пула на основі LVM
virsh pool-define-as lvm-pool logical --source-name vg-vms --target /dev/vg-vms
virsh pool-start lvm-pool
# Список томів в пулі
virsh vol-list vmpool
# Створення тому
virsh vol-create-as vmpool data-disk.qcow2 50G --format qcow2
Підключення та відключення дисків:
# Підключення диска до працюючої ВМ
virsh attach-disk ubuntu-server \
/var/lib/libvirt/images/data.qcow2 \
vdb \
--targetbus virtio \
--persistent
# Відключення диска
virsh detach-disk ubuntu-server vdb --persistent
# Підключення CD-ROM
virsh attach-disk ubuntu-server \
/path/to/cdrom.iso \
hdc \
--type cdrom \
--mode readonly
# Зміна носія CD-ROM
virsh change-media ubuntu-server hdc /path/to/new.iso
Знімки дисків:
# Створення знімка (документація virsh: https://libvirt.org/manpages/virsh.html)
virsh snapshot-create-as ubuntu-server \
snapshot1 \
"Pre-upgrade snapshot" \
--disk-only \
--atomic
# Список знімків
virsh snapshot-list ubuntu-server
# Перегляд інформації про знімок
virsh snapshot-info ubuntu-server snapshot1
# Відновлення до знімка
virsh snapshot-revert ubuntu-server snapshot1
# Видалення знімка
virsh snapshot-delete ubuntu-server snapshot1
Жива міграція
Архітектура міграції
Міграція ВМ між хостами:
# Передумови:
# - Спільне сховище (NFS, iSCSI тощо)
# - Однакова версія libvirt на обох хостах
# - SSH доступ між хостами
# - Сумісні моделі CPU
# Жива міграція ВМ
virsh migrate --live ubuntu-server \
qemu+ssh://destination-host/system \
--persistent \
--verbose
# Офлайн міграція
virsh migrate ubuntu-server \
qemu+ssh://destination-host/system \
--offline \
--persistent
# Міграція з власними параметрами
virsh migrate --live ubuntu-server \
qemu+ssh://destination-host/system \
--persistent \
--undefinesource \
--copy-storage-all \
--verbose \
--bandwidth 1000
Контейнери LXC
Архітектура контейнерів
Встановлення LXC:
# Встановлення LXC
sudo apt install lxc lxc-templates
# Перевірка конфігурації LXC
lxc-checkconfig
# Список доступних шаблонів
ls /usr/share/lxc/templates/
Створення та керування контейнерами:
# Створення Ubuntu контейнера
sudo lxc-create -n container1 -t ubuntu
# Створення з конкретним релізом
sudo lxc-create -n ubuntu2204 -t ubuntu -- -r jammy
# Створення Debian контейнера
sudo lxc-create -n debian-container -t debian
# Створення Alpine контейнера (легковаговий)
sudo lxc-create -n alpine-container -t alpine
# Список контейнерів
sudo lxc-ls -f
# Запуск контейнера
sudo lxc-start -n container1
# Підключення до консолі контейнера
sudo lxc-attach -n container1
# Виконання команди в контейнері
sudo lxc-attach -n container1 -- apt update
# Зупинка контейнера
sudo lxc-stop -n container1
# Видалення контейнера
sudo lxc-destroy -n container1
Конфігурація контейнера:
# Перегляд конфігурації контейнера
cat /var/lib/lxc/container1/config
# Редагування конфігурації контейнера
sudo vim /var/lib/lxc/container1/config
# Приклад конфігурації:
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
# Обмеження ресурсів
lxc.cgroup2.memory.max = 512M
lxc.cgroup2.cpu.max = 50000 100000 # 50% одного CPU
# Клонування контейнера
sudo lxc-copy -n container1 -N container2
# Знімок контейнера
sudo lxc-snapshot -n container1
# Список знімків
sudo lxc-snapshot -n container1 -L
# Відновлення знімка
sudo lxc-snapshot -n container1 -r snap0
Кращі практики для продакшн середовищ
-
Виділення ресурсів:
- Не перевитрачайте CPU та пам'ять
- Моніторте використання ресурсів хоста
- Використовуйте обмеження ресурсів (cgroups)
- Плануйте пікові навантаження
-
Сховище:
- Використовуйте QCOW2 для гнучкості, raw для продуктивності
- Впроваджуйте регулярні резервні копії
- Використовуйте LVM або ZFS для розширених функцій
- Моніторте продуктивність дискового вводу/виводу
-
Мережа:
- Використовуйте драйвери VirtIO для найкращої продуктивності
- Впроваджуйте ізоляцію мережі
- Налаштовуйте відповідні правила брандмауера
- Моніторте пропускну здатність мережі
-
Безпека:
- Тримайте гіпервізор оновленим
- Використовуйте SELinux або AppArmor
- Ізолюйте мережу керування
- Впроваджуйте контроль доступу
- Регулярні аудити безпеки
-
Висока доступність:
- Використовуйте спільне сховище для живої міграції
- Впроваджуйте автоматичне відновлення після збоїв
- Регулярне тестування резервного копіювання та відновлення після аварій
- Моніторте здоров'я ВМ
Усунення несправностей
KVM не працює:
# Перевірка підтримки віртуалізації CPU
egrep -c '(vmx|svm)' /proc/cpuinfo
# Перевірка завантаження модулів KVM
lsmod | grep kvm
# Завантаження модулів KVM
sudo modprobe kvm
sudo modprobe kvm_intel # або kvm_amd
# Перевірка вкладеної віртуалізації
cat /sys/module/kvm_intel/parameters/nested
ВМ не запускається:
# Перевірка стану ВМ
virsh domstate ubuntu-server
# Перегляд логів помилок
virsh dominfo ubuntu-server
sudo journalctl -u libvirtd -f
# Валідація XML конфігурації
virt-xml-validate /etc/libvirt/qemu/ubuntu-server.xml
# Перевірка доступності ресурсів
virsh nodeinfo
free -h
df -h /var/lib/libvirt/images/
Проблеми з мережею:
# Перевірка віртуальних мереж
virsh net-list --all
virsh net-info default
# Перезапуск мережі
virsh net-destroy default
virsh net-start default
# Перевірка bridge
brctl show
ip addr show virbr0
# Перевірка правил iptables
sudo iptables -L -n -v -t nat
Проблеми з контейнерами:
# Перевірка стану контейнера
sudo lxc-info -n container1
# Перегляд логів контейнера
sudo lxc-console -n container1 -t 0
# Перевірка конфігурації cgroup
cat /sys/fs/cgroup/lxc/container1/memory.limit_in_bytes
# Перевірка мережі
sudo lxc-attach -n container1 -- ip addr
Висновок
Віртуалізація Linux надає потужні опції для ізоляції робочих навантажень та керування ресурсами. QEMU/KVM пропонує повну віртуалізацію з апаратним прискоренням, libvirt забезпечує комплексні інструменти керування, а LXC надає легковагову контейнеризацію.
Обирайте відповідні технології: QEMU/KVM для запуску різних операційних систем з повною ізоляцією, libvirt для централізованого керування ВМ, та LXC для легковагових контейнерів додатків. Впроваджуйте належне виділення ресурсів, заходи безпеки, стратегії резервного копіювання та моніторинг для продакшн середовищ.
Часті запитання
П: Яка різниця між KVM та QEMU?
KVM (Kernel-based Virtual Machine) - це модуль ядра Linux, що забезпечує підтримку апаратної віртуалізації через Intel VT-x або AMD-V. QEMU - це емулятор користувацького простору, що використовує KVM для прискорення. Разом QEMU/KVM забезпечує повну віртуалізацію з продуктивністю близькою до нативної. KVM обробляє віртуалізацію CPU/пам'яті, QEMU емулює пристрої та I/O.
П: Як libvirt спрощує керування ВМ?
Libvirt надає уніфікований API для керування ВМ через гіпервізори як KVM, Xen та VirtualBox. Включає інструмент командного рядка virsh, GUI virt-manager та конфігурацію на основі XML. Переваги включають консистентний інтерфейс керування, абстракцію мережі/сховища, підтримку живої міграції та інтеграцію з інструментами оркестрації як OpenStack.
П: Яка різниця між ВМ та контейнерами?
ВМ запускають повні операційні системи з окремими ядрами через гіпервізори, забезпечуючи сильну ізоляцію але вищі накладні витрати. Контейнери спільно використовують ядро хоста, використовуючи namespaces та cgroups для ізоляції з мінімальними накладними витратами. Використовуйте ВМ для запуску різних ОС або сильних меж безпеки, контейнери для ізоляції додатків та швидкого розгортання.
П: Як створити ВМ через virt-install?
Використовуйте virt-install з ISO або мережевим джерелом установки: "virt-install --name myvm --memory 2048 --vcpus 2 --disk size=20 --cdrom /path/to/ubuntu.iso --network bridge=virbr0". Для мережевої установки використовуйте "--location" замість "--cdrom". Додайте "--graphics none --console" для безголовної установки. Це створює ВМ з вказаними ресурсами.
П: Що таке LXC контейнери і коли їх використовувати?
LXC (Linux Containers) забезпечує віртуалізацію на рівні ОС через cgroups та namespaces ядра. Контейнери завантажуються як ВМ, але спільно використовують ядро хоста, пропонуючи легковагову ізоляцію. Використовуйте LXC для запуску кількох дистрибутивів Linux на одному ядрі, середовищ розробки або ізоляції додатків без накладних витрат ВМ. Docker будується на концепціях LXC.
П: Як CPU pinning покращує продуктивність ВМ?
CPU pinning призначає конкретні фізичні ядра CPU для ВМ, запобігаючи накладним витратам планування CPU та thrashing кешу. Налаштуйте через virsh vcpupin або в domain XML з vcpu placement='static' та секціями cputune. Переваги включають консистентну продуктивність, зменшену затримку та краще використання кешу CPU для робочих навантажень, чутливих до затримки.
П: Що таке жива міграція і як це працює?
Жива міграція переміщує запущені ВМ між хостами без простою. KVM копіює сторінки пам'яті поки ВМ працює, потім робить коротку паузу для передачі фінального стану. Вимагає спільного сховища (NFS/iSCSI), сумісних функцій CPU та мережевого з'єднання. Використовуйте virsh migrate для міграцій. Критично важливо для обслуговування без переривання сервісу.