o init não é "gerado" (como um processo filho), mas sim exec
como:
# Boot the real thing.
exec switch_root /mnt/root /sbin/init
exec
substitui todo o processo. O init final ainda é o primeiro processo (pid 1), embora tenha sido precedido por aqueles no Initramfs.
O Initramfs /init
, que é um script de shell do Busybox com o pid 1, exec
s para o Busybox switch_root
(então, agora switch_root
é pid 1); este programa altera seus pontos de montagem, então /mnt/root
será o novo /
.
switch_root
, em seguida, novamente exec
s para /sbin/init
do seu sistema de arquivos raiz real; assim, torna o seu sistema init real o primeiro processo com o pid 1, que por sua vez pode gerar qualquer número de processos filhos.
Certamente, também poderia ser feito com um script Python, se você de alguma forma conseguisse assar Python em seu Initramfs. Embora se você não planeja incluir o busybox de qualquer maneira, você teria que reimplementar meticulosamente algumas de suas funcionalidades (como switch_root
e tudo mais que você usaria normalmente com um simples comando).
No entanto, ele não funciona em kernels que não permitem binários de script ( CONFIG_BINFMT_SCRIPT=y
), ou melhor, nesse caso, você teria que iniciar o interpretador diretamente e fazê-lo carregar seu script de alguma forma.