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):
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.
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
Use a configuração padrão fornecida pela fundação:
cp arch/arm/configs/bcmrpi_defconfig .config
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
Compile o kernel:
make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi-
Copie os módulos do kernel para /tmp/modules:
make ARCH=arm modules_install INSTALL_MOD_PATH=/tmp/modules
Usar Imagearquivo comokernel.img
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:
- Tente criar e inicializar o kernel sem
initramfsarquivo.
- Tente adicionar
initramfsconteúdo pronto ao seu kernel.
- Altere este
initramfsconteúdo para atender às suas necessidades.