Eu descobri que se eu escolher jffs
ou sd
como sistema de arquivos (e não initramfs
), o tamanho do kernel será muito pequeno (1,4 MB em comparação com o initramfs
qual é 3,4 MB). Isso significa que initramfs
ocupa um espaço consideravelmente grande. Então, se eu puder, eu o removeria completamente e, portanto, terá um kernel muito pequeno, que é o que eu quero.
A pergunta básica que surge em minha mente é: Por que eu preciso initramfs
? Um kernel Linux não pode inicializar sem ter um sistema de arquivos inicial?
Meu aplicativo final fará apenas cálculo e comunicação - sem armazenamento. Portanto, um sistema operacional sem sistema de arquivos faz sentido - pelo menos para a minha aplicação.
/root
- é isso. A única coisa que faz de maneira diferente éswitch_root
que, mesmo que, desde que sejam tomadas as devidas precauções com determinados módulos do kernel carregados, isso possa ser feito a qualquer momento. O Initramfs nada mais é do que uma imagem de disco - cheia ou não, está lá. E você nunca está sem ele - é a sua raiz, afinal. Apenas não deve ser um mistério, é o que penso, e não gosto de toda a confusão desnecessária que o cerca.Respostas:
O aumento de tamanho de um initramfs não se deve ao driver ramfs (são apenas alguns kB e é necessário para outras coisas), mas ao próprio initramfs. O initramfs contém programas que são necessários para montar e montar o sistema de arquivos raiz real.
O Initramfs facilita muito e, em alguns casos, é possível (por exemplo, criptografado
/
) inicializar o sistema. É altamente recomendável mantê-lo em hardware no estilo PC com muitos periféricos hotpluggable. Por outro lado, faz muito sentido inicializar um dispositivo incorporado sem o initramfs, com um kernel que suporta apenas a configuração de hardware específica para a qual foi construído.Obviamente, o kernel precisa inicializar em um sistema de arquivos: deve haver uma maneira de carregar qualquer aplicativo que você queira executar. Se você não estiver executando nada, mantenha a máquina desligada.
Se você não quiser usar um initramfs, diga ao seu gerenciador de inicialização para não passar um. Também não inclua um na saída da compilação do kernel, é claro - como isso acontece se for dependente da arquitetura e do carregador de inicialização: por exemplo,
vmlinux
ebzImage
não inclua o initramfs (eles são o kernel bruto e compactado, respectivamente ), masuImage
(para U-Boot) compacta o kernel e o initramfs, se houver um.(Tecnicamente, como mikeserv observa, sempre há um initramfs - mas, por padrão, é um arquivo vazio de 134 bytes. O que você está vendo e quer se livrar é um initramfs "verdadeiro" e não vazio criado por seu processo de construção e contendo ferramentas que são usadas para montar o sistema de arquivos raiz.)
Lembre-se de que um initramfs pode ser uma maneira razoável de criar um sistema de aplicativo único sem dados persistentes: coloque todo o seu aplicativo no initramfs, inicialize-o e mantenha-o. Isso facilita a organização do armazenamento persistente ou da imagem de inicialização (tudo o que você precisa é do kernel e do initramfs, que pode ser empacotado). No entanto, há desvantagens nessa abordagem: todos os dados no initramfs serão armazenados permanentemente na RAM e você não pode modificar facilmente os arquivos na imagem de inicialização; é necessário reconstruir o arquivo morto.
fonte
Do LFS :
...
...
Outra fonte www.kernel.org
Além disso, existem muitos sistemas Linux que gostam de roteadores que não usam o initramfs.
fonte
Você precisa de um initramfs para configurações mais complexas, como inicialização de rede, ou lvm ou raid, pois eles requerem alguns utilitários de modo de usuário para configurar o acesso ao fs raiz. Para uma partição simples e convencional em um disco, desde que você tenha os drivers de disco incorporados ao kernel e especifique o argumento raiz pelo caminho do dispositivo, em vez do UUID, poderá usar o initramfs. Obviamente, o caminho do dispositivo está sujeito a alterações, dependendo de quais dispositivos plug and play (por exemplo, usb) que você conectou, ou mesmo de variações aleatórias aleatórias, e é por isso que praticamente todo mundo usa uuids e initramfs para confiabilidade.
fonte
Esta é uma pergunta antiga, mas ainda não parece ter uma resposta aceita, portanto, eu a divulgarei (não sou especialista aqui, estou tentando descobrir isso sozinha).
Em https://www.kernel.org/doc/Documentation/early-userspace/README (todo o caminho que indica que não foi atualizado desde 2004).
Pelo que vale, acredito que dispositivos / distros como o Raspberry Pi, etc. não usam o initramfs; em alguns casos, o kernel está na partição raiz (montado pelo gerenciador de inicialização que possui módulos fs necessários). Em outros casos em que o kernel está, por exemplo, em uma
/boot
partição, o initramfs na mesma partição pode ser acessado diretamente antes de montar o rootfs como outros. declararam.Em alguns casos, o initramfs pode ser incorporado no mesmo arquivo que o kernel, mas esse nem sempre é o caso. (a) parece afirmar claramente que, em alguns casos, o initramfs não é necessário.
fonte
Acho a explicação a seguir mais clara,
fonte
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 deramfs
(outmpfs
, 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 emtmpfs
vez deramfs
por padrão. Para forçarramfs
, 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ídorootfs
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:
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:
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.
fonte
do_mounts.c
- especificamenteprepare_namespace
, na qualsaved_root_name
é preenchida oroot=
argumento da linha de comando.