budowanie obrazu jądra (.img), w tym ramdysku

12

Zbudowałem jądro Linuksa (3.0.1) dla mojego Raspberry Pi, wykonując następujące czynności:

1. Downloading kernel source
2. tar xvf source.tar.bz2
3. downloading arm cross compilation tool.
4. tar xvf arm-2010q1-202-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
5. setting up path for cross tool export PATH=$PATH:/home/shan/<cross tool folder>/bin/
6. after entering linux source dir make ARCH=arm versatile_defconfig (is this reliable   with raspberry pi)
7. make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
8. zImage is generated in /arch/arm/boot

Moje pytanie brzmi: jak mogę zbudować kernel.img? Myślę, że zawiera zImage + ramdysk, ale jak mogę to zbudować?

Czy ktoś może mi pomóc w tworzeniu ramdysku i spakowaniu tych dwóch do pliku kernel.img? Chcę uruchomić to jądro na moim Raspberry Pi.

Shantanu Banerjee
źródło
To wspaniałe pytanie, które mnie zaskakuje, nie zostało jeszcze zadane.
Jivings
Dlaczego używasz jądra 3.0.1? Czy to jądro waniliowe zostało znalezione na kernel.orgstronie?
Krzysztof Adamski
tak, znalazłem to na kernel.org
Shantanu Banerjee
Dodałem nowe pytanie o qemu i skompilowane jądro Raspberry Pi-2 z busybox w initramfs: raspberrypi.stackexchange.com/questions/56302/…
42n4

Odpowiedzi:

8

plik kernel.img

Podczas korzystania z jądra Linux kernel.imgnazwa 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.imgplik zapasowy nie zawiera elementu initramfswhile kernel_emergency.img.

Uwaga: Oficjalny przewodnik kompilacji jądra na wiki eLinux sugeruje, że powinieneś użyć imagetool-uncompressed.pynarzędzia do przygotowania kernel.imgpliku. Było to konieczne na początku RaspberyPi, ale obecnie bootloader może obsługiwać pliki zwykłe Imagei zImagepliki.

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.orgstronie) nie jest kompatybilna z RaspberryPi. Ponadto versatil_confignie jest dobre dla RaspberryPi, powinieneś użyć bcmrpi_defconfigzamiast tego (znajduje się w źródłach jądra kompatybilnych z RaspberryPi) lub bcmrpi_emergency_defconfigjeś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):

  1. 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_COMPILEopcję we wszystkich swoich makepoleceniach.

  2. 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ć gitnarzędzia i możesz to zrobić nawet na samym RapsberryPi): Kliknij ZIPikonę, nieco poniżej Codezakładki u góry strony. To powinno pozwolić ci pobrać najnowsze pliki źródłowe jako zipplik. 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 gitnarzę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 1argument, który uniemożliwia gitowi pobranie całej historii rozwoju (co jest ogromne):

      git clone --depth 1 git://github.com/raspberrypi/linux.git
      
  3. Użyj domyślnej konfiguracji dostarczonej przez fundację:

    cp arch/arm/configs/bcmrpi_defconfig .config
    
  4. Uruchom make oldconfigi 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
    
  5. Skompiluj jądro:

    make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi-
    
  6. Skopiuj moduły jądra do /tmp/modules:

    make ARCH=arm modules_install INSTALL_MOD_PATH=/tmp/modules
    
  7. Użyj Imagepliku jakokernel.img

  8. 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 initramfsmoż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 iniramfsobrazu, spróbuj zbudować własny. Wszystko, co powinno być potrzebne, to wskazanie pobranego katalogu przy użyciu CONFIG_INITRAMFS_SOURCEopcji konfiguracji jądra.

Uwagi końcowe

Powinieneś to zrobić w 3 krokach:

  1. Spróbuj zbudować i uruchomić jądro bez initramfspliku.
  2. Spróbuj dodać gotową initramfszawartość do jądra.
  3. Zmień tę initramfszawartość zgodnie z własnymi potrzebami.
Krzysztof Adamski
źródło
1
Świetnie napisz, ale nie powinieneś używać zip; gitwydajnie przenosi pliki i możesz użyć, depth=1aby zapobiec historii pobierania (myślę).
Alex Chamberlain
Tak, to prawda, ale próba zrobienia tego na samym RaspberryPi nie jest naprawdę dobrym pomysłem. Z drugiej strony pobieranie zip działa świetnie. Dodam też krótką notatkę na temat używania git.
Krzysztof Adamski
Kompilowanie jądra na Raspberry Pi samo w sobie jest okropnym pomysłem.
Alex Chamberlain
@AlexChamberlain: To naprawdę powolne, ale zdecydowanie możliwe (sam to zrobiłem). To trwa jedną noc, więc nie jest tak źle. Poza tym, dlaczego to takie okropne?
Krzysztof Adamski
jeśli użyję bcmrpi_emergency_defconfig, czy zawiera initramfs?
Shantanu Banerjee
0

Jeśli używasz tej samej wersji Debiana na obu, używając X-Apt, dpkg-cross itp. ... a narzędzia emdebian mogą działać bardzo dobrze.

Źródło: używane do tworzenia aplikacji c ++ dla wbudowanych systemów ARM z uruchomionym emdebianem.

James Bennet
źródło