Agora, para a explicação detalhada do que eu havia colocado acima.
Enquanto um initramfs e um initrd servem ao mesmo propósito, existem 2 diferenças. A diferença mais óbvia é que um initrd é carregado em um ramdisk. Consiste em um sistema de arquivos real (normalmente ext2) que é montado em um ramdisk. Um initramfs, por outro lado, não é um sistema de arquivos. É simplesmente um arquivo cpio (compactado) (do tipo newc) que é descompactado em um tmpfs. Isso tem um efeito colateral de tornar o initramfs um pouco mais otimizado e capaz de carregar um pouco mais cedo no processo de inicialização do kernel do que um initrd. Além disso, o tamanho dos initramfs na memória é menor, pois o kernel pode adaptar o tamanho dos tmpfs ao que é realmente carregado, em vez de depender de tamanhos predefinidos de ramdisk,
Há também outra diferença de efeito colateral: como o dispositivo raiz (e a mudança para ele) é tratado. Como um initrd é um sistema de arquivos real descompactado no ram, o dispositivo raiz deve realmente ser o ramdisk. Para um initramfs, existe um kernel "rootfs" que se torna o tmpfs no qual o initramfs é descompactado (se o kernel carrega um initramfs; caso contrário, o rootfs é simplesmente o sistema de arquivos especificado pelo parâmetro de inicialização root = kernel), mas esse rootfs provisório não deve ser especificado como o parâmetro root = boot (e não haveria uma maneira de fazer isso, pois não há dispositivo conectado a ele). Isso significa que você ainda pode passar seu dispositivo raiz real para o kernel ao usar um initramfs. Com um initrd, você precisa processar qual é o seu verdadeiro dispositivo raiz. Além disso, desde o "real" Se o dispositivo raiz com um initrd é o ramdisk, o kernel precisa realmente trocar os dispositivos raiz de um dispositivo real (o ramdisk) para outro (sua raiz real). No caso de um initramfs, o espaço initramfs (o tmpfs) não é um dispositivo real, portanto o kernel não alterna dispositivos reais. Assim, enquanto o comando pivot_root é usado com um initrd, um comando diferente deve ser usado para um initramfs. O Busybox fornece switch_root para fazer isso, enquanto o klibc oferece new_root. um comando diferente deve ser usado para um initramfs. O Busybox fornece switch_root para fazer isso, enquanto o klibc oferece new_root. um comando diferente deve ser usado para um initramfs. O Busybox fornece switch_root para fazer isso, enquanto o klibc oferece new_root.
pivot_root
no passado o initramfs,switch_root
não existia naquele momento.switch_root
parece ser um método de conveniência depivot_root
que faz mais alguma limpeza e também se move/proc
/sys
e/dev
etc, e não apenas a própria raiz