Não importa o que você faça, você tem initramfs
. Não há como fazê-lo - é o único sistema de arquivos imposto a você. De kernel.org :
O que é o rootfs?
Rootfs
é uma instância especial de ramfs
(ou tmpfs
, se estiver ativada), que é
sempre presente em sistemas 2.6. Você não pode desmontar rootfs
por aproximadamente
mesmo motivo, você não pode matar o processo init; em vez de ter um código especial para verificar e manipular uma lista vazia, é menor e mais simples para o kernel
para garantir que determinadas listas não fiquem vazias.
A maioria dos sistemas simplesmente monta outro sistema de arquivos sobre rootfs
e o ignora. A quantidade de espaço ocupada por uma instância vazia de ramfs é minúsculo.
Se * CONFIG_TMPFS * estiver ativado, rootfs
usará tmpfs
em 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 em formato gzipped "cpio"
, que é extraído em rootfs
Quando o kernel inicializa. Após a extração, o kernel verifica se rootfs
contém um arquivo "init"
, e se for o caso ele é executado como PID 1. Se encontrado, esse processo init
é responsável por levar o sistema até o fim, incluindo localizar e montar o dispositivo raiz real (se houver). Se rootfs
não contiver um programa init
após o incorporado > cpio
arquivo é extraído para ele, o kernel vai cair para o código mais antigo para localizar e montar uma partição raiz e, em seguida, executar alguma variante de /sbin/init
com isso.
Tudo isso difere do antigo initrd de várias maneiras:
The old initrd was always a separate file, while the initramfs archive is linked into the linux kernel image. (The directory linux-*/usr is devoted to generating this archive during the build.)
The old initrd file was a gzipped filesystem image (in some file format, such as ext2, that needed a driver built into the kernel), while the new initramfs archive is a gzipped cpio archive (like tar only simpler, see cpio(1) and Documentation/early-userspace/buffer-format.txt). The kernel's cpio extraction code is not only extremely small, it's also __init text and data that can be discarded during the boot process.
The program run by the old initrd (which was called /initrd, not /init) did some setup and then returned to the kernel, while the init program from initramfs is not expected to return to the kernel. (If /init needs to hand off control it can overmount / with a new root device and exec another init program. See the switch_root utility, below.)
When switching another root device, initrd would pivot_root and then umount the ramdisk. But initramfs is rootfs: you can neither pivot_root rootfs, nor unmount it. Instead delete everything out of rootfs to free up the space (find -xdev / -exec rm '{}' ';'), overmount rootfs with the new root (cd /newmount; mount --move . /; chroot .), attach stdin/stdout/stderr to the new /dev/console, and exec the new init.
Como este é um processo notavelmente persuasivo (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 este comando como "switch_root".
Preenchendo o initramfs:
O processo de compilação do kernel 2.6 sempre cria um arquivo initramfs no formato cpio compactado e o vincula ao binário resultante do kernel. Por padrão, este arquivo está vazio (consumindo 134 bytes no 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 ao binário resultante. Esta opção pode apontar para um cpio gzipado existente
archive, um diretório contendo 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 root não é necessário para definir permissões ou criar nós de dispositivo no novo arquivo. (Note que aqueles
duas entradas de "arquivo" de exemplo esperam encontrar arquivos chamados "init.sh" e "busybox" em
um diretório chamado "initramfs", sob o diretório linux-2.6. *. Veja Documentation / early-userspace / README para 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 construção do kernel
cria um arquivo de configuração desse diretório (usr / Makefile chama scripts / gen_initramfs_list.sh) e prossegue para empacotar esse diretório
usando o arquivo de configuração (alimentando-o para usr / gen_init_cpio, que é criado
de usr / gen_init_cpio.c). O código de criação de cpio de tempo de construção do kernel é inteiramente independente, e o extrator de tempo de inicialização do kernel também é
(obviamente) auto-suficiente.