arquivo kernel.img
Ao usar o kernel do Linux, o kernel.img
arquivo é 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.img
arquivo de ações não contém initramfs
enquanto 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.py
ferramenta para preparar o kernel.img
arquivo. Era necessário nos primeiros dias do RaspberyPi, mas atualmente o gerenciador de inicialização pode lidar com arquivos Image
e zImage
arquivos 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.org
site) não é compatível com o RaspberryPi. Além disso, versatil_config
não é bom para o RaspberryPi, você deve usá-lo bcmrpi_defconfig
(encontrado em fontes de kernel compatíveis com RaspberryPi) ou bcmrpi_emergency_defconfig
se 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_COMPILE
opção em todos os seus make
comandos.
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
git
utilitário e pode fazer isso mesmo no RapsberryPi): Clique no ZIP
ícone, um pouco abaixo da Code
guia na parte superior do site. Isso deve permitir que você baixe os arquivos de origem como zip
arquivo. 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 git
utilitá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 1
argumento 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 oldconfig
e 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 Image
arquivo 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 initramfs
pode 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 iniramfs
imagem, tente criar o seu próprio. Tudo o que é necessário para isso é apontar para o diretório baixado usando a CONFIG_INITRAMFS_SOURCE
opção de configuração do kernel.
Notas finais
Então você deve fazer isso em 3 etapas:
- Tente criar e inicializar o kernel sem
initramfs
arquivo.
- Tente adicionar
initramfs
conteúdo pronto ao seu kernel.
- Altere este
initramfs
conteúdo para atender às suas necessidades.