Buildroot - część 1. Informacje ogólne, złożenie minimalnego systemu, konfiguracja poprzez menu

Wprowadzenie

W tej serii artykułów chcę przyjrzeć się systemowi kompilacji dystrybucji buildroot i podzielić się moimi doświadczeniami w jego dostosowywaniu. Będzie praktyczne doświadczenie w tworzeniu małego systemu operacyjnego z interfejsem graficznym i minimalną funkcjonalnością.

Przede wszystkim nie należy mylić systemu kompilacji i dystrybucji. Buildroot może zbudować system z zestawu oferowanych mu pakietów. Buildroot jest zbudowany na plikach makefile i dlatego ma ogromne możliwości dostosowywania. Zamienić pakiet na inną wersję, dodać własny pakiet, zmienić zasady budowania pakietu, dostosować system plików po zainstalowaniu wszystkich pakietów? buildroot może to wszystko zrobić.

W Rosji używany jest buildroot, ale moim zdaniem dla początkujących jest niewiele informacji w języku rosyjskim.

Celem pracy jest złożenie zestawu dystrybucyjnego z możliwością pobierania na żywo, interfejsem icewm i przeglądarką. Platformą docelową jest virtualbox.

Po co budować własną dystrybucję? Często wymagana jest ograniczona funkcjonalność przy ograniczonych zasobach. Jeszcze częściej w automatyce trzeba stworzyć firmware. Dostosowanie dystrybucji ogólnego przeznaczenia poprzez usunięcie niepotrzebnych pakietów i przekształcenie ich w oprogramowanie układowe jest bardziej pracochłonne niż tworzenie nowej dystrybucji. Korzystanie z Gentoo ma również swoje ograniczenia.

System Buildroot jest bardzo potężny, ale nic za Ciebie nie zrobi. Może jedynie umożliwić i zautomatyzować proces montażu.

Alternatywne systemy kompilacji (yocto, otwarty system kompilacji i inne) nie są brane pod uwagę ani porównywane.

Gdzie to zdobyć i jak zacząć

Strona projektu - buildroot.org. Tutaj możesz pobrać aktualną wersję i zapoznać się z instrukcją. Tam możesz skontaktować się ze społecznością, jest tam narzędzie do śledzenia błędów, listy mailowe i kanał IRC.

Buildroot obsługuje defconfigs dla płyty docelowej kompilacji. Defconfig to plik konfiguracyjny przechowujący tylko opcje, które nie mają wartości domyślnych. To on decyduje, co i w jaki sposób będzie zbierane. W tym przypadku możesz oddzielnie skonfigurować konfiguracje programów ładujących busybox, jądro Linux, uuglibc, u-boot i barebox, ale wszystkie będą powiązane z płytą docelową.
Po rozpakowaniu pobranego archiwum lub sklonowaniu z gita otrzymujemy gotowy do użycia buildroot. Więcej o strukturze katalogów przeczytasz w instrukcji, opowiem Ci o najważniejszych:

deska — katalog z plikami specyficznymi dla każdej planszy. Mogą to być skrypty do tworzenia obrazów systemu (iso, sdcart, cpio i inne), katalogu nakładek, konfiguracji jądra itp.
configs — rzeczywista defconfig płyty. Defconfig to niekompletna konfiguracja płyty. Przechowuje tylko parametry różniące się od ustawień domyślnych
dl — katalog z pobranymi kodami źródłowymi/plikami do montażu
wyjście/cel — złożony system plików powstałego systemu operacyjnego. Następnie tworzone są z niego obrazy do pobrania/instalacji
wyjście/host - narzędzia hosta do montażu
wyjście/kompilacja - zmontowane pakiety

Zespół jest konfigurowany poprzez KConfig. Ten sam system jest używany do budowy jądra Linuksa. Lista najczęściej używanych poleceń (wykonaj w katalogu buildroot):

  • make menuconfig — wywołuje konfigurację kompilacji. Możesz także użyć interfejsu graficznego (make nconfig, make xconfig, make gconfig)
  • make linux-menuconfig - wywołaj konfigurację jądra.
  • make clean - wyczyść wyniki kompilacji (wszystko zapisane na wyjściu)
  • make - zbuduj system. Nie powoduje to ponownego złożenia już zmontowanych procesów.
  • make defconfig_name - przełącz konfigurację na konkretną defconfig
  • make list-defconfigs - pokazuje listę defconfigs
  • make source - po prostu pobierz pliki instalacyjne, bez budowania.
  • make help - lista możliwych poleceń

Ważne uwagi i pomocne wskazówki

Buildroot nie odbudowuje pakietów, które zostały już zbudowane! Dlatego może zaistnieć sytuacja, w której wymagany będzie całkowity ponowny montaż.

Za pomocą polecenia można odbudować oddzielny pakiet wykonaj przebudowę nazwy pakietu. Na przykład możesz odbudować jądro Linuksa:

make linux-rebuild

Buildroot przechowuje stan dowolnego pakietu, tworząc pliki .stamp w katalogu Output/build/$packagename:

Buildroot - część 1. Informacje ogólne, złożenie minimalnego systemu, konfiguracja poprzez menu

Dlatego możesz odbudować pliki root-fs i obrazy bez konieczności przebudowywania pakietów:

rm output/build/host-gcc-final-*/.stamp_host_installed;rm -rf output/target;find output/ -name ".stamp_target_installed" |xargs rm -rf ; make

Przydatne zmienne

buildroot ma zestaw zmiennych ułatwiających konfigurację

  • $TOPDIR - katalog główny kompilacji
  • $BASEDIR - katalog WYJŚCIOWY
  • $HOST_DIR, $STAGING_DIR, $TARGET_DIR — katalogi kompilacji hosta, fs przemieszczania, docelowe katalogi kompilacji fs.
  • $BUILD_DIR - katalog z rozpakowanymi i zbudowanymi pakietami

Wizualizacja

buildroot ma funkcję wizualizacji, dzięki której możesz zbudować diagram zależności, wykres czasu kompilacji i wykres rozmiarów pakietów w ostatecznym systemie. Wyniki są w formie plików PDF (do wyboru svn, png) w katalogu Output/graph.

Przykładowe polecenia wizualizacyjne:

  • make graph-depends zbuduj drzewo zależności
  • make <pkg>-graph-depends zbuduj drzewo zależności dla konkretnego pakietu
  • BR2_GRAPH_OUT=png make graph-build wykreśl czas kompilacji z wyjściem PNG
  • make graph-size wielkość pakietu działki

Przydatne skrypty

W katalogu buildroot znajduje się podkatalog utils z przydatnymi skryptami. Przykładowo istnieje skrypt sprawdzający poprawność opisów pakietów. Może to być przydatne przy dodawaniu własnych pakietów (zrobię to później). Plik utils/readme.txt zawiera opis tych skryptów.

Stwórzmy dystrybucję akcji

Należy pamiętać, że wszystkie operacje są wykonywane w imieniu zwykłego użytkownika, a nie roota.
Wszystkie polecenia są wykonywane w katalogu głównym. Pakiet buildroot zawiera już zestaw konfiguracji dla wielu popularnych płyt i wirtualizacji.

Spójrzmy na listę konfiguracji:

Buildroot - część 1. Informacje ogólne, złożenie minimalnego systemu, konfiguracja poprzez menu

Przejdź do konfiguracji qemu_x86_64_defconfig

make qemu_x86_64_defconfig

I zaczynamy montaż

make

Kompilacja zakończyła się pomyślnie, spójrz na wyniki:

Buildroot - część 1. Informacje ogólne, złożenie minimalnego systemu, konfiguracja poprzez menu

Buildroot skompilował obrazy, które możesz uruchomić w Qemu i sprawdzić, czy działają.

qemu-system-x86_64 -kernel output/images/bzImage -hda    output/images/rootfs.ext2 -append "root=/dev/sda rw" -s -S

Rezultatem jest system działający w qemu:

Buildroot - część 1. Informacje ogólne, złożenie minimalnego systemu, konfiguracja poprzez menu

Tworzenie własnej konfiguracji płytki

Dodawanie plików tablicy

Spójrzmy na listę konfiguracji:

Buildroot - część 1. Informacje ogólne, złożenie minimalnego systemu, konfiguracja poprzez menu

Na liście widzimy pc_x86_64_efi_defconfig. Stworzymy własną tablicę kopiując ją z konfiguracji:

cp configs/pc_x86_64_bios_defconfig configs/my_x86_board_defconfig

Stwórzmy natychmiast katalog na płycie do przechowywania naszych skryptów, nakładki rootfs i innych niezbędnych plików:

mkdir board/my_x86_board

Przełącz na tę defconfig:

make my_x86_board_defconfig

Zatem teraz konfiguracja kompilacji (przechowywana w .config w katalogu głównym katalogu buildroot) odpowiada docelowej maszynie rozruchowej starszej wersji x86-64 (bios).

Skopiujmy konfigurację jądra Linux (przydatne później):

cp board/pc/linux.config board/my_x86_board/

Ustawianie parametrów kompilacji za pomocą KConfig

Zacznijmy konfigurację:

make menuconfig 

Otworzy się okno KConfig. Możliwa jest konfiguracja za pomocą interfejsu graficznego (make nconfig, make xconfig, make gconfig):

Buildroot - część 1. Informacje ogólne, złożenie minimalnego systemu, konfiguracja poprzez menu

Wchodzimy do pierwszej sekcji Opcje docelowe. Tutaj możesz wybrać docelową architekturę, dla której zostanie przeprowadzona kompilacja.

Buildroot - część 1. Informacje ogólne, złożenie minimalnego systemu, konfiguracja poprzez menu

Opcje kompilacji — dostępne są tutaj różne ustawienia kompilacji. Możesz określić katalogi z kodami źródłowymi, liczbą wątków kompilacji, kopiami lustrzanymi do pobierania kodów źródłowych i innymi ustawieniami. Zostawmy ustawienia domyślne.

Toolchain – tutaj konfiguruje się same narzędzia do budowania. Przeczytaj o nim więcej.

Buildroot - część 1. Informacje ogólne, złożenie minimalnego systemu, konfiguracja poprzez menu

Typ łańcucha narzędzi – typ używanego łańcucha narzędzi. Może to być zestaw narzędzi wbudowany w buildroot lub zewnętrzny (możesz podać katalog z już zbudowanym lub adres URL do pobrania). Istnieją dodatkowe opcje dla różnych architektur. Na przykład dla ramienia możesz po prostu wybrać wersję Linaro zewnętrznego zestawu narzędzi.

Biblioteka C – wybór biblioteki C. Od tego zależy działanie całego systemu. Zwykle używany jest glibc, który obsługuje wszystkie możliwe funkcje. Może być jednak zbyt duży dla systemu wbudowanego, dlatego często wybiera się uuglibc lub musl. Wybierzemy glibc (będzie to wymagane później, aby użyć systemd).

Serie Kernel Headers i Custom Kernel Headers – muszą odpowiadać wersji jądra, która będzie znajdować się w złożonym systemie. W przypadku nagłówków jądra możesz także określić ścieżkę do repozytorium tar lub git.

WERSJE KOMPILERA GCC – wybierz wersję kompilatora, która będzie używana do budowania
Włącz obsługę C++ – wybierz, aby budować z obsługą bibliotek C++ w systemie. Przyda nam się to w przyszłości.

Dodatkowe opcje gcc – możesz ustawić dodatkowe opcje kompilatora. Na razie tego nie potrzebujemy.

Konfiguracja systemu pozwala na ustawienie przyszłych parametrów tworzonego systemu:

Buildroot - część 1. Informacje ogólne, złożenie minimalnego systemu, konfiguracja poprzez menu

Większość punktów jest jasna z tytułu. Zwróćmy uwagę na następujące punkty:
Ścieżka do tabel użytkowników - tabela z użytkownikami do utworzenia (https://buildroot.org/downloads/manual/manual.html#makeuser-syntax).

Przykładowy plik. Użytkownik zostanie utworzony z hasłem admin, automatycznie gid/uid, /bin/sh powłoka, domyślny użytkownik grupy, członek grupy root, komentarz użytkownik Foo

[alexey@alexey-pc buildroot ]$ cat board/my_x86_board/users.txt 
user -1 user -1 =admin /home/user /bin/sh root Foo user

Katalogi nakładek głównego systemu plików - katalog nałożony na zmontowany plik docelowy-fs. Dodaje nowe pliki i zastępuje istniejące.

Niestandardowe skrypty do uruchomienia przed utworzeniem obrazów systemów plików — skrypty wykonywane bezpośrednio przed złożeniem systemu plików w obrazy. Zostawmy na razie skrypt pusty.

Przejdźmy do sekcji Jądro

Buildroot - część 1. Informacje ogólne, złożenie minimalnego systemu, konfiguracja poprzez menu

Tutaj ustawia się ustawienia jądra. Samo jądro jest konfigurowane poprzez make linux-menuconfig.
Wersję jądra możesz ustawić na różne sposoby: wybierz z oferowanych, wprowadź wersję ręcznie, określ repozytorium lub gotowy plik tar.

Konfiguracja jądra — ścieżka do konfiguracji jądra. Możesz wybrać domyślną konfigurację dla wybranej architektury lub defocnfig z Linuksa. Źródło Linuksa zawiera zestaw konfiguracji defconfig dla różnych systemów docelowych. Możesz znaleźć ten, którego potrzebujesz patrząc bezpośrednio na źródła tutaj. Na przykład w przypadku czarnej tablicy z kością beagle możesz wybierz konfigurację.

Sekcja Pakiety docelowe pozwala wybrać, które pakiety zostaną zainstalowane w budowanym systemie. Zostawmy to na razie bez zmian. Później dodamy nasze pakiety do tej listy.
Obrazy systemu plików — lista obrazów systemu plików, które zostaną zebrane. Dodaj obraz iso

Buildroot - część 1. Informacje ogólne, złożenie minimalnego systemu, konfiguracja poprzez menu

Bootloadery - wybór bootloaderów do zebrania. Wybierzmy isolinix

Buildroot - część 1. Informacje ogólne, złożenie minimalnego systemu, konfiguracja poprzez menu

Konfiguracja Systemd

Systemd staje się jednym z filarów Linuksa, obok jądra i glibc. Dlatego przeniosłem jego ustawienie do osobnego elementu.

Skonfigurowane poprzez make menuconfig, następnie Pakiety docelowe → Narzędzia systemowe → systemd. Tutaj możesz określić, które usługi systemowe zostaną zainstalowane i uruchomione podczas uruchamiania systemu.

Buildroot - część 1. Informacje ogólne, złożenie minimalnego systemu, konfiguracja poprzez menu

Zapisywanie konfiguracji systemu

Zapisujemy tę konfigurację poprzez KConfig.

Następnie zapisz nasz defconfig:

make savedefconfig

Konfiguracja jądra Linuksa

Konfiguracja jądra Linux jest wywoływana za pomocą następującego polecenia:

make linux-menuconfig

Dodajmy obsługę karty graficznej Virtualbox

Buildroot - część 1. Informacje ogólne, złożenie minimalnego systemu, konfiguracja poprzez menu

Dodajmy obsługę integracji Virtualbox Guest

Buildroot - część 1. Informacje ogólne, złożenie minimalnego systemu, konfiguracja poprzez menu

Zapisz i wyjdź. WAŻNE: konfiguracja zostanie zapisana w pliku Output/build/linux-$version/config, ale nie w board/my_x86_board/linux.config

Buildroot - część 1. Informacje ogólne, złożenie minimalnego systemu, konfiguracja poprzez menu

Dlatego musisz ręcznie skopiować konfigurację do lokalizacji przechowywania:

cp output/build/linux-4.19.25/.config board/my_x86_board/linux.config

Po czym dokonamy pełnego ponownego montażu całego systemu. buildroot nie odbudowuje tego, co zostało już zbudowane, należy ręcznie określić pakiety do przebudowy. Aby nie tracić czasu i nerwów, łatwiej jest całkowicie odbudować mały system):

make clean;make

Po zakończeniu kompilacji uruchom VirtualBox (testowany na wersjach 5.2 i 6.0) bootując z płyty CD.Parametry systemowe:

Buildroot - część 1. Informacje ogólne, złożenie minimalnego systemu, konfiguracja poprzez menu

Uruchamianie ze zmontowanego iso:

Buildroot - część 1. Informacje ogólne, złożenie minimalnego systemu, konfiguracja poprzez menu

Lista użytych materiałów

  1. Instrukcja budowania roota

Źródło: www.habr.com

Dodaj komentarz