Embedded Linux to potężne narzędzie w świecie robotyki i elektroniki, umożliwiające uruchomienie pełnoprawnego systemu operacyjnego na mikrokontrolerach i płytkach deweloperskich.
W tym przewodniku krok po kroku zainstalujesz Linuksa na platformie wbudowanej, skupiając się na praktyce: kompilacji skrośnej, konfiguracji bootloadera i przygotowaniu jądra.
Do instalacji przyda się znajomość linii poleceń w Linuksie oraz podstaw kompilacji, choć znajomość języka C nie jest obowiązkowa. Skupimy się na popularnej płytce BeagleBone Black, a opisany proces jest uniwersalny dla wielu platform ARM (np. Raspberry Pi i innych SoC).
Dlaczego embedded Linux w robotyce i elektronice?
Embedded Linux oferuje elastyczność, wielozadaniowość i bogaty ekosystem bibliotek, co przyspiesza rozwój autonomicznych robotów, dronów i systemów IoT.
W odróżnieniu od RTOS-ów (np. FreeRTOS) Linux zapewnia pełny stos TCP/IP, wsparcie grafiki i zaawansowane narzędzia deweloperskie bez potrzeby pisania wszystkiego od zera.
Zalety praktyczne:
- szybka iteracja – uruchamiasz system od zera i dopasowujesz jądro do konkretnego hardware’u;
- niski koszt – płytki jak BeagleBone Black (ok. 100–200 zł) są tanie i stabilne;
- społeczność – mnóstwo tutoriali i dystrybucji jak Yocto czy Buildroot.
Wyzwania to głównie footprint (pamięć) i czas rozruchu – dlatego Linux najlepiej sprawdza się w zaawansowanych projektach robotycznych.
Wymagania wstępne
Przed instalacją przygotuj poniższe elementy:
- host PC – Ubuntu 24.04 lub nowsze do kompilacji skrośnej;
- płytka deweloperska – np. BeagleBone Black (ARM Cortex-A8);
- kabel USB–UART – do konsoli szeregowej (np. FT232R);
- narzędzia – Git, make, ncurses-dev.
Aby zainstalować podstawowe pakiety narzędziowe, wykonaj:
sudo apt update
sudo apt install git build-essential bc bison flex libssl-dev u-boot-tools
Do komunikacji szeregowej możesz użyć narzędzi minicom lub picocom.
Krok 1: kompilacja skrośna (cross-compilation)
Kompilacja skrośna to budowanie kodu dla architektury ARM na maszynie x86_64. Skorzystaj z toolchainów gcc-arm-linux-gnueabihf (ARM 32-bit) lub gcc-aarch64-linux-gnu (ARM64).
Aby zainstalować toolchainy, użyj polecenia:
sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf \
gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
Alternatywnie możesz użyć Dockera z Buildx do multi-arch buildów i emulacji bez fizycznego sprzętu. Instalacja Dockera na Ubuntu przebiega tak:
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin
Aby przygotować buildera multiarch z QEMU, wykonaj:
docker buildx create --name multiarch-builder --use
docker buildx inspect --bootstrap
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
Test kompilacji „Hello World” dla ARM64 w Dockerze – przykładowy Dockerfile:
# Dockerfile
FROM --platform=$BUILDPLATFORM gcc:12 AS builder
ARG TARGETPLATFORM
WORKDIR /usr/src/app
COPY hello.c .
RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
apt-get update && apt-get install -y gcc-aarch64-linux-gnu && \
aarch64-linux-gnu-gcc hello.c -o hello; \
else \
gcc hello.c -o hello; \
fi
Aby zbudować i uruchomić obraz ARM64, wykonaj:
docker buildx build --platform linux/arm64 -t hello:arm64 --load .
docker run --platform linux/arm64 --rm hello:arm64
QEMU emuluje ARM na x86 w locie, co pozwala testować oprogramowanie robotyczne bez dostępu do płytki.
Krok 2: bootloader – U-Boot
Bootloader inicjuje sprzęt i ładuje jądro – w systemach embedded standardem jest U-Boot.
Aby pobrać i zbudować U-Boota dla BeagleBone Black, użyj:
git clone https://github.com/u-boot/u-boot.git
cd u-boot
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- beaglebone_black_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
Wgraj obrazy na kartę SD/eMMC (zastąp /dev/sdX właściwym urządzeniem):
dd if=MLO of=/dev/sdX bs=512 seek=1
dd if=u-boot.img of=/dev/sdX bs=512 seek=2
U-Boot pozwala ładować jądro przez TFTP oraz montować system plików rootfs przez NFS, co znacząco przyspiesza iterację.
Krok 3: przygotowanie jądra Linuksa
Jądro to serce systemu – dla BeagleBone użyj gałęzi Linux 6.x. Pobierz i skonfiguruj źródła:
git clone https://github.com/beagleboard/kernel.git
cd kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- omap2plus_defconfig
Kluczowe decyzje konfiguracyjne: wybierz, które sterowniki wkompilować „na stałe”, a które jako moduły (np. GPIO, I2C dla robotyki) oraz włącz obsługę platformy AM335x (BeagleBone).
Aby skompilować jądro i pliki Device Tree, uruchom:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j$(nproc) zImage dtbs
Device Tree Blob (DTB) opisuje sprzęt i jest kluczowy dla poprawnej obsługi pinów GPIO i peryferiów w projektach robotycznych.
Krok 4: root filesystem i przestrzeń użytkownika
Rootfs to bazowy system plików – w praktyce najwygodniej zbudować go narzędziami Buildroot lub Yocto. Przykład z Buildroot:
git clone https://github.com/buildroot/buildroot
cd buildroot
make beaglebone_defconfig
make
Podczas konfiguracji zwróć uwagę na kluczowe elementy:
- sieć (narzędzia i konfiguracja interfejsów),
- skrypty init i proces uruchamiania,
- biblioteki i zależności skrośnie skompilowane (np. glibc).
Programy przestrzeni użytkownika kompiluj toolchainem cross-gcc; dla minimalnych obrazów świetnie sprawdza się BusyBox.
Montaż rootfs przez NFS w U-Boot możesz zainicjować tak:
setenv serverip 192.168.1.100; bootm
Krok 5: komunikacja i debugowanie
Do uruchamiania, transferu danych i diagnostyki używaj sprawdzonych narzędzi:
- konsola szeregowa – uruchom:
minicom -D /dev/ttyUSB0 -b 115200; - transfer plików – wykorzystaj netcat, scp, a do zdalnego debugowania gdbserver;
- core dumps – analizuj zrzuty pamięci w przypadku awarii aplikacji.
W zastosowaniach robotycznych wygodne jest SSH do zdalnego sterowania (np. GPIO napędzające silniki).
Praktyczne ćwiczenia dla robotyków
- Uruchom miganie diodą LED na GPIO (export pinu, kierunek, cykl).
- Skompiluj sterownik silnika krokowego jako moduł i wczytaj go narzędziem
modprobe. - Skonfiguruj „sieciowego robota”: jądro przez TFTP, rootfs przez NFS, sterowanie przez gniazda TCP/UDP.
Na BeagleBone po starcie systemu zweryfikuj wersję poleceniem: uname -a.
Zaawansowane tipy i pułapki
Poniższe wskazówki pomogą dopracować obraz i szybciej diagnozować problemy:
- optymalizacja – stripowanie binariów i kompresja rootfs (np. squashfs) w celu zmniejszenia obrazu;
- emulacja – Docker Buildx z QEMU umożliwia testy bez fizycznego hardware’u;
- bezpieczeństwo – SELinux w embedded stosuj głównie w systemach krytycznych;
- diagnostyka – błędny DTB skutkuje brakiem peryferiów; sprawdzaj logi
dmesg.