plik kernel.img
Podczas korzystania z jądra Linux kernel.img
nazwa pliku jest zmieniana linux/arch/arm/boot/Image
. Powinno być również możliwe (lub przynajmniej ostatnim razem, gdy sprawdzałem) użycie skompresowanej wersji tego pliku - zImage
. Może zawierać zintegrowany initramfs
(ramdysk), ale nie jest wymagany. Na przykład kernel.img
plik zapasowy nie zawiera elementu initramfs
while kernel_emergency.img
.
Uwaga: Oficjalny przewodnik kompilacji jądra na wiki eLinux sugeruje, że powinieneś użyć imagetool-uncompressed.py
narzędzia do przygotowania kernel.img
pliku. Było to konieczne na początku RaspberyPi, ale obecnie bootloader może obsługiwać pliki zwykłe Image
i zImage
pliki.
Problem ze źródłami jądra
Bardzo ważne jest to, że budując jądro dla RaspberryPi, nie można po prostu użyć żadnej jego wersji. Działa tylko specjalna wersja przeniesiona do RaspberryPi. Niestety obecna wersja upstream (znaleziona na kernel.org
stronie) nie jest kompatybilna z RaspberryPi. Ponadto versatil_config
nie jest dobre dla RaspberryPi, powinieneś użyć bcmrpi_defconfig
zamiast tego (znajduje się w źródłach jądra kompatybilnych z RaspberryPi) lub bcmrpi_emergency_defconfig
jeśli planujesz używać buildin initramfs
.
Instrukcje budowania jądra
Najlepszym miejscem do pobierania źródeł jądra dla RaspberryPi jest github . Możesz również znaleźć przydatne wyjaśnienie, jak je zdobyć i jak skompilować na oficjalnej wiki RasbperryPi . Oto moja mała uproszczona wersja opisanych kroków (UWAGA: Zakładam, że chcesz skompilować jądro krzyżowo. Jest ono znacznie szybsze i powinno dawać takie same wyniki, ale możliwe jest także budowanie jądra natywnie na RaspberryPi):
Pobierz oficjalny zestaw narzędzi do tworzenia własnych. W każdym razie zakładam, że jest zainstalowany /usr/bin/arm-linux-gnueabi-*
. Jeśli masz go w innym miejscu, powinieneś zmienić CROSS_COMPILE
opcję we wszystkich swoich make
poleceniach.
Przejdź do https://github.com/raspberrypi/linux strony, na której można znaleźć oficjalne źródła jądra RapsberryPi. Możesz pobrać kod na dwa sposoby:
- Jako plik skompresowany (aby skorzystać z tej opcji, nie musisz instalować
git
narzędzia i możesz to zrobić nawet na samym RapsberryPi): Kliknij ZIP
ikonę, nieco poniżej Code
zakładki u góry strony. To powinno pozwolić ci pobrać najnowsze pliki źródłowe jako zip
plik. Możesz użyć git, aby to zrobić, ale to (jak opisano na wiki) będzie wymagało dużo więcej miejsca i czasu. Następnie rozpakuj plik, aby uzyskać drzewo źródłowe.
Korzystanie z git
narzędzia (to nie działało dla mnie na RaspberryPi, ponieważ prawdopodobnie jest mała ilość pamięci RAM, ale powinno działać OK na komputerach stacjonarnych (zauważ --depth 1
argument, który uniemożliwia gitowi pobranie całej historii rozwoju (co jest ogromne):
git clone --depth 1 git://github.com/raspberrypi/linux.git
Użyj domyślnej konfiguracji dostarczonej przez fundację:
cp arch/arm/configs/bcmrpi_defconfig .config
Uruchom make oldconfig
i odpowiedz na kilka pytań (w każdym pytaniu powinno być OK, pozostawiając domyślną odpowiedź):
make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig
Skompiluj jądro:
make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi-
Skopiuj moduły jądra do /tmp/modules
:
make ARCH=arm modules_install INSTALL_MOD_PATH=/tmp/modules
Użyj Image
pliku jakokernel.img
Prześlij wszystkie moduły z /tmp/modules/lib/modules/
komputera do /lib/modules/
katalogu na rootfs RaspberryPi.
Dodawanie initramfs
Nie zawiera to jednak instrukcji tworzenia initramfs
. Ponieważ jest to bardzo szeroki temat (w zasadzie musisz stworzyć działające środowisko przestrzeni użytkownika Linuxa, tak naprawdę nie ma ograniczenia, jak skomplikowane może być), nie omówię teraz tego tutaj. Zwrócę tylko uwagę, że initramfs
można go używać w dwóch różnych formach - samodzielnej, w której jest to osobny plik i wbudowany, w którym jest zintegrowany z plikiem obrazu jądra (tak jak w nim jest kernel_emergency.img
). Druga opcja powinna być obsługiwana przez bootloader RaspberryPi, ale istnieją pogłoski , że jest zepsuta w bieżącej wersji oprogramowania, więc prawdopodobnie powinieneś użyć wersji wbudowanej.
Najlepszym sposobem na rozpoczęcie jest użycie działającej zawartości initramfs (która jest używana w pliku kernel_emergency.img) poprzez pobranie jej z innego podstawowego repozytorium github i dopiero po uruchomieniu jądra przy użyciu tego iniramfs
obrazu, spróbuj zbudować własny. Wszystko, co powinno być potrzebne, to wskazanie pobranego katalogu przy użyciu CONFIG_INITRAMFS_SOURCE
opcji konfiguracji jądra.
Uwagi końcowe
Powinieneś to zrobić w 3 krokach:
- Spróbuj zbudować i uruchomić jądro bez
initramfs
pliku.
- Spróbuj dodać gotową
initramfs
zawartość do jądra.
- Zmień tę
initramfs
zawartość zgodnie z własnymi potrzebami.