Buildroot: wprowadzenie


Czym jest Buildroot? Wprowadzenie z praktycznymi przykładami.

Zbudujemy pierwszy działający obraz testowego systemu i odpalimy go w emulatorze. Bez sprzętu, kart SD i innego ekwipunku. Wystarczy laptop z Linuxem i połączeniem z internetem.

Czym jest Buildroot?

Buildroot to elastyczne i rozbudowane narzędzie open-source przeznaczone do tworzenia systemów operacyjnych opartych na Linuxie, szczególnie dla urządzeń embedded. Stworzone w celu uproszczenia i przyspieszenia procesu budowania systemu.

Dzięki budowaniu systemu ze źródeł mamy większą elastyczność niż przy ściąganiu gotowych paczek, a przez użycie skryptów automatyzujących możemy ograniczyć powtarzalne i nużące zadania wiążące się z budową naszego wyspecjalizowanego systemu.

Główna strona projektu: https://buildroot.org/

Jak zacząć?

Ściągamy kod projektu ze źródła. Buildroot jest narzędziem open-source, możemy zgarnąć go prosto z githuba:

git clone https://git.buildroot.org/buildroot
cd buildroot/
git checkout -b my_root origin/2024.02.x 

--- LUB ---

git clone --depth 1 git://git.busybox.net/buildroot
cd buildroot/

Powyższa komenda ściąga najnowszego mastera z całą historią i następnie tworzy naszego prywatnego brancha na podstawie ostatniego wydania LTS – Long Term Support. Jest to najbezpieczniejsze rozwiązanie, ponieważ branche LTS są zazwyczaj bardzo dobrze przetestowane i z rozmysłem dopuszczone do szerokiego użytkowania. Ściągając najnowszego mastera i korzystanie z niego zawsze wiąże się z ryzykiem, że najnowsze commity coś popsuły.

Druga opcja ściąga tylko wersję master, z parametrem –depth 1. Oznacza to, że nie ściągamy całej historii commitów i innych metadanych. Dzięki temu całość ściągnie się znacznie szybciej.

Mamy już kod, teraz możemy przygotować się do budowania. Będziemy budować obraz na QEMU, żeby dzięki potędze emulacji móc od razu sprawdzić czy nasz obraz działa.

Jak skonfigurować projekt?

Na szczęście w projekcie znajduje się już mnóstwo domyślnych wersji konfiguracji. Możemy je zobaczyć przez komendę:

make list-defconfigs

Wylistuje ona wszystkie dostępne wersji konfiguracji. Nas interesuje plik przygotowany pod QEMU na popularną architekturę x86_64. Możemy go znaleźć korzystając z polecenia grep:

make list-defconfigs | grep -i x86_64

  mender_x86_64_efi_defconfig         - Build for mender_x86_64_efi
  pc_x86_64_bios_defconfig            - Build for pc_x86_64_bios
  pc_x86_64_efi_defconfig             - Build for pc_x86_64_efi
  qemu_x86_64_defconfig               - Build for qemu_x86_64

Interesuje nas ostatnia pozycja. Żeby wpisać naszą domyślną konfigurację do roboczego pliku .config (to on jest wykorzystywany przy budowaniu konkretnego obrazu) wpisujemy:

make qemu_x86_64_defconfig

Na tym można zakończyć konfigurację jeśli interesuje nas domyślny, minimalistyczny obraz. Na początek tyle wystarczy, jednak jeśli chcesz rozszerzyć obraz o dodatkowe narzędzia, jak np. edytory tekstu albo polecenia sieciowe, można to zrobić za pomocą $ make menuconfig. Więcej o tym narzędziu będzie w kolejnym wpisie o Buildroot.

Kompilacja i budowanie

Mamy już konfigurację, teraz wystarczy zawołać komendę:

make
--- LUB ---
make -j$(nproc)

Druga komenda jest małym ulepszeniem pierwszej – spowoduje, że proces budowania zostanie odpalony na wszystkich dostępnych rdzeniach procesora. Dzięki temu całość pójdzie szybciej. A proces budowania nie będzie trwał krótko… Można zdecydowanie zrobić sobie przerwę na kawę albo wyjść z psem. Lepiej niż tysiąc słów zobrazuje to komiks z xkcd:

Źródło: https://xkcd.com/303/

Po dłuższej chwili proces budowania się zakończy i pojawi się następujący log:

>>>   Executing post-image script board/qemu/post-image.sh

Weryfikacja i test

Teraz czas na sprawdzenie, czy pliki wygenerowane przez Buildroota będą działać. Normalnie potrzebowalibyśmy sprzętu, na który można załadować nasz obraz kernela i rootfs’a. Na szczęście dzięki QEMU, możemy to zrobić szybko i bezboleśnie.

Pliki wynikowe znajdziemy tutaj:

ls output/images/
bzImage  rootfs.ext2  start-qemu.sh

bzImage – skompresowany obraz kernela

rootfs.ext2 – obraz rootfs’a, zawierający ścieżki i pliki dostępne po starcie systemu

A jak przetestować i odpalić nasz nowy system? Buildroot pomyślał o nas i od razu przygotował skrypt, który automatycznie poda odpowiednie argumenty do komendy QEMU i odpali naszego Linuxa. Wpisujemy:

./start-qemu.sh

Po chwili powinniśmy zobaczyć pierwsze logi ze startu systemu a po kilkunastu sekundach zobaczymy prompt logowania:

Welcome to Buildroot
buildroot login:

Wpisujemy login root i to wszystko.

Mamy pełny dostęp do naszego własnego, świeżo zbudowanego Linuxa!

Zwróć uwagę, że system jest bardzo ograniczony i mały, posiada jedynie podstawowe funkcje. Możesz za pomocą polecenia $ cd / przejść do głównego katalogu i wylistować jego zawartość. System jest mały ale funkcjonalny.

# cd /
# ls
bin         lib         lost+found  opt         run         tmp
dev         lib64       media       proc        sbin        usr
etc         linuxrc     mnt         root        sys         var

Podsumowanie i kod

Buildroot jest jednym z najpopularniejszych build systemów dla wyspecjalizowanych dystrybucji Linuxa, szczególnie często używany w branży embedded. Na jego podstawie został stworzony build system dla OpenWRT.

W tym wpisie:

  • Ściągnęliśmy źródła Buildroota
  • Skonfigurowaliśmy testowy projekt
  • Zbudowaliśmy w pełni funkcjonalny obraz systemu
  • Przetestowaliśmy jego działanie przy użyciu QEMU

W kolejnym wpisie poznasz jak użyć Buildroota w zaawansowany sposób, budując rozbudowany obraz dla Raspberry Pi.

Najważniejszy kod użyty w tym poradniku znajdziesz TUTAJ


Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *