Czym jest Ubuntu Core? Praktyczne wprowadzenie
Czym jest Ubuntu Core? Praktyczne wprowadzenie

Zazwyczaj w systemach Embedded Linux rządzi Yocto, Buildroot albo własne, mniejsze lub większe wynalazki. Dlaczego ktoś w ogóle chciałby pakować tam Ubuntu?
W tym artykule przybliżę, dlaczego to może mieć sens, z jakich klocków składa się ten system oraz jak możesz go przetestować bezpośrednio na swoim komputerze.
W kolejnym wpisie zobaczysz jak zbudować ubuntu core na Raspberry Pi: https://linuxdev.pl/jak-zbudowac-ubuntu-core-na-raspberry-pi-poradnik-krok-po-kroku/
Czym w zasadzie jest Ubuntu Core?
W dużym skrócie: to bardzo okrojona wersja tego samego distro, które dobrze znamy z PC. Wersja desktopowa ma mnóstwo bloatu i zależności, których na urządzeniu wbudowanym nie potrzebujemy.
W świecie embedded potykamy się jednak o wyzwania, które na komputerach osobistych rzadko zaprzątają nam głowę:
-
Zdalne aktualizacje (OTA) – tak, żeby przy podbijaniu wersji softu nie popsuć innych paczek i zależności.
-
Długi czas życia projektu – przemysłowe urządzenia często muszą działać bezawaryjnie przez długie lata.
-
Security – konteneryzacja dla aplikacji i pilnowanie restrykcyjnych polityk bezpieczeństwa.
Jak do tych problemów podchodzi Ubuntu Core?
-
Transakcyjne aktualizacje – mniejsza szansa na fakap. Jeśli proces zapisu softu zostanie przerwany lub się nie powiedzie, system automatycznie robi rollback do poprzedniej, działającej wersji.
-
Wszystko jest snapem (nawet kernel!) – każda aplikacja i komponent systemu działa w odizolowanym środowisku. Bezpieczny sandboxing dostajemy tutaj „domyślnie”.
-
Wsparcie na lata – Canonical deklaruje okres wspierania urządzenia nawet do 15 lat.
TL;DR: dostajemy łatwiejszą konfigurację systemu, wbudowane security i potencjalnie większą szansę na bezpieczne aktualizacje softu.
Architektura, czyli wszystko jest snapem
Pierwsza i najważniejsza rzecz – w Ubuntu Core każda aplikacja i element systemu jest dostarczany jako snap. W systemie istnieje równolegle wiele snapów, ale najważniejsze są cztery fundamenty:
-
Kernel snap – zawiera jądro systemu, initramfs, devicetree i firmware.
-
Gadget snap – odpowiada za schemat partycji w pamięci (
gadget.yaml), pliki konfigurujące HW oraz zawiera w sobie bootloader. -
Core snap – fundament OS. Zawiera rootfs, serwisy systemd i podstawowe zależności (np. bibliotekę C), aby uniknąć ich duplikacji.
-
Snapd snap – demon, który działa w tle i zarządza całym tym cyrkiem: kontroluje inne snapy i zarządza interfejsami.
W uproszczeniu każdego snapa możemy traktować jako kontener wraz z aplikacją. Kluczowym założeniem jest tzw. confinement. Oznacza to, że każdy snap ma ściśle określone, z jakimi zasobami systemowymi może się komunikować.

Co jeśli snap potrzebuje skorzystać z zewnętrznego zasobu, np. z kamery?
Na te potrzeby definiuje się snap interface, czyli połączenie między dwoma zasobami. Mamy tutaj zdefiniowane plug (wtyczkę) oraz slot (kontakt) między konsumentem a producentem danych.
Jak można podejrzeć jakie interfejsy są zdefiniowane dla konkretnej aplikacji:
Połączenia miedzy snapami są zobrazowane na poniższym diagramie (źródło: https://snapcraft.io/docs/explanation/interfaces/all-about-interfaces/#explanation-interfaces-all-about-interfaces )

Dzięki temu zyskujemy odizolowanie aplikacji, choć ceną jest dodatkowy effort związany z integracją aplikacji jako snap. Zaletą jest też Snap Store, gdzie możemy łatwo udostępniać aplikacje, a nawet bootloadery dla urządzeń przemysłowych.
Proces bootowania – różnice
Boot proces na Ubuntu Core wygląda bardzo podobnie do standardowego sposobu znanego z secure boota.
ROM code → Bootloader → Kernel → Initramfs → Userspace.
Dodatkowo po drodzą są weryfikowane podpisy każdego elementu za pomocą TPM.
Co się zmienia – na etapie tymczasowego ramdysku, initramfs, startuje program snap-bootstrap. Przejmuje sporą część kontroli nad inicjalizacją, montuje partycje (data, system-boot etc.), odszyfrowuje dysk, zajmuje się też ustawieniem zmiennych środowiskowych do aktualizacji A/B (tzn. aktualizacji z uzyciem dwóch aprtycji – aktywnej i nieaktywnej).
Jak odpalić Ubuntu Core na swoim komputerze? Poradnik krok po kroku
Jak przetestować nowoczesny system operacyjny dla IoT bezpośrednio na swoim komputerze, bez posiadania dedykowanej płytki deweloperskiej? Z pomocą przychodzi emulacja w QEMU. Przeprowadzimy proces dla wersji Ubuntu Core 26.
Co potrzebujemy na start
Zakładam, że pracujesz na klasycznym Ubuntu lub Debianie. Musimy zainstalować samo QEMU oraz pakiet OVMF, który dostarczy nam niezbędny firmware UEFI:
Przed przejściem dalej warto upewnić się, że nasz procesor wspiera wirtualizację i KVM działa bez zarzutu:
Ściąganie i przygotowanie obrazu
Obraz pobieramy bezpośrednio z oficjalnej dokumentacji Ubuntu. Interesuje nas architektura Generic x86 oraz wersja ubuntu-core-26.
Po pobraniu musimy przenieść plik do naszego katalogu roboczego i go rozpakować, ponieważ domyślnie jest skompresowany formatem xz:
Ubuntu Core do poprawnego startu wymaga środowiska UEFI. Kopiujemy pliki kodu oraz zmiennych OVMF prosto do naszego bieżącego katalogu projektowego:
Uruchomienie QEMU
Teraz przechodzimy do najciekawszej części, czyli konfiguracji i odpalenia samej maszyny wirtualnej. Pamiętaj o podmienieniu <ubuntu-core-image.img> na dokładną nazwę Twojego rozpakowanego obrazu!
Wywołujemy komendę startową:
Podczas pierwszego bootowania system spędza mnóstwo czasu nad wstępną konfiguracją. Wygląda to trochę tak, jakby pierwszy boot zakończył się błędem i wywalił system. Nie przejmuj się tym – to całkowicie normalne zachowanie. Następuje automatyczny restart i dopiero po nim przechodzimy do właściwego etapu.
W logach tekstowych ładnie zobaczysz, jak załącza się snap-bootstrap, apparmor oraz pozostałe komponenty specyficzne dla tego systemu. Ostatecznie Ubuntu Core zablokuje terminal z QEMU. Przywita nas login screen, na którym trzeba będzie przejść uwierzytelnianie i podpiąć swoje konto połączone z Ubuntu (Ubuntu SSO).
Połączenie SSH
Skoro terminal maszyny wirtualnej jest zajęty, do systemu dostaniemy się z zewnątrz przez SSH. Dzięki regule -net user,hostfwd=tcp::8022-:22, port 22 malutkiego Ubuntu został przekierowany na port 8022 naszego lokalnego komputera.
Logujemy się za pomocą SSH:
Gdy już znajdziemy się w środku, warto rzucić okiem na układ katalogów wywołując tradycyjne ls:
Widać gołym okiem, że architektura opiera się całkowicie na paczkach snap. Możemy to łatwo potwierdzić poleceniem snap list:
Jak widać, nawet samo jądro systemu (pc-kernel) oraz konfiguracja sprzętowa wirtualnej maszyny (pc) są dostarczane w formie osobnych, bezpiecznych i odizolowanych snapów zarządzanych przez snapd.
I to wszystko! Mamy w pełni działające, odizolowane środowisko Ubuntu Core 26 uruchomione na QEMU, gotowe do testowania aplikacji i dalszych eksperymentów z systemami wbudowanymi.
Wdrażasz Embedded Linuxa?
Jeżeli potrzebujesz profesjonalnego szkolenia lub konsultacji z Embedded Linuxa – napisz.

