construindo imagem do kernel (.img) incluindo ramdisk

12

Eu construí meu kernel Linux (3.0.1) para o meu Raspberry Pi com as seguintes etapas:

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

Minha pergunta é: como posso construir o kernel.img? Eu acho que ele contém zImage + ramdisk, mas como posso criar isso?

Alguém pode me orientar a fazer ramdisk e empacotar esses dois no arquivo kernel.img? Eu quero inicializar este kernel no meu Raspberry Pi.

Shantanu Banerjee
fonte
Essa é uma ótima pergunta que me surpreende ainda não ter sido feita.
Jivings
Por que você está usando o kernel 3.0.1? Este kernel de baunilha é encontrado no kernel.orgsite?
Krzysztof Adamski 15/10
sim, eu descobri que isso kernel.org
Shantanu Banerjee
Eu adicionei uma nova pergunta sobre o qemu e o kernel raspberry pi-2 com compactação cruzada com o busybox no initramfs: raspberrypi.stackexchange.com/questions/56302/…
42n4 13/16

Respostas:

8

arquivo kernel.img

Ao usar o kernel do Linux, o kernel.imgarquivo é apenas um renomeado linux/arch/arm/boot/Image. Também deve ser possível (ou pelo menos foi possível da última vez que verifiquei) usar a versão compactada deste arquivo - zImage. Pode conter integrado initramfs(ramdisk), mas não é necessário. Por exemplo, o kernel.imgarquivo de ações não contém initramfsenquanto contém kernel_emergency.img.

Nota: O guia oficial de compilação do kernel no wiki do eLinux sugere que você use a imagetool-uncompressed.pyferramenta para preparar o kernel.imgarquivo. Era necessário nos primeiros dias do RaspberyPi, mas atualmente o gerenciador de inicialização pode lidar com arquivos Imagee zImagearquivos regulares .

Problema nas fontes do kernel

O que é muito importante é que, ao criar o kernel para o RaspberryPi, você não pode simplesmente usar qualquer versão dele. Somente a versão especial que é portada para o RaspberryPi funcionará. Infelizmente, a versão atual do upstream (encontrada no kernel.orgsite) não é compatível com o RaspberryPi. Além disso, versatil_confignão é bom para o RaspberryPi, você deve usá-lo bcmrpi_defconfig(encontrado em fontes de kernel compatíveis com RaspberryPi) ou bcmrpi_emergency_defconfigse planeja usar o buildin initramfs.

Instruções de construção do kernel

O melhor lugar para pegar fontes de kernel para o RaspberryPi é no github da fundação . Você também pode encontrar algumas explicações úteis sobre como obtê-lo e como compilá-lo no wiki oficial do RasbperryPi . Aqui está minha pequena versão simplificada das etapas envolvidas (NOTA: Suponho que você queira compilar o kernel. É muito mais rápido e deve criar os mesmos resultados, mas também é possível criar o kernel nativamente no RaspberryPi):

  1. Faça o download do toolchain oficial e crie seu próprio. De qualquer maneira, presumo que esteja instalado /usr/bin/arm-linux-gnueabi-*. Se você o tiver em outro lugar, deverá alterar a CROSS_COMPILEopção em todos os seus makecomandos.

  2. Acesse o site https://github.com/raspberrypi/linux, onde você pode encontrar fontes oficiais do kernel do RapsberryPi. Você pode baixar o código de duas maneiras:

    • Como um arquivo compactado (para usar esta opção, você não precisa instalar o gitutilitário e pode fazer isso mesmo no RapsberryPi): Clique no ZIPícone, um pouco abaixo da Codeguia na parte superior do site. Isso deve permitir que você baixe os arquivos de origem como ziparquivo. Você pode usar o git para fazer isso, mas isso (como descrito no wiki) precisará de muito mais espaço e tempo. Em seguida, descompacte o arquivo para obter a árvore de origem.
    • Usando o gitutilitário (isso não funcionou para mim no RaspberryPi, pois provavelmente há uma pequena quantidade de RAM, mas deve funcionar bem em sistemas desktop) (observe o --depth 1argumento que impede o git de baixar todo o histórico do desenvolvimento (que é enorme):

      git clone --depth 1 git://github.com/raspberrypi/linux.git
      
  3. Use a configuração padrão fornecida pela fundação:

    cp arch/arm/configs/bcmrpi_defconfig .config
    
  4. Execute make oldconfige responda a algumas perguntas (deve ser correto pressionar enter em cada pergunta, deixando a resposta padrão):

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

    make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi-
    
  6. Copie os módulos do kernel para /tmp/modules:

    make ARCH=arm modules_install INSTALL_MOD_PATH=/tmp/modules
    
  7. Usar Imagearquivo comokernel.img

  8. Faça o upload de todos os módulos do diretório de /tmp/modules/lib/modules/seu computador para o /lib/modules/diretório rootfs do RaspberryPi.

Adicionando initramfs

Isso não fornece instruções sobre como criar initramfs, no entanto. Como esse é um tópico muito amplo (basicamente, você precisa criar um ambiente de espaço de usuário Linux funcional e não há realmente nenhum limite de quão complicado pode ser), não abordarei isso aqui agora. Só observarei que initramfspode ser usado de duas formas diferentes - uma autônoma, onde é um arquivo separado e o buildin, onde é integrado ao arquivo de imagem do kernel (como se estivesse kernel_emergency.img). A segunda opção deve ser suportada pelo gerenciador de inicialização RaspberryPi, mas existem rumores de que ele está quebrado na versão atual do firmware, portanto, você provavelmente deve usar a versão buildin.

A melhor maneira de começar é usar o conteúdo initramfs em funcionamento (que está sendo usado para kernel_emergency.img) baixando-o de outro repositório github da fundação e somente depois que você puder inicializar o kernel usando esta iniramfsimagem, tente criar o seu próprio. Tudo o que é necessário para isso é apontar para o diretório baixado usando a CONFIG_INITRAMFS_SOURCEopção de configuração do kernel.

Notas finais

Então você deve fazer isso em 3 etapas:

  1. Tente criar e inicializar o kernel sem initramfsarquivo.
  2. Tente adicionar initramfsconteúdo pronto ao seu kernel.
  3. Altere este initramfsconteúdo para atender às suas necessidades.
Krzysztof Adamski
fonte
1
Ótima redação, mas você não deve usar zip; gittransfere os arquivos com eficiência e você pode usar depth=1para impedir o histórico de downloads (eu acho).
Alex Chamberlain
Sim, isso é verdade, mas tentar fazer isso no próprio RaspberryPi não é uma boa ideia. O download do zip está funcionando muito bem, por outro lado. Vou adicionar uma breve nota sobre o uso do git também.
Krzysztof Adamski 15/10
Compilar o kernel no Raspberry Pi é uma péssima idéia em si.
Alex Chamberlain
@AlexChamberlain: É muito lento, mas definitivamente possível (eu mesmo fiz isso). Leva uma noite, então não é tão ruim assim. Fora isso, por que é tão horrível?
Krzysztof Adamski
se eu usar bcmrpi_emergency_defconfig ele conteria initramfs ??
Shantanu Banerjee
0

Se você estiver executando a mesma versão do Debian em ambos, usando X-Apt, dpkg-cross etc ... e as ferramentas emdebian podem funcionar muito bem.

Fonte: usada para desenvolver aplicativos c ++ para sistemas ARM incorporados executando emdebian.

James Bennet
fonte