O kernel do Linux precisa de um sistema de arquivos para ser executado?

19

Minha opinião é sim, sim, porque toda exposição útil ao mundo externo (modo de processador não privilegiado) exigiria primeiro um processo em execução no mundo externo. Isso exigiria um sistema de arquivos, mesmo um sistema de arquivos temporário na RAM.

Outro engenheiro discorda de mim, mas não consigo provar isso além de todos os casos (desconhecidos para mim).

A resposta a esta pergunta depende da definição de 'corrida'?

Peter L.
fonte
4
Eu acho que um kernel em execução não "requer"useful exposure to the outside world
jsotola 21/03
19
Lembra-se do velho firewall do Linux interrompido (por volta de 2002)
Jeff Schaller
1
Se você adicionar um novo código ao kernel, poderá fazer qualquer coisa. Se você não puder, ele será inicializado até o ponto em que tenta executar init(o primeiro processo de espaço do usuário) e isso falhará.
user253751 22/03
1
Definir "executar" ...
Thorbjørn Ravn Andersen 22/03
Leia o sistema operacional: três partes fáceis
Basile Starynkevitch 22/03

Respostas:

27

Essa é uma pergunta estranha, porque você não executa o kernel como executa um programa. O kernel é uma plataforma para executar programas. É claro que existe um código de configuração e desligamento, mas não é possível executar o kernel por conta própria. Sempre deve haver um processo "init" principal. E o kernel entrará em pânico se não estiver lá. Se o init tentar sair do kernel também entrará em pânico.

Atualmente, o processo init é algo como systemd. Se não especificado de outra forma, o kernel tentará executar um programa a partir de uma lista de locais começando com /sbin/init. Veja o parâmetro init aqui http://man7.org/linux/man-pages/man7/bootparam.7.html em uma emergência com a qual você pode inicializar o Linux init=/bin/bash. Mas observe como você sempre especifica um arquivo no sistema de arquivos a ser executado.

Portanto, o kernel entrará em pânico se inicializar e não possuir um sistema de arquivos, porque sem ele não há como carregar o init.

Alguma confusão pode surgir devido a uma situação de galinha e ovo em que o kernel deve carregar drivers para acessar seu sistema de arquivos. Para contornar isso, um ramdisk inicial é carregado de uma imagem em disco contendo drivers vitais e scripts de configuração. Eles são executados antes do carregamento do sistema de arquivos. Mas não se engane, o ramdisk inicial é um sistema de arquivos. Com um ramdisk inicial /inité chamado (que é armazenado no ramdisk inicial). Em muitas distribuições, é finalmente isso que chama /sbin/init. Novamente, sem um sistema de arquivos, isso é impossível.

Philip Couling
fonte
Não existe uma condição em que o kernel desista de tentar inicializar o hardware e carregar um sistema de arquivos conhecido (não o initrd passado para o kernel por meio de parâmetros init) e depois cai em um shell muito limitado (sem init = / bin / bash)? Além disso, como você abre / bin / bash, o kernel sempre teria esse sistema de arquivos mínimo disponível, mesmo que fosse construído com outras opções .config que poderiam potencialmente eliminar isso?
Peter L.
1
@PeterL. esse shell limite é um shell do initrd / initramfs / seja lá o que o kernel inicializou, IIRC.
muru 22/03
3
Observe que você pode criar o initramfs (um arquivo CPIO extraído em um sistema de arquivos ramfs ou tmpfs) no kernel. Depende de você ou não que o kernel "necessite de um sistema de arquivos", pois isso significa que você pode inicializar o kernel e nada além do kernel e ter um sistema funcional (se um pouco limitado). Observe também que, mesmo que você faça o patch do kernel para não precisar mais de um init, ele ainda criará sistemas de arquivos virtuais internos que nunca serão expostos.
forest
@forest O sistema não precisa ser "limitado" - você pode incluir o systemd e o gnome no seu initrd (junto com coisas que são realmente úteis ;-)). Uma limitação do initramfs foi (ainda é?) Que não estava apoiando atributos estendidos - Eu fiz o trabalho em torno dela em android, incluindo uma imagem ext4 no arquivo cpio initrd que foi então montado como um dispositivo de loop a partir do init.$DEV.rcscript.
Tio Billy
1
@IsmaelMiguel, não, um initramfs é um arquivo cpio. O Squashfs é uma boa opção para sistemas de arquivos incorporados, e pode-se fazer um initrd (vs um initramfs) que o usa (os termos são frequentemente usados ​​de forma intercambiável, mas não são exatamente a mesma coisa), mas não é o formato que o Linux descompacta no seu initramfs. (De fato, uma imagem do squashfs não precisa ser descompactada antes de poder ser usada; ela está devidamente indexada).
Charles Duffy
16

A resposta vai depender se você quer dizer literalmente sem um sistema de arquivos ou se a pergunta deve ser interpretada um pouco diferente da forma como ela é realmente declarada. As respostas para pequenas variações na maneira como a pergunta é interpretada são:

  • A execução do Linux sem nenhum dispositivo de bloco é totalmente viável e útil para alguns casos de uso especializados.
  • A execução do Linux sem nenhum sistema de arquivos exigirá reescrever algumas partes do código do kernel e é improvável que seja um esforço útil.
  • Executar o Linux sem usar nenhum descritor de arquivo exigirá muito esforço. Tenho certeza de que não valerá a pena o esforço.

Os motivos pelos quais você teria que reescrever partes do código do kernel para criar um sistema funcional sem um sistema de arquivos são:

  • Cada encadeamento possui um diretório raiz e um diretório ativo atual que deve apontar para algum sistema de arquivos.
  • Os programas são iniciados pela execvechamada do sistema que precisa de um executável a partir de um sistema de arquivos.
  • O kernel cria um sistema de arquivos baseado em memória durante o processo de inicialização.

Depois que um programa é iniciado execve, é possível remover o mapeamento do executável a partir do qual foi iniciado, embora, para fazer isso, sem travar imediatamente, primeiro seja necessário criar um mapeamento de memória executável sem o backup de um arquivo, e ele precisa inicializar isso com algum código útil antes de pular para ele e remover o mapeamento do executável.

Portanto, um programa em modo de usuário em execução pode existir em um estado em que não possui mapeamentos de memória suportados por arquivos e pode fechar todos os descritores de arquivos suportados por arquivos. Ele não pode deixar de ter um diretório raiz e um diretório de trabalho atual, mas pode abster-se deles.

Portanto, embora nesse estado você possa implementar o código do kernel para remover o sistema de arquivos do programa e mantê-lo em execução, não parece útil. E entrar nesse estado final sem passar por um estado intermediário de usar um sistema de arquivos será ainda mais trabalhoso, sem nenhum benefício útil.

Uma configuração útil para alguns casos de uso especializados

Evitar o uso de dispositivos de bloco pode ser útil. Durante a inicialização, o kernel cria um sistema de arquivos de memória e também pode preencher esse sistema de arquivos com o conteúdo de um cpioarquivo morto antes de executar init. Dessa forma, você pode executar um sistema inteiramente a partir de um sistema de arquivos baseado em memória, sem nenhum dispositivo de bloco para fazer backup.

Isso pode ser útil para sistemas em que você não deseja preservar nenhum estado e deseja que o sistema inicie de uma forma limpa após a reinicialização.

Obviamente, o kernel e o arquivo cpio precisam existir de alguma forma na memória antes que o kernel tenha controle. Como eles chegaram lá é um trabalho para o carregador de inicialização. O carregador de inicialização pode ter carregado os de um dispositivo de bloco, mesmo que o sistema em execução final não use dispositivos de bloco. Mas também é possível que o carregador de inicialização adquira o kernel e o arquivo cpio sem usar um dispositivo de bloco, por exemplo, inicializando pela rede.

Kasperd
fonte
1
A questão é se um kernel do Linux em qualquer configuração criada (sem reescrever nada) pode 'executar' sem nenhum sistema de arquivos. Ele não precisa fazer nada de útil ou preservar um estado. De todas as respostas, estou entendendo que algum tipo de sistema de arquivos é fornecido e assumido dentro do próprio kernel, pelo menos até o desligamento. Mesmo '/' é um sistema de arquivos. Então, acho que para simplificar a resposta, é "sim".
Peter L.
2
@PeterL. Sim, se você não reescrever nada, o Linux exigirá um sistema de arquivos. Quando as pessoas falam sobre usos práticos do Linux sem um sistema de arquivos, eles normalmente se referem àqueles suportados por um dispositivo de bloco e você pode executar o Linux sem um sistema de arquivos suportado por um dispositivo de bloco. Você ainda teria algum tipo de sistema de arquivos.
kasperd 22/03
3

No Linux, quase todo dispositivo é um arquivo , então você precisa ter um sistema de arquivos para executá-lo.

K7AAY
fonte
8
Mas é claro que os drivers de dispositivo existem dentro do kernel, independentemente de um arquivo de dispositivo apontar ou não para eles.
Philip Couling 22/03
6
Nem todo dispositivo é um arquivo. Interfaces de rede ( eth0, wlan0etc.) não são, por exemplo.
Ruslan
1
Este é um equívoco comum. Embora, em teoria, tudo seja um arquivo em sistemas UNIX e UNIX, isso é verdade apenas para sistemas altamente especializados como o Plan 9 (embora seja muito mais verdadeiro que para o Windows). Para Linux, algumas coisas não são arquivos. Isso está se tornando cada vez mais verdadeiro, pois muitos drivers começaram a usar o netlink em vez do ioctls em dispositivos de caracteres (que são arquivos).
forest
O @forest Plan 9 não é um sistema "altamente especializado" - era para ser um sistema de uso geral como o Unix ou o Windows (por que falhou em substituir o Unix e permaneceu um sistema de pesquisa é uma história completamente diferente). De qualquer forma, assim como o Linux, o plan9 está expondo interfaces virtualizadas ao seu hardware (e não possui ioctls - não vejo como usar o netlink vs ioctls nisso tudo), mesmo que se esforce para ser mais consistente (por exemplo, as interfaces de rede são acessíveis através do sistema de arquivos). Com a introdução dos namespaces, o Linux já se parece mais com o plan9 do que com o unix clássico.
Tio Billy
1
Argumento muito bom: ou há devfs, que é um sistema de arquivos por definição, ou não há devfs; nesse caso, você precisa de um sistema de arquivos para hospedar nós do dispositivo ...
pmf
-1

Um kernel é um programa, como qualquer outro. Por padrão, o kernel do Linux tenta acessar o sistema de arquivos, no entanto, esse comportamento pode ser eliminado trivialmente pela modificação do kernel (na verdade, apenas uma adição da função "arch_call_rest_init ()"). Para executar um "trabalho útil", esperamos que o desenvolvedor inclua threads do kernel (kthreads), executados em um driver personalizado, para executar a inicialização desejada e a carga de trabalho do tipo de aplicativo. O kernel do Linux já contém muitos kthreads, mas principalmente para executar trabalhos auxiliares ao kernel ou drivers. As APIs disponíveis no contexto do kernel são bem diferentes daquelas disponíveis no espaço do usuário do Linux. Uma grande fração da funcionalidade de chamada do sistema se tornaria inútil em um cenário sem sistema de arquivos.

Sim, o Linux espera acessar os sistemas de arquivos por padrão. Não, certamente poderia ser feito um kernel modificado para executar um trabalho útil sem qualquer sistema de arquivos. O uso prático do Linux sem sistema de arquivos é IMO bastante limitado, mas não nulo. FWIW, no passado, muitos kernels em tempo real foram incorporados no mesmo espaço de nome e binário que os aplicativos RT.

stevea
fonte