Wstęp
Jak zostało wspomniane we wprowadzeniu posiadam płytki BeagleBone Black oraz Raspberry Pi 4. Nie będziemy przygotowywać własnego systemu dla tych płytek bo jesteśmy leniwi. Użyjemy Debiana dla BBB oraz Raspberry Pi OS dla RPi4. Dwie kolejne sekcje prezentują jak przygotować sobie środowisko dla obu płytek więc jeśli jesteś zainteresowany jedną z nich przejdź do odpowiedniej sekcji.
Kompilatory
Aby budować moduły na inną architekturę sprzętową niż twój komputer potrzebujesz odpowiednich kompilatorów. Możesz je pobrać np. z repozytoriów swojego systemu. W przypadku dystrybucji bazujących na Debianie możesz zainstalować następujące pakiety:
- gcc-arm-linux-gnueabihf w przypadku użycia BBB
- gcc-aarch64-linux-gnu w przypadku użycia RPi4
BeagleBone Black
Jak zostało wspomniane we wstępie będziemy używać Debiana. Zatem pobierz obraz systemu z tej strony:
wget https://debian.beagleboard.org/images/bone-debian-10.3-iot-armhf-2020-04-06-4gb.img.xz
Jak widać po powyższym linku ja używam wersji 10.3 dla IoT zbudowanej 6 kwietnia 2020. Zainstaluj pobrany obraz na karcie uSD używanej przez BBB. W przypadku systemu Linux Mint wystarczy dwukrotnie kliknąć na pobrany obraz, uruchomi to program odzyskiwanie dysku. Być może w innych dystrybucjach będziesz musiał ręcznie otworzyć ten plik w programie „Zapisywaniu obrazów dysków”. Instalacja obrazu potrwa kilka minut. Zanim uruchomisz instalację systemu upewnij się, że jako miejsce do zapisu wybrałeś swoją kartę pamięci.
Aby zbudować moduły na właśnie zainstalowany system musimy mieć źródła kernela na swoim komputerze, ale nie może to być byle jaki kernel, chcemy taki sam kernel jaki jest zainstalowany na naszej płytce. Aby sprawdzić jaki kernel jest używany podłącz się do BBB za pomocą UARTa i wykonaj komendę:
uname -a
Linux beaglebone 4.19.94-ti-r42 #1buster SMP PREEMPT Tue Mar 31 19:38:29 UTC 2020 armv7l GNU/Linux
W powyższym przykładzie widać, że mój system ma wersję 4.19.94-ti-r42. Pobierzmy zatem taką wersję z repozytorium beagleboard/linux:
wget https://github.com/beagleboard/linux/archive/refs/tags/4.19.94-ti-r42.zip
Przy pobraniu skorzystałem z odpowiedniego tagu. Gdy paczka zostanie pobrana rozpakuj ją. Po pobraniu źródeł należy przebudować kod. Do zbudowania kernela użyjemy konfiguracji bb.org_defconfig:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bb.org_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4
Nie potrzebujemy nic zmieniać w konfiguracji. Kompilacja potrwa kilka minut. W następnej lekcji wykorzystamy przebudowane źródła do kompilacji pierwszego modułu.
Raspberry Pi 4
Jak zostało wspomniane we wstępie będziemy używać Raspberry Pi OS. Pobierz zatem obraz z tej strony:
wget https://downloads.raspberrypi.org/raspios_lite_armhf/images/raspios_lite_armhf-2021-05-28/2021-05-07-raspios-buster-armhf-lite.zip
Ja używam wersji Lite ponieważ nie będzie nam potrzebny interfejs graficzny.
Aby zainstalować system rozpakuj pobraną paczkę. W przypadku Linuksa Mint do instalacji można wykorzystać program „Zapisywanie obrazów dysków”. Instalacja systemu potrwa kilka minut. Zanim zatwierdzisz instalację upewnij się, że jako miejsce zapisu wybrałeś swoją kartę pamięci.
Po instalacji zmienimy jeszcze nieco ustawienia. Otwórz plik config.txt znajdujący się na partycji boot i dodaj do niego następujące linijki:
enable_uart=1
arm_64bit=1
Dzięki temu aktywowaliśmy UART oraz włączyliśmy tryb 64-bitowy. Jak już mamy tyle bitów to wykorzystujmy wszystkie :). Trzeba jeszcze zmodyfikować plik cmdline.txt do następującej postaci:
console=ttyS0,115200 root=PARTUUID=923ca0ae-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
Jedyne co się zmienia to parametr console, reszta pozostaje bez zmian. PARTUUID może się oczywiście różnić w twoim przypadku. Teraz możesz uruchomić system, pierwsze uruchomienie potrwa chwilę.
Teraz potrzebujemy mieć kernel na naszym komputerze, ale nie byle jaki kernel, musimy mieć taki sam kernel jaki jest zainstalowany w systemie na RPi4. Z RPi4 jest trochę lipa, mi osobiście nie udało się zbudować takiego samego kernela jaki jest używany przes RPi OS, pomimo że użyłem dokładnie tej konfiguracji, użyłem tej samej rewizji i tej samej wersji kompilatora, nie wiem co poszło nie tak… Dlatego aby uniknąć problemów z modułami zbudujemy własny kernel, którym zastąpimy kernel na RPi4.
Zacznijmy od pobrania kodu źródłowego:
git clone --depth 1 https://github.com/raspberrypi/linux.git
Teraz potrzebujemy konfiguracji. Użyjemy tej samej konfiguracji kernela, którą możemy zdobyć na naszym RPi OS. Podłącz się do RPi4 za pomocą UARTa i wykonaj następującą komendę na nim:
modprobe configs
Ta komenda spowoduje pojawienie się pliku /proc/config.gz, plik ten zawiera konfiguracje z którą został zbudowany używany kernel. Prześlij ten na swój komputer np. za pomocą scp i rozpakuj go. Tak otrzymaną konfigurację umieść w katalogu arch/arm64/config wewnątrz pobranego repozytorium, możesz ją nazwać np. rpios_defconfig. Teraz możemy przebudować kernel:
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- KERNEL=kernel8 rpios_defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- KERNEL=kernel8 -j4
Kompilacja chwilę potrwa. Po kompilacji podłącz kartę pamięci do swojego komputera. Zapisz zbudowany kernel na partycji boot:
cp arch/arm64/boot/Image /media/user/boot/kernel8.img
Oczywiście jeśli chcesz możesz zachować oryginalny kernel na karcie np. poprzez zmianę jego nazwy.
Aby system działał w pełni prawidłowo trzeba jeszcze zainstalować zbudowane moduły na karcie SD na partycji rootfs:
sudo make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- KERNEL=kernel8 INSTALL_MOD_PATH=/media/user/rootfs/ modules_install
System jest gotowy, możesz go uruchomić, wszystko powinno na nim działać tak jak poprzednio. W następnej lekcji wykorzystamy przebudowane źródła do kompilacji pierwszego modułu.