compilazione dell'immagine del kernel (.img) incluso ramdisk


12

Ho creato il mio kernel Linux (3.0.1) per il mio Raspberry Pi con questi passaggi:

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

La mia domanda è: come posso compilare kernel.img? Penso che contenga zImage + ramdisk ma come posso costruirlo?

Qualcuno può guidarmi a fare ramdisk e comprimere questi due nel file kernel.img? Voglio avviare questo kernel sul mio Raspberry Pi.


Questa è un'ottima domanda che mi sorprende non è ancora stata posta.
Jivings,

Perché stai usando il kernel 3.0.1? Questo kernel vanilla è stato trovato sul kernel.orgsito?
Krzysztof Adamski,

sì, l'ho trovato da kernel.org
Shantanu Banerjee il

Ho aggiunto una nuova domanda su qemu e il kernel raspberry pi-2 cross-compilato con busybox in initramfs: raspberrypi.stackexchange.com/questions/56302/…
42n4

Risposte:


8

file kernel.img

Quando si utilizza il kernel Linux, il kernel.imgfile viene semplicemente rinominato linux/arch/arm/boot/Image. Dovrebbe anche essere possibile (o almeno è stato possibile l'ultima volta che ho controllato) utilizzare la versione compressa di questo file - zImage. Può contenere integrato initramfs(ramdisk) ma non è necessario. Ad esempio, il kernel.imgfile di scorta non contiene initramfswhile kernel_emergency.img.

Nota: la guida ufficiale alla compilazione del kernel nella wiki di eLinux suggerisce di usare lo imagetool-uncompressed.pystrumento per preparare il kernel.imgfile. Era necessario nei primi giorni di RaspberyPi ma oggi il bootloader può gestire file regolari Imagee zImage.

Problema delle fonti del kernel

Ciò che è molto importante è che quando si crea il kernel per RaspberryPi, non è possibile utilizzarne solo una versione. Funzionerà solo la versione speciale trasferita su RaspberryPi. Sfortunatamente, l'attuale versione upstream (disponibile sul kernel.orgsito) non è compatibile con RaspberryPi. Inoltre, versatil_confignon va bene per RaspberryPi, dovresti bcmrpi_defconfiginvece usarlo (disponibile sui sorgenti del kernel compatibili con RaspberryPi) o bcmrpi_emergency_defconfigse hai intenzione di usare buildin initramfs.

Istruzioni per la compilazione del kernel

Il posto migliore per prendere i sorgenti del kernel per RaspberryPi è su github di fondazione . Puoi anche trovare alcune spiegazioni utili su come ottenerlo e come compilarlo sul wiki ufficiale di RasbperryPi . Ecco la mia piccola versione semplificata dei passaggi coinvolti (NOTA: suppongo che tu voglia compilare il kernel in modo incrociato. È molto più veloce e dovresti creare gli stessi risultati ma è anche possibile costruire il kernel nativamente su RaspberryPi):

  1. Scarica la toolchain ufficiale per crearne una tua. In ogni caso, suppongo che sia installato /usr/bin/arm-linux-gnueabi-*. Se lo hai in un altro posto, dovresti cambiare l' CROSS_COMPILEopzione in tutti i tuoi makecomandi.

  2. Vai al sito https://github.com/raspberrypi/linux dove puoi trovare fonti ufficiali del kernel RapsberryPi. Puoi scaricare il codice in due modi:

    • Come file compresso (per utilizzare questa opzione non è necessario installare l' gitutilità e puoi farlo anche su RapsberryPi stesso): fai clic ZIPsull'icona, un po 'sotto la Codescheda nella parte superiore del sito. Ciò dovrebbe consentirti di scaricare file sorgente di lates come zipfile. Puoi usare git per farlo, ma quello (come descritto nel wiki) richiederà molto più spazio e tempo. Quindi decomprimere il file per ottenere l'albero dei sorgenti.
    • Uso gitdell'utilità (questo non ha funzionato per me su RaspberryPi poiché probabilmente c'è una piccola quantità di RAM ma dovrebbe funzionare bene sui sistemi desktop (nota l' --depth 1argomento che impedisce a Git di scaricare l'intera cronologia dello sviluppo (che è enorme):

      git clone --depth 1 git://github.com/raspberrypi/linux.git
      
  3. Usa la configurazione predefinita fornita dalla fondazione:

    cp arch/arm/configs/bcmrpi_defconfig .config
    
  4. Esegui make oldconfige rispondi ad alcune domande (dovrebbe essere ok premere invio in ogni domanda lasciando la risposta predefinita):

    make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig
    
  5. Compilare il kernel:

    make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi-
    
  6. Copia i moduli del kernel in /tmp/modules:

    make ARCH=arm modules_install INSTALL_MOD_PATH=/tmp/modules
    
  7. Usa il Imagefile comekernel.img

  8. Carica tutti i moduli da /tmp/modules/lib/modules/nel tuo computer nella /lib/modules/directory sui tuoi rootfs RaspberryPi.

Aggiunta di initramfs

Questo non fornisce istruzioni su come creare initramfs, tuttavia. Dal momento che questo è un argomento molto ampio (in pratica, devi creare un ambiente operativo per utenti Linux funzionante e non c'è davvero alcun limite su quanto possa essere complicato), non lo tratterò qui ora. Noterò solo che initramfspuò essere utilizzato in due forme diverse: una autonoma, in cui è un file separato e buildin in cui è integrato con il file di immagine del kernel (come se fosse kernel_emergency.img). La seconda opzione dovrebbe essere supportata dal bootloader di RaspberryPi ma ci sono alcune voci secondo cui è rotta sulla versione corrente del firmware, quindi probabilmente dovresti usare la versione buildin.

Il modo migliore per iniziare è usare il contenuto funzionante di initramfs (che viene usato per kernel_emergency.img) scaricandolo da un altro repository github di base e solo dopo aver avviato il kernel usando questa iniramfsimmagine, prova a crearne uno tuo. Tutto ciò che dovrebbe essere necessario per questo è puntare alla directory scaricata usando l' CONFIG_INITRAMFS_SOURCEopzione di configurazione del kernel.

Note finali

Quindi dovresti farlo in 3 passaggi:

  1. Prova a initramfscompilare e avviare il kernel senza file.
  2. Prova ad aggiungere initramfscontenuti pronti al tuo kernel.
  3. Modifica questo initramfscontenuto in base alle tue esigenze.

1
Ottimo scrivere, ma non dovresti usare zip; gittrasferisce i file in modo efficiente e puoi usarlo depth=1per impedire il download della cronologia (credo).
Alex Chamberlain,

Sì, questo è vero, ma provare a farlo su RaspberryPi non è una buona idea. Il download di zip funziona benissimo, d'altra parte. Aggiungerò anche una breve nota sull'uso di git.
Krzysztof Adamski,

Compilare il kernel su Raspberry Pi è un'idea terribile in sé.
Alex Chamberlain,

@AlexChamberlain: è molto lento ma sicuramente possibile (l'ho fatto da solo). Ci vuole una notte, quindi non è poi così male. A parte questo, perché è così terribile?
Krzysztof Adamski,

se uso bcmrpi_emergency_defconfig conterrà initramfs ??
Shantanu Banerjee,

0

Se state eseguendo la stessa versione di Debian su entrambi, usando X-Apt, dpkg-cross ecc ... e gli strumenti di emdebian possono funzionare molto bene.

Fonte: utilizzato per sviluppare app c ++ per sistemi ARM incorporati che eseguono emdebian.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.