Não importa o que você faça, você tem initramfs
. Não há como ficar sem ele - é o único sistema de arquivos imposto a você. 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 de inicialização; 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 é 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 para outro dispositivo raiz, o initrd pivot_root e desmontar o ramdisk. Mas o 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.), anexe 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 construção do kernel 2.6 sempre cria um arquivo initramfs no formato cpio compactado em gzip e o vincula ao binário do kernel resultante. Por padrão, esse arquivo está vazio (consumindo 134 bytes em x86).
A opção de configuração CONFIG_INITRAMFS_SOURCE (na Configuração Geral em menuconfig e vivendo em usr / Kconfig) pode ser usada para especificar uma fonte para o arquivo initramfs, que será automaticamente incorporado no binário resultante. Esta opção pode apontar para um arquivo cpio gzipped existente, um diretório que contém arquivos a serem arquivados ou uma especificação de arquivo de texto, como o 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 acesso raiz 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 diretório linux-2.6. *. Consulte Documentation / early-userspace / README para obter mais informações. mais detalhes.)
O kernel não depende de ferramentas externas do cpio. 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 a partir desse diretório (usr / Makefile chama scripts / gen_initramfs_list.sh) e passa a empacotar esse diretório usando o arquivo de configuração (alimentando-o para usr / gen_init_cpio, que é criado a partir de usr / gen_init_cpio.c). O código de criação do cpio em tempo de construção do kernel é totalmente independente e o extrator de tempo de inicialização do kernel também é (obviamente) independente.