Вступ
Raspberry Pi вже давно вийшов за межі простої плати для ентузіастів: сьогодні це повноцінний міні-комп’ютер, здатний виконувати складні завдання, включаючи апаратну віртуалізацію. У цій статті покроково розглядається процес встановлення Raspberry Pi OS Lite, налаштування доступу по SSH, оновлення системи, встановлення підтримки KVM, інсталяція веб-інтерфейсу Cockpit, а також створення і запуск гостьової операційної системи за допомогою KVM. Цей підхід дозволяє перетворити Raspberry Pi на зручну платформу для тестування та навчання у сфері віртуалізації.
Встановлення Raspberry Pi OS Lite
Використовуючи утиліту Raspberry Pi Imager на картку мікро сд встановлюємо операційну систему Raspberry Pi OS Lite (64) На етапі встановлення треба змінити конфігурацію, щоб потім можна було працювати із Raspberry Pi дистанційно підключившись по SSH.
- Hostname
- Username and password
- Enable SSH


Завантажуємо систему з цієї картки пам’яті та перевіряємо IP адресу.
Підключення Raspberry Pi повинно бути по кабелю а не по wifi.
Оновлення системи
Підключаємося до Raspberry Pi по SSH
ssh [email protected]
Оновлюємо ОС до останньої версії та перезавантажуємо Raspberry Pi
sudo apt update && sudo apt full-upgrade -y
sudo reboot
Встановлення KVM libvirt
Починаючи з ядра Linux 5.10+ (а зараз Raspberry Pi OS використовує 6.x), підтримка апаратної віртуалізації KVM для ARM64 включена безпосередньо в ядро. У Raspberry Pi OS (64-bit, desktop або lite) KVM активується автоматично, щойно пристрій підтримує апаратну віртуалізацію.
Це стало можливим завдяки тому, що Raspberry Pi Foundation інтегрувала підтримку KVM безпосередньо в upstream ядро для своїх ARM64-платформ. Вони орієнтуються на те, щоб користувач міг одразу експериментувати з віртуалізацією – без додаткової конфігурації.
Проте краще це перевірити запустивши наступні команди:
якщо файл /dev/kvm є – підтримка активна
ls /dev/kvm
/dev/kvm
покаже лог запуску KVM при старті системи.
dmesg | grep -i kvm
[ 1.078559] kvm [1]: nv: 554 coarse grained trap handlers
[ 1.084177] kvm [1]: IPA Size Limit: 40 bits
[ 1.088486] kvm [1]: GICV region size/alignment is unsafe, using trapping (reduced performance)
[ 1.097272] kvm [1]: vgic interrupt IRQ9
[ 1.101231] kvm [1]: VHE mode initialized successfully
[ 3.526966] systemd[1]: Hostname set to <kvm>
Оскільки kvm працює за замовченням, необхідно довстановити libvirt
sudo apt install libvirt-daemon-system libvirt-clients bridge-utils virtinst
Перевірка роботи сервісу:
systemctl status libvirtd
● libvirtd.service - Virtualization daemon
Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; preset: enabled)
Active: active (running) since Thu 2025-05-08 10:42:46 BST; 25s ago
TriggeredBy: ● libvirtd-admin.socket
● libvirtd-ro.socket
● libvirtd.socket
Docs: man:libvirtd(8)
https://libvirt.org
Main PID: 4708 (libvirtd)
Tasks: 19 (limit: 32768)
CPU: 138ms
CGroup: /system.slice/libvirtd.service
└─4708 /usr/sbin/libvirtd --timeout 120
May 08 10:42:46 kvm systemd[1]: Starting libvirtd.service - Virtualization daemon...
May 08 10:42:46 kvm systemd[1]: Started libvirtd.service - Virtualization daemon.
Зміна прав користувача
Необхідно додати користувача kvm до груп libvirt. Оскільки ми на першому етапі створили користувача kvm, то нема потреби його додавати в групу kvm, проте якщо ви на початковому етапі створили іншого користувача, то його необхідно додати в групу kvm.
sudo usermod -aG libvirt kvm
Після додавання користувача до групи libvirt, щоб не перезавантажувати систему, можна активувати нові права командою:
newgrp libvirt
Встановлення Cockpit
Cockpit – це веб-інтерфейс для керування Linux-серверами, і один із його плагінів — Cockpit Machines — є надбудовою саме для KVM
sudo apt install cockpit cockpit-machines
Перевірка роботи служби:
sudo systemctl status cockpit.socket
● cockpit.socket - Cockpit Web Service Socket
Loaded: loaded (/lib/systemd/system/cockpit.socket; enabled; preset: enabled)
Active: active (listening) since Thu 2025-05-08 10:59:18 BST; 46s ago
Triggers: ● cockpit.service
Docs: man:cockpit-ws(8)
Listen: [::]:9090 (Stream)
Tasks: 0 (limit: 9561)
CPU: 12ms
CGroup: /system.slice/cockpit.socket
May 08 10:59:18 kvm systemd[1]: Starting cockpit.socket - Cockpit Web Service Socket...
May 08 10:59:18 kvm systemd[1]: Listening on cockpit.socket - Cockpit Web Service Socket.
Служба активна, проте в режимі прослуховування, треба її активувати виконавши команду:
sudo systemctl enable --now cockpit.socket
отримаємо результат, де cockpit сокет буде вже активним.
sudo systemctl status cockpit.socket
● cockpit.socket - Cockpit Web Service Socket
Loaded: loaded (/lib/systemd/system/cockpit.socket; enabled; preset: enabled)
Active: active (running) since Thu 2025-05-08 10:59:18 BST; 3min 24s ago
Triggers: ● cockpit.service
Docs: man:cockpit-ws(8)
Listen: [::]:9090 (Stream)
Tasks: 0 (limit: 9561)
CPU: 12ms
CGroup: /system.slice/cockpit.socket
May 08 10:59:18 kvm systemd[1]: Starting cockpit.socket - Cockpit Web Service Socket...
May 08 10:59:18 kvm systemd[1]: Listening on cockpit.socket - Cockpit Web Service Socket.
Тепер можна переходити за посиланням на порт 9090 в браузері: https://192.168.99.180:9090/

Тест гостьової ОС
Треба залогінітися через вебінтерфейс Cockpit використовуючи логін та пароль користувача сервера. Перше що користувач побачить, це дашборд із загальною інформацією про сервер

Для універсальності я перемкнув інтерфейс на англійську мову, мені так більше подобається працювати. Отже, щоб створити ОС необхідно перейти в меню Virtual machines та клацнути на кнопку Create VM відкриється вікно Create new virtual machine де треба вибрати бажані параметри ОС
Попередньо я завантажив ISO образ убунту сервера ubuntu-24.04.2-live-server-arm64.iso і розмістив його в корені системи в лдиректорії iso. Цей образ я буду запускати локально.
- Name: Ubuntu_server
- Connection: System
- Installation type: Local install medis (ISO image or distro install tree)
- Installation source: /iso/ubuntu-24.04.2-live-server-arm64.iso
- Operating system: Generic Linux 2022
- Storage: Create new volume
- Storage limit: 20 Gib
- Memory: 4 Gib

Щоб розпочати створення клацни create and run, але через мить ти отримаєш помилку:
Creation of VM Ubuntu_server failed
ERROR Requested operation is not valid: network ‘default’ is not active Domain installation does not appear to have been successful. If it was, you can restart your domain by running: virsh –connect qemu:///system start Ubuntu_server otherwise, please restart your installation.
Це помилка означає, що віртуальна машина не може бути створена, бо мережа default
неактивна. Libvirt за замовчанням створює віртуальну мережу з ім’ям default
, але вона може бути неактивною або неавтоматичною при запуску. Щоб виправити це необхідно активувати мережу і додати її до автозапуску, для цього на хості треба лише виконати дві команди:
sudo virsh net-start default
Network default started
sudo virsh net-autostart default
Network default marked as autostarted
перевіримо статус мережі default:
sudo virsh net-list --all
Name State Autostart Persistent
--------------------------------------------
default active yes yes
Тепер спробуємо повторно запустити створення госьтової ос. Клацаємо create and run знову, і образ монтується успішно, що свідчить про коректну роботу сервісу. В списку віртуальних машин зівився відповідний запис.

Для визначення та зміни налаштувань віртуальної ОС, або для доступу до керування ОС як мінімум для логічного завнершення встановлення необхідно вибрати в списку необхідну ОС і тоді користувач попаде на дашборд цієї ОС із детальними її характеристиками

Щоб збільшити екран консолі, клацаємо на кнопку Expand, і приступаємо до встановлення Ubuntu Server for ARM. В моєму випадку вікно було частково обрізано тому я встановив ОС інтуїтивно, вибиравши параметри кнопками ліворуч праворуч, таб, пробіл та ентер.
Перший запуск встановленої ОС не відбувся успішно, виник конфлікт зациклення. В консолі вибравши Serial Console, я побачив багато повідомлень: Recursive exeption occurred while dumping the CPU state.

Після вимкнення віртуальної машини та через певний час запуску, з другої спроби запуск все-ж таки відбувся, проте не без помилок. Оскільки ця ОС хмарна, то їй потрубен доступ до інтернету. На даний момент інтернет не налаштовано, тому запуск відбувся посля очікування повідомлення:
Connected to domain 'linux2022-2025-5-10'
[ *** ] Job systemd-networkd-wait-online.se…tart running (1min 22s / no limit)
Але вссе-ж таки ОС запустилася!

Тепер треба перейти до розділу налаштування локальної мережі та інтернету через брідж.
Налаштування мережі
Увага! Наступні налаштування можуть призвести до втрати з’єднання з хостом, тому перед виконанням будь якої команди переконайтеся що у вас є фізичний доступ до хоста, щоб можна було потім виправити налаштування та повернути доступ назад.
Я так і не зміг успішно завершити мережеві налаштування, тому якщо ви знаєте легкий спосіб як це реалізувати – поділіться в коментарях своїм досвідом.
За замовчанням використовується вбудований інтерфейс virtio із наступною мережею 192.168.122.1/24, для гостьової ОС був виділен IP 192.168.122.39 проте сам хост знаходиться в іншій підмережі, через що треба виконати певні налаштування.

Створення мосту відбувається в розділі Networking -> Interfaces, вибираємо Add Bridge і прописуємо назву bridge0, жодної галочки не ставимо, бо це може призвести до втрати звязку із хостом. Таким чином в списку інтерфейсіів зявився новий інтерфейс bridge0 із автоматичним отриманням IP адреси DHCP. Зараз нема жодного інтерфейсу, який би був повязаним з цим бріджем, тому продовжуємо налаштування вже на хості через термінал.
Треба переконатися, що фізичний інтерфейс хоста включено в в брідж
sudo brctl show
bridge name bridge id STP enabled interfaces
bridge0 8000.000000000000 no
virbr0 8000.5254006ad9b7 yes
В виводі цієї команди колонка interfaces порожня, що свідчить про те, що інтерфейси не повязані між собою, треба їх повязати вручну наступною командою:
sudo brctl addif bridge0 eth0
sudo ip link set bridge0 up
Повторно запускаємо команду перевірки стану бріджу і бачимо, що колонка інтерфейс вже набула звязку із фізичним інтерфейсом:
sudo brctl show
bridge name bridge id STP enabled interfaces
bridge0 8000.d83adde83f07 no eth0
virbr0 8000.5254006ad9b7 yes
Після цього брідж буде виконувати свою функцію. Тепер переходимо знову в веб інтерфейс Cockpit в розділ Networking і очікуємо від бріджа IP адресу.

IP адреса правильної підмережі з’явилася в колонці IP address, проте через певні особливості віртуальна машина так і не отримала
Висновок
Використання KVM-віртуалізації та Cockpit на Raspberry Pi — це чудова можливість для навчання, тестування та експериментів у світі ARM64-віртуалізації. Ця комбінація дозволяє користувачам глибше розібратися в принципах гіпервізора, управлінні ресурсами та налаштуванні мережевих інтерфейсів.
Однак, практичне застосування залишається досить сумнівним через кілька серйозних обмежень:
- Сумісність ARM64-операційних систем
- Багато популярних ОС мають
.img
замість.iso
, що ускладнює їх запуск у KVM. - Не всі дистрибутиви коректно підтримують UEFI, що призводить до складнощів із завантаженням.
- Відсутність офіційних оптимізованих ARM64-дистрибутивів у форматі
.iso
.
- Багато популярних ОС мають
- Нестабільна робота KVM на ARM64
- Часті проблеми із сумісністю CPU (
KVM is not supported for this guest CPU type
). - Виникнення критичних помилок, таких як “Recursive Exception occurred while dumping the CPU state”, що робить роботу віртуальних машин непередбачуваною.
- Обмежена підтримка host passthrough для ARM64.
- Часті проблеми із сумісністю CPU (
- Складнощі з мережевими налаштуваннями
- Нестабільність у конфігурації моста (bridge0) через NetworkManager.
- Проблеми з DHCP та ручним додаванням інтерфейсів у міст (
NO-CARRIER
). - Cockpit не завжди правильно розпізнає мережеві параметри у ARM64-віртуальних машинах.
В цілому, KVM на Raspberry Pi — це більше експериментальна платформа, ніж стабільний варіант для продуктивного використання. Вона чудово підходить для досліджень у сфері віртуалізації на малопотужних ARM-пристроях, проте через технічні обмеження та нестабільність її важко рекомендувати для реальних розгортань.