Buildroot - część 2. Tworzenie konfiguracji płytki; przy użyciu zewnętrznego drzewa, nakładki rootfs, skryptów po kompilacji

W tej sekcji przyjrzę się niektórym opcjom dostosowywania, których potrzebowałem. To nie jest pełna lista tego, co oferuje buildroot, ale są one dość funkcjonalne i nie wymagają ingerencji w same pliki buildroot.

Korzystanie z mechanizmu ZEWNĘTRZNEGO do personalizacji

W poprzednim artykule Przyjrzeliśmy się prostemu przykładowi dodania własnej konfiguracji poprzez dodanie defconfig płyty i niezbędnych plików bezpośrednio do katalogu Buildroot.

Ale ta metoda nie jest zbyt wygodna, szczególnie podczas aktualizacji buildroot. Istnieje mechanizm pozwalający rozwiązać ten problem drzewo zewnętrzne. Jego istotą jest to, że możesz przechowywać board, configs, package i inne katalogi w oddzielnym katalogu (na przykład używam katalogu patche do stosowania łatek do pakietów, więcej szczegółów w osobnej sekcji), a sam buildroot doda je do tych w jego katalog.

Uwaga: możesz nakładać na siebie kilka zewnętrznych drzew jednocześnie, przykład znajduje się w instrukcji buildroot

Stwórzmy katalog my_tree, znajdujący się obok katalogu buildroot i przenieśmy tam naszą konfigurację. Plik wyjściowy powinien mieć następującą strukturę pliku:

[alexey@alexey-pc my_tree]$ tree
.
├── board
│   └── my_x86_board
│       ├── bef_cr_fs_img.sh
│       ├── linux.config
│       ├── rootfs_overlay
│       └── users.txt
├── Config.in
├── configs
│   └── my_x86_board_defconfig
├── external.desc
├── external.mk
├── package
└── patches

6 directories, 7 files

Jak widać, ogólnie struktura powtarza strukturę buildroot.

katalog deska zawiera pliki specyficzne dla każdej płytki w naszym przypadku:

  • bef_cr_fs_img.sh to skrypt, który zostanie wykonany po zbudowaniu docelowego systemu plików, ale przed spakowaniem go do obrazów. Wykorzystamy go w przyszłości
  • linux.config - konfiguracja jądra
  • rootfs_overlay - katalog do nałożenia na docelowy system plików
  • users.txt - plik opisujący użytkowników, których należy utworzyć

katalog configs zawiera defconfig naszych płyt. Mamy tylko jeden.

Pakiet - katalog z naszymi pakietami. Początkowo buildroot zawiera opisy i zasady budowania ograniczonej liczby pakietów. Później dodamy tutaj menedżera okien icewm i graficznego menedżera logowania Slim.
Łatki — umożliwia wygodne przechowywanie poprawek dla różnych pakietów. Więcej szczegółów w osobnej sekcji poniżej.
Teraz musimy dodać pliki opisu dla naszego drzewa zewnętrznego. Odpowiadają za to 3 pliki: external.desc, Config.in, external.mk.

zewnętrzne.desc zawiera aktualny opis:

[alexey@alexey-pc my_tree]$ cat external.desc 
name: my_tree
desc: My simple external-tree for article

Pierwsza linia to tytuł. W przyszłości buildroot utwórz zmienną $(BR2_EXTERNAL_MY_TREE_PATH), którego należy użyć podczas konfigurowania złożenia. Na przykład ścieżkę do pliku użytkownika można ustawić w następujący sposób:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txt

Druga linia to krótki, czytelny dla człowieka opis.

Config.in, external.mk — pliki opisujące dodane pakiety. Jeśli nie dodasz własnych pakietów, pliki te można pozostawić puste. Na razie właśnie to zrobimy.
Teraz mamy gotowe drzewo zewnętrzne, zawierające konfigurację defconfig naszej płyty i potrzebne jej pliki. Przejdźmy do katalogu buildroot i określmy, czy chcemy używać drzewa zewnętrznego:

[alexey@alexey-pc buildroot]$ make BR2_EXTERNAL=../my_tree/ my_x86_board_defconfig
#
# configuration written to /home/alexey/dev/article/ramdisk/buildroot/.config
#
[alexey@alexey-pc buildroot]$ make menuconfig

W pierwszym poleceniu używamy argumentu BR2_EXTERNAL=../moje_drzewo/, wskazujące użycie zewnętrznego drzewa. Możesz określić kilka zewnętrznych-drzew do użycia w tym samym czasie. W tym przypadku wystarczy to zrobić tylko raz, po czym tworzony jest plik Output/.br-external.mk, który przechowuje informacje o używanym drzewie zewnętrznym:

[alexey@alexey-pc buildroot]$ cat output/.br-external.mk 
#
# Automatically generated file; DO NOT EDIT.
#

BR2_EXTERNAL ?= /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
BR2_EXTERNAL_NAMES = 
BR2_EXTERNAL_DIRS = 
BR2_EXTERNAL_MKS = 

BR2_EXTERNAL_NAMES += my_tree
BR2_EXTERNAL_DIRS += /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
BR2_EXTERNAL_MKS += /home/alexey/dev/article/ramdisk/my_small_linux/my_tree/external.mk
export BR2_EXTERNAL_my_tree_PATH = /home/alexey/dev/article/ramdisk/my_small_linux/my_tree
export BR2_EXTERNAL_my_tree_DESC = My simple external-tree for article

Ważny! Ścieżki w tym pliku będą bezwzględne!

W menu pojawiła się pozycja Opcje zewnętrzne:

Buildroot - część 2. Tworzenie konfiguracji płytki; przy użyciu zewnętrznego drzewa, nakładki rootfs, skryptów po kompilacji

To podmenu będzie zawierać nasze pakiety z naszego zewnętrznego drzewa. Ta sekcja jest obecnie pusta.

Teraz ważniejsze jest dla nas przepisanie niezbędnych ścieżek do korzystania z drzewa zewnętrznego.

Należy pamiętać, że w sekcji Opcje kompilacji → Lokalizacja zapisu konfiguracji buildroot pojawi się bezwzględna ścieżka do zapisanej konfiguracji defconfig. Powstaje w momencie określenia użycia extgernal_tree.

Poprawimy także ścieżki w sekcji Konfiguracja systemu. Dla tabeli z utworzonymi użytkownikami:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/users.txt

W sekcji Jądro zmień ścieżkę do konfiguracji jądra:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/linux.config

Teraz nasze pliki z naszego zewnętrznego drzewa zostaną użyte podczas montażu. Przenosząc się do innego katalogu lub aktualizując buildroot, będziemy mieli minimum problemów.

Dodanie nakładki root fs:

Mechanizm ten pozwala łatwo dodawać/zamieniać pliki w docelowym systemie plików.
Jeśli plik znajduje się w nakładce root fs, ale nie w miejscu docelowym, zostanie dodany
Jeśli plik znajduje się w nakładce root fs i w miejscu docelowym, zostanie zastąpiony.
Najpierw ustawmy ścieżkę do katalogu głównego nakładki fs. Odbywa się to w sekcji Konfiguracja systemu → Katalogi nakładek głównego systemu plików:

$(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/rootfs_overlay/

Utwórzmy teraz dwa pliki.

[alexey@alexey-pc my_small_linux]$ cat my_tree/board/my_x86_board/rootfs_overlay/etc/hosts 
127.0.0.1   localhost
127.0.1.1   my_small_linux
8.8.8.8     google-public-dns-a.google.com.
[alexey@alexey-pc my_small_linux]$ cat my_tree/board/my_x86_board/rootfs_overlay/new_file.txt 
This is new file from overlay

Pierwszy plik (my_tree/board/my_x86_board/rootfs_overlay/etc/hosts) zastąpi plik /etc/hosts w gotowym systemie. Drugi plik (cat moje_tree/board/my_x86_board/rootfs_overlay/new_file.txt) zostanie dodany.

Zbieramy i sprawdzamy:

Buildroot - część 2. Tworzenie konfiguracji płytki; przy użyciu zewnętrznego drzewa, nakładki rootfs, skryptów po kompilacji

Wykonywanie skryptów dostosowywania na różnych etapach montażu systemu

Często trzeba wykonać pewne prace w docelowym systemie plików, zanim zostanie on spakowany w obrazy.

Można to zrobić w sekcji Konfiguracja systemu:

Buildroot - część 2. Tworzenie konfiguracji płytki; przy użyciu zewnętrznego drzewa, nakładki rootfs, skryptów po kompilacji

Pierwsze dwa skrypty są wykonywane po zbudowaniu docelowego systemu plików, ale przed spakowaniem go do obrazów. Różnica polega na tym, że skrypt fakeroot jest wykonywany w kontekście fakeroot, co symuluje pracę użytkownika root.

Ostatni skrypt jest wykonywany po utworzeniu obrazów systemu. Możesz w nim wykonać dodatkowe czynności, np. skopiować niezbędne pliki na serwer NFS lub utworzyć obraz oprogramowania sprzętowego swojego urządzenia.

Jako przykład utworzę skrypt, który zapisze wersję i datę kompilacji do /etc/.
Najpierw wskażę ścieżkę do tego pliku w moim drzewie zewnętrznym:

Buildroot - część 2. Tworzenie konfiguracji płytki; przy użyciu zewnętrznego drzewa, nakładki rootfs, skryptów po kompilacji

A teraz sam skrypt:

[alexey@alexey-pc buildroot]$ cat ../my_tree/board/my_x86_board/bef_cr_fs_img.sh 
#!/bin/sh
echo "my small linux 1.0 pre alpha" > output/target/etc/mysmalllinux-release
date >> output/target/etc/mysmalllinux-release

Po złożeniu plik ten będzie widoczny w systemie.

W praktyce skrypt może stać się duży. Dlatego w prawdziwym projekcie wybrałem bardziej zaawansowaną trasę:

  1. Stworzyłem katalog (moje_tree/board_my_x86_board/inside_fakeroot_scripts), w którym znajdują się skrypty do wykonania, wraz z numerami seryjnymi. Na przykład 0001-add-my_small_linux-version.sh, 0002-clear-apache-root-dir.sh
  2. Napisałem skrypt (my_tree/board_my_x86_board/run_inside_fakeroot.sh), który przechodzi przez ten katalog i sekwencyjnie wykonuje zawarte w nim skrypty
  3. Określono ten skrypt w ustawieniach płyty w Konfiguracja systemu -> Niestandardowe skrypty do uruchomienia w środowisku fakeroot ($(BR2_EXTERNAL_my_tree_PATH)/board/my_x86_board/run_inside_fakeroot.sh)

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

Dodaj komentarz