Por que não incluímos drivers do Sistema de Arquivos no próprio kernel em vez de usar o Initrd / Initramfs?

2

O kernel Linux contém um código muito pequeno que é necessário para inicializar na maioria dos dispositivos, mas eu não entendo o ponto de ter Initrd / Initramfs.
Até onde eu entendi, o trabalho de Initrd / Initramfs é Providencie temporariamente os drivers do sistema de arquivos para carregar realmente o sistema de arquivos raiz.
Se este é o caso, então por que simplesmente não adicionamos os drivers necessários do sistema de arquivos ao próprio kernel.
Precisamos carregar o kernel e o Initrd. / Initramfs então porque não integrar ambos em um arquivo de imagem, já que ambos usam a mesma quantidade de memória.


******* Atualização ******

1. O que realmente constitui o kernel do Linux? É apenas a imagem vmlinuz (aproximadamente 5-6MB) ou a coleção de módulos carregáveis, imagem vmlinuz, arquivo initrd e outros componentes.
2. Por que o tamanho da imagem do kernel vmlinuz (aproximadamente 5-6MB) é menor que o tamanho do arquivo initrd (aproximadamente 18MB). O kernel contém o código para muitas outras coisas, em comparação com o initrd, que contém apenas código para montar o sistema de arquivos.

Sou novo nisso, então, por favor, explique.Graças.

    
por Shivam aggarwal 26.12.2016 / 14:22

2 respostas

2

Primeiro, não são apenas os drivers do sistema de arquivos. Também são os drivers de qualquer dispositivo de armazenamento no qual o sistema de arquivos está. E possivelmente mais se você usar o LVM, criptografia, etc.

Independentemente disso, é definitivamente possível construí-los no kernel. Eu sei que o slackware tem pelo menos uma opção de kernel chamada 'enorme' que faz exatamente isso e não requer um initramfs para um hardware típico de PC.

A desvantagem é que tal kernel tem que incluir tudo que qualquer um possa precisar: todo sistema de arquivos possível que possa ser usado como root, os drivers de dispositivo para qualquer sistema de arquivos, etc. Então você acaba com um kernel inchado que contém muitos códigos não usados e desperdiça memória.

Eu acho que existem alguns drivers que só podem ser construídos como módulos do kernel, mas isso é mais uma escolha de design do que uma limitação técnica real.

Responder a edições:

  1. Provavelmente depende de quem você pergunta e em que contexto. Para mim, é tudo o que é executado no espaço do kernel para incluir todos os drivers. Um desenvolvedor de kernel pode ter uma visão diferente com muitos outros nomes para diferentes partes.

  2. Na verdade, a grande maioria do código do kernel é de módulos e drivers carregáveis. Algumas delas são bem grandes. No meu sistema, apenas o btrfs é comprimido em 500 kB. O NFS é quase tão grande. ext4 é de 300 kB. Também há um grande número de dispositivos de armazenamento suportados e você pode precisar de qualquer um deles para obter seu sistema de arquivos raiz. Basta navegar pelo /lib/modules/*/kernel/drivers/ em um sistema linux e você verá.

por 26.12.2016 / 14:52
2

É um problema de galinha e ovo ... Você pode (e geralmente deve) deixar que muitos dos seus drivers sejam módulos, manter o kernel enxuto e economizar memória (até e se você precisar do módulo). No entanto, você faz precisa de alguns drivers embutidos em seu kernel - especificamente para qualquer dispositivo de inicialização (por exemplo, CD-ROM, HDD, ...), o sistema de arquivos usado (por exemplo, iso9660, ext4, ...) e quaisquer drivers adicionais necessários para suportar isso (por exemplo, suporte a USB, suporte a SCSI, ...). Se você não , seu kernel não será capaz de acessar a mídia e o sistema de arquivos onde os módulos para drivers adicionais residem, e assim não poderá carregá-los no kernel.

Se você criar um kernel personalizado para o seu próprio sistema - onde você sabe de antemão qual hardware (tipo HDD, tipo de unidade de DVD, etc.) você possui - isso não é um problema. Você só precisa de drivers para o que você realmente tem ou acha que pode precisar. E você só precisa incluir no kernel os drivers necessários no momento da inicialização.

No entanto, se você estiver criando um disco de instalação para uma distribuição, você deve incluir drivers para todos os possíveis usuários de hardware provavelmente encontrarão! Incluí-los todos no kernel, tornaria o kernel incansavelmente inchado e exigiria muita memória RAM em sistemas low-end. Fazer todos os módulos de drivers não funcionará, porque os módulos podem ser necessários para carregá-los. A solução é initrd !

initrd é a imagem de um disco RAM carregado na memória no início. Todos os drivers que podem ser necessários são apresentados como módulos. Contanto que o kernel inclua drivers para ler um DVD, ler o sistema de arquivos em um DVD e ler um disco RAM; ele poderá acessar e carregar sob demanda os módulos de driver do initrd. Isso resolve o problema para quem faz as distribuições para tornar o kernel pequeno e incluir drivers para cada hardware em que ele pode rodar.

A maioria dos usuários provavelmente continua usando o initrd-boot após instalar o Linux em seus discos rígidos ... Isso não é realmente necessário, pois eles podem construir um kernel personalizado - talvez com módulos adicionais - customizados para o hardware que eles na verdade tenho. O processo de duas etapas de primeiro carregar o initrd, leva um pouco de tempo extra durante a inicialização.

    
por 26.12.2016 / 16:31