Os documentos do kernel explicam como compactar uma imagem no próprio kernel. Do kernel.org :
O que é rootfs?
Rootfs
é uma instância especial de ramfs
(ou tmpfs
, se estiver ativada), que está
sempre presente nos sistemas 2.6. Você não pode desmontarrootfs
pelo mesmo motivo que não pode matar o processo init; em vez de ter um código especial para procurar e manipular uma lista vazia, é menor e mais simples para o kernel garantir que determinadas listas não possam ficar vazias.
A maioria dos sistemas simplesmente monta outro sistema de arquivos rootfs
e o ignora. A quantidade de espaço que uma instância vazia de ramfs ocupa é pequena.
Se CONFIG_TMPFS estiver ativado, rootfs
será usado em tmpfs
vez de ramfs
por padrão. Para forçar ramfs
, adicione "rootfstype=ramfs"
à linha de comando do kernel.
O que é o initramfs?
Todos os kernels 2.6 do Linux contêm um arquivo compactado em"cpio"
formatogzip, que é extraído rootfs
quando o kernel é inicializado. Após a extração, o kernel verifica serootfs
contém um arquivoe"init"
, se for o caso, executa-o como PID 1. Se encontrado, esseinit
processo é responsável por elevar o sistema até o fim, incluindo a localização e montagem do dispositivo raiz real ( caso existam). Serootfs
não contiver uminit
programa após acpio
extração do arquivoincorporado, o kernel recorrerá ao código mais antigo para localizar e montar uma partição raiz e, em seguida, executar alguma variante/sbin/init
disso.
Tudo isso difere do antigo initrd de várias maneiras:
O initrd antigo sempre foi um arquivo separado, enquanto o arquivo initramfs está vinculado à imagem do kernel do linux. (O diretório linux - * / usr é dedicado à geração desse arquivo durante a construção.)
O arquivo initrd antigo era uma imagem do sistema de arquivos compactada com gzip (em algum formato de arquivo, como ext2, que precisava de um driver embutido no kernel), enquanto o novo arquivo initramfs é um arquivo cpio compactado com gzip (como tar apenas mais simples, consulte cpio (1) e Documentação / early-userspace / buffer-format.txt). O código de extração cpio do kernel não é apenas extremamente pequeno, é também __init texto e dados que podem ser descartados durante o processo de inicialização.
O programa executado pelo antigo initrd (que foi chamado / initrd, não / init) fez algumas configurações e depois retornou ao kernel, enquanto o programa init do initramfs não deve retornar ao kernel. (Se o / init precisar transferir o controle, ele poderá sobrescrever / com um novo dispositivo raiz e executar outro programa init. Consulte o utilitário switch_root, abaixo.)
Ao alternar outro dispositivo raiz, o initrd pivot_root e desmontar o ramdisk. Mas initramfs é rootfs: você não pode pivot_root rootfs nem desmontá-lo. Em vez disso, exclua tudo do rootfs para liberar espaço (encontre -xdev / -exec rm '{}' ';'), substitua o rootfs pela nova raiz (cd / newmount; mount --move. /; Chroot.), conecte stdin / stdout / stderr ao novo / dev / console e execute o novo init.
Como esse é um processo notavelmente persnickety (e envolve a exclusão de comandos antes que você possa executá-los), o pacote klibc introduziu um programa auxiliar (utils / run_init.c) para fazer tudo isso por você. A maioria dos outros pacotes (como o busybox) nomeou esse comando "switch_root".
Preenchendo initramfs:
O processo de compilação do kernel 2.6 sempre cria um arquivo initramfs no formato cpio com gzip e o vincula ao binário resultante do kernel. Por padrão, esse arquivo está vazio (consumindo 134 bytes em x86).
A opção de configuração CONFIG_INITRAMFS_SOURCE (em Configuração geral no menuconfig,
e viver em usr/Kconfig
) pode ser usado para especificar uma fonte para o
initramfs
arquivo, que irá automaticamente ser incorporado no binário resultante. Esta opção pode apontar para um arquivo * existente compactado com gzip cpio
*, um diretório que contém arquivos a serem arquivados ou uma especificação de arquivo de texto , como no exemplo a seguir:
dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
nod /dev/loop0 644 0 0 b 7 0
dir /bin 755 1000 1000
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0
dir /proc 755 0 0
dir /sys 755 0 0
dir /mnt 755 0 0
file /init initramfs/init.sh 755 0 0
Execute " usr/gen_init_cpio
" (após a compilação do kernel) para obter uma mensagem de uso documentando o formato de arquivo acima.
Uma vantagem do arquivo de configuração é que o root
acesso não é necessário para definir permissões ou criar nós do dispositivo no novo arquivo morto.
(Observe que essas duas entradas de "arquivo" de exemplo esperam encontrar arquivos denominados " init.sh
" e " busybox
" em um diretório chamado " initramfs
", no linux
diretório -2.6. *. Consulte Documentação / espaço de usuário antigo / README para obter mais detalhes.)
O kernel não depende de cpio
ferramentas externas . Se você especificar um diretório em vez de um arquivo de configuração, a infraestrutura de compilação do kernel criará um arquivo de configuração desse diretório ( usr/Makefile
chamadas scripts/gen_initramfs_list.sh
) e continuará a empacotar esse diretório usando o arquivo de configuração (alimentando-o para o usr/gen_init_cpio
qual é criado a partir de usr/gen_init_cpio.c
). O código de criação em tempo de compilação do kernel cpio
é totalmente independente e o extrator de tempo de inicialização do kernel também é (obviamente) independente.