Introdução aos processos de inicialização e inicialização do kernel Linux

Olá pessoal! Por isso, abrimos o próximo, quarto lugar consecutivo, do curso Linux Administrator , que ocupa seu nicho com confiança ao lado do curso devopersky. Mais professores , mais informações e stands. Bem, como sempre, informações mais interessantes que os professores obtiveram.

Vamos lá

Você já se perguntou o que é necessário para o seu sistema estar pronto para executar aplicativos?

Compreender os processos de carregamento do kernel e iniciar o sistema Linux é importante para configurar o Linux e resolver problemas de inicialização. Este artigo fornece uma visão geral do processo de inicialização do kernel usando o carregador de inicialização GRUB2 e a inicialização executada pelo sistema de inicialização systemd .

De fato, existem duas séries de eventos necessários para colocar um computador Linux em condições de funcionamento: inicialização do kernel (inicialização) e inicialização do sistema (inicialização). O processo de inicialização do kernel inicia quando você liga o computador e termina com a inicialização e o sistemad do kernel. Depois disso, o processo de inicialização do sistema começa, e é ele quem coloca o computador Linux em condições de funcionamento.



Em geral, o processo de carregar o kernel e iniciar o sistema Linux é bastante simples. Consiste nas seguintes etapas, que serão descritas em mais detalhes nas seções abaixo:

  • BIOS POST;
  • Carregamento de kernel (GRUB2);
  • Inicialização do kernel;
  • Executando systemd, o pai de todos os processos.

Observe que este artigo trata do GRUB2 e do systemd, pois eles são o carregador do kernel e o programa de inicialização para a maioria das distribuições. Outras opções foram usadas anteriormente e, às vezes, ainda podem ser encontradas em algumas distribuições.

Processo de inicialização do kernel

O processo de inicialização do kernel pode ser iniciado de várias maneiras. Primeiro, se a energia estiver desligada, ligar o computador iniciará o processo de inicialização. Em segundo lugar, se um usuário local já estiver em execução no computador, incluindo o usuário root e o usuário não privilegiado, o usuário poderá iniciar programaticamente o processo de inicialização do kernel usando a GUI ou a linha de comando para reiniciar. A reinicialização primeiro desliga o computador e somente depois o reinicia.

POST do BIOS

A primeira etapa do processo de inicialização do kernel do Linux não tem nada a ver com o Linux. Essa é a parte de hardware do processo, a mesma para todos os sistemas operacionais. Quando a energia é fornecida ao computador, a primeira coisa que inicia é o POST (Power On Self Test), que faz parte do BIOS (Sistema básico de E / S, Sistema básico de entrada / saída).

Quando a IBM lançou seu primeiro computador pessoal em 1981, o BIOS foi projetado para inicializar componentes de hardware. O POST faz parte do BIOS, cuja tarefa é garantir a operação correta dos equipamentos de computador. Se o POST falhar, o computador poderá estar com defeito e o processo de inicialização não continuará.

O BIOS POST verifica o desempenho básico do hardware e causa uma interrupção do BIOS - INT 13H, que localiza os setores de inicialização do kernel em todos os dispositivos conectados com a capacidade de inicializar. O primeiro setor encontrado, que contém um registro de inicialização válido, é carregado na RAM, após o qual o controle é transferido para o código do setor de inicialização.
O setor de inicialização é apenas o primeiro estágio. A maioria das distribuições Linux usa uma das três opções do carregador de inicialização: GRUB, GRUB2 e LILO. O GRUB2 é o mais novo e agora é usado com muito mais frequência do que versões anteriores.

GRUB2

GRUB2 significa "GRand Unified Bootloader, versão 2", e agora é o principal carregador de inicialização das distribuições Linux mais modernas. O GRUB2 é um programa que torna um computador inteligente o suficiente para encontrar o kernel do sistema operacional e carregá-lo na memória. Como falar e escrever apenas o GRUB é mais fácil que o GRUB2, neste artigo provavelmente usarei o termo GRUB, mas implicarei no GRUB2, a menos que especificado de outra forma.

O GRUB é compatível com a especificação de inicialização múltipla , que permite carregar diferentes versões do Linux e outros sistemas operacionais; também pode iniciar o registro de inicialização de sistemas operacionais proprietários em uma cadeia.

O GRUB também permite ao usuário escolher entre vários downloads possíveis do kernel para qualquer distribuição Linux fornecida. Isso possibilita o download da versão anterior do kernel se a versão atualizada não puder ser inicializada corretamente ou for incompatível com alguma parte importante do software. O GRUB pode ser configurado no arquivo /boot/grub/grub.conf .

O GRUB1 agora é considerado obsoleto e, na maioria das distribuições modernas, é substituído pelo GRUB2, que é sua versão reescrita. Distribuições baseadas no Red Hat atualizadas para o GRUB2 em torno do Fedora 15 e CentOS / RHEL 7. O GRUB2 possui a mesma funcionalidade de inicialização que o GRUB1, mas além disso, fornece ambientes baseados em comandos do sistema operacional principal e pré-SO e mais flexibilidade no estágio de pré-inicialização. O GRUB2 está configurado em /boot/grub2/grub.cfg .

A principal tarefa de qualquer GRUB é carregar o kernel do Linux na memória e executá-lo. Ambas as versões do GRUB funcionam da mesma forma em três estágios, mas neste artigo vou usar o GRUB2 para descrever como o GRUB funciona. A configuração do GRUB e o GRUB2 e o uso de comandos do GRUB2 estão fora do escopo deste artigo.

Embora oficialmente o GRUB2 não use a numeração de etapas, por uma questão de conveniência, usarei neste artigo.

Etapa 1

Como já mencionado na seção BIOS POST, no final do POST, o BIOS procura registros de inicialização nos discos conectados, geralmente localizados no MBR (Master Boot Record), após o qual carrega o primeiro registro encontrado na memória e começa a executá-lo. O código de inicialização, ou seja, o primeiro estágio do GRUB2, ocupa muito pouco espaço, porque deve caber no primeiro setor de 512 bytes no disco rígido junto com a tabela de partição. A quantidade total de espaço alocado para o próprio código de auto-inicialização no MBR padrão é 446 bytes. O arquivo de 446 bytes para o estágio 1 é chamado boot-img e não contém uma tabela de partição - é adicionado ao registro de inicialização separadamente.

Como o registro de inicialização deve ser tão pequeno, não é muito "inteligente" e não entende a estrutura do sistema de arquivos. Portanto, o único objetivo da etapa 1 é detectar e carregar a etapa 1.5. Para conseguir isso, a etapa 1.5 do GRUB deve estar localizada no espaço entre o próprio registro de inicialização e a primeira partição no disco. Depois de carregar o estágio 1.5 GRUB na RAM, o estágio 1 transfere o controle para o estágio 1.5.

Etapa 1.5

Como observado acima, a etapa 1.5 do GRUB deve estar entre o registro de inicialização e a primeira partição no disco. Historicamente, esse espaço permanece sem uso por razões técnicas. A primeira partição no disco rígido inicia no setor 63 e, considerando o MBR no setor 0, existem 62 setores de 512 bytes - 31744 bytes - nos quais é possível armazenar o arquivo core.img - estágio 1.5 GRUB. O arquivo core.img pesa 25389 bytes, o que é espaço suficiente para armazená-lo entre o MBR e a primeira partição de disco.

Como mais código pode ser usado na etapa 1.5, pode ser suficiente conter vários drivers de sistema de arquivos comuns, como EXT padrão e outros sistemas de arquivos Linux, FAT e NTFS. core.img no GRUB2 é mais complexo e funcional do que na etapa 1.5 do GRUB1. Isso significa que o estágio 2 do GRUB2 pode residir em um sistema de arquivos EXT padrão, mas não em um volume lógico. Portanto, o local padrão para os arquivos do estágio 2 é o sistema de arquivos /boot , ou melhor, /boot/grub2 .

Observe que o diretório / boot deve estar localizado no sistema de arquivos suportado pelo GRUB. Nem todos os sistemas de arquivos têm esse suporte. A tarefa do estágio 1.5 é iniciar com os drivers do sistema de arquivos necessários para procurar arquivos do estágio 2 no sistema de arquivos / boot e carregar os drivers necessários.

Etapa 2

Todos os arquivos do GRUB Stage 2 estão localizados no /boot/grub2 e em vários subdiretórios. O GRUB2 não possui um arquivo de imagem como nas etapas 1 e 2. Em vez disso, consiste principalmente de módulos do kernel de tempo de execução, carregados no diretório /boot/grub2/i386-pc , conforme necessário.

A tarefa do GRUB2 estágio 2 é detectar e carregar o kernel do Linux na RAM e transferir o controle do controle do computador para o kernel. O kernel e seus arquivos associados estão localizados no diretório /boot . Os arquivos do kernel são fáceis de reconhecer, pois seus nomes começam com vmlinuz. Você pode listar o conteúdo do diretório /boot para ver os kernels atualmente instalados no seu sistema.

O GRUB2, como o GRUB1, suporta o carregamento de um dos vários kernels do Linux. O sistema de gerenciamento de pacotes Red Hat suporta o armazenamento de várias versões do kernel, para que você possa carregar a versão antiga do kernel em caso de problemas com os mais novos. Por padrão, o GRUB fornece um menu pré-carregado de kernels instalados, incluindo a opção de recuperação e, após a configuração, a opção de recuperação.

Etapa 2 O GRUB2 carrega o kernel selecionado na memória e transfere o controle do controle do computador para o kernel.

O núcleo

Todos os núcleos estão em um formato compactado e auto-extraível para economizar espaço. Os kernels estão localizados no diretório /boot , junto com a imagem original do disco RAM e uma lista de partições nos discos rígidos.

Depois que o kernel selecionado é carregado na memória e começa a ser executado, primeiro, ele deve se extrair da versão compactada do arquivo antes de começar a fazer um trabalho útil. Depois que a extração ocorre, ele carrega o systemd , que substitui o antigo programa init do SysV e transfere o controle para ele.

Este é o fim do processo de inicialização do kernel. Neste ponto, o kernel do Linux e o systemd estão em execução, mas não podem executar tarefas úteis para o usuário final, pois não há mais nada a fazer.

Processo de inicialização do sistema

O processo de inicialização do sistema segue o processo de inicialização do kernel e coloca o computador Linux em funcionamento.

systemd

systemd é o pai de todos os processos responsáveis ​​por levar o host Linux a um estado eficiente. Algumas de suas funções, mais extensas do que as apresentadas no antigo programa de inicialização, devem gerenciar muitos aspectos do host Linux em execução, incluindo a montagem do sistema de arquivos, o início e o gerenciamento dos serviços do sistema necessários para que o host Linux funcione com eficiência. Todas as tarefas do sistema que não estão relacionadas ao processo de inicialização do sistema estão além do escopo da discussão neste artigo.

Primeiro, o systemd monta os sistemas de arquivos conforme definido em /etc/fstab , incluindo quaisquer arquivos de troca e partições. Nesse ponto, ele pode acessar os arquivos de configuração localizados em /etc , incluindo os seus. Ele usa seu próprio arquivo de configuração /etc/systemd/system/default.target para determinar o destino para o qual carregar o host. O arquivo default.target é apenas um link simbólico para o arquivo de destino real. Para uma estação de trabalho de mesa, isso geralmente é graphical.target, equivalente ao nível de execução 5 no inicializador SystemV antigo. Para o servidor, é provável que o padrão seja multiusuário.target, semelhante ao nível de execução 3 no SystemV. Emergency.target é semelhante ao modo de usuário único.

Observe que destinos e serviços são unidades systemd.

A Tabela 1 abaixo é uma comparação de todos os destinos do systemd com os níveis de execução antigos no SystemV. Os aliases de destino do Systemd são fornecidos pelo systemd para compatibilidade com versões anteriores. Os aliases de destino permitem que scripts - e muitos administradores de sistemas, incluindo eu - usem comandos do SystemV, como o init3, para alterar os níveis de execução. Obviamente, os comandos do SystemV são direcionados pelo systemd para interpretação e execução.
Nível de execução do Systemvalvo systemdaliases de destino do systemdDescrição do produto
halt.targetSuspende o sistema sem desligar a energia
0 0poweroff.targetrunlevel0.targetInterrompe o sistema e desliga a energia
Semergency.targetModo de usuário único. Os serviços não estão em execução; sistemas de arquivos não estão montados. Este é o nível mais básico de operação. Para interação do usuário com o sistema, apenas o shell de emergência é iniciado no console principal.
1rescue.targetrunlevel1.targetO sistema base, incluindo a montagem do sistema de arquivos com o conjunto mais básico de serviços e o shell de resgate no console principal.
2runlevel2.targetModo multiusuário, sem NFS, mas todos os serviços que não são da GUI estão em execução.
3multi-user.targetrunlevel3.targetTodos os serviços estão em execução, mas somente através da interface da linha de comandos (CLI).
4runlevel4.targetNão usado.
5graphical.targetrunlevel5.targetModo multiusuário com GUI.
6reboot.targetrunlevel6.targetReiniciar
default.targetEsse destino sempre tem um link simbólico com multi-user.target ou graphical.target. O systemd sempre usa default.target para iniciar o sistema. O default.target nunca deve ser associado a halt.target, poweroff.target ou reboot.target.

Tabela 1: Comparação dos níveis de controle do SystemV com os destinos do systemd e alguns aliases de destino.

Cada destino possui um conjunto de dependências descritas no arquivo de configuração. O systemd executa os necessários. Essas dependências são os serviços necessários para executar um host Linux com um certo nível de funcionalidade. Quando todas as dependências listadas nos arquivos de configuração de destino são carregadas e iniciadas, o sistema funciona nesse nível de destino.

O systemd também verifica diretórios obsoletos de inicialização do SystemV em busca de arquivos de inicialização. Se estiverem, o systemd os utiliza como arquivos de configuração para executar os serviços descritos nos arquivos. Um serviço de rede desatualizado é um bom exemplo de um que ainda usa arquivos de inicialização do SystemV no Fedora.

A Figura 1 abaixo é copiada diretamente da página principal da inicialização. Ele mostra a sequência geral de eventos durante o início do systemd e os requisitos básicos para garantir seu sucesso.

Os destinos sysinit.target e basic.target podem ser considerados pontos de verificação durante a inicialização do sistema. Embora um dos objetivos do systemd seja executar serviços do sistema em paralelo, existem alguns serviços e destinos funcionais que devem ser iniciados antes de outros. Esses pontos de controle não podem ser transmitidos até que todos os serviços e destinos necessários sejam concluídos.

Assim, sysinit.target é alcançado quando todas as unidades das quais depende são concluídas. Todas as seguintes unidades devem ser concluídas: montagem de sistemas de arquivos, configuração de arquivos de troca, inicialização do udev, configuração do estado inicial do gerador de números aleatórios, inicialização de serviços de baixo nível, configuração de serviços de criptografia se pelo menos um sistema de arquivos estiver criptografado. No sysinit.target, eles podem ser executados em paralelo.
O sysinit.target executa todos os serviços e unidades de baixo nível necessários para a funcionalidade mínima do sistema e aqueles necessários para acessar o basic.target.


Figura 1. Mapa de inicialização do Systemd

Após executar o sysinit.target, o systemd inicia o basic.target, começando com todas as unidades necessárias para executá-lo. O destino básico fornece funcionalidade adicional iniciando as unidades necessárias para o próximo destino, incluindo a configuração de caminhos para vários diretórios executáveis, soquetes de comunicação e timers.

Por fim, você pode começar a inicializar destinos no nível do usuário: multi-user.target ou graphical.target. Vale notar que multi-user.target deve ser alcançado antes que as dependências do destino gráfico sejam executadas.

Os alvos sublinhados na Figura 1 são alvos típicos de inicialização. A inicialização do sistema termina quando um deles é alcançado. Se multi-user.target for o destino padrão, no console, você verá o login no modo de texto. Se graphical.target for especificado por padrão, você verá um login gráfico; A GUI da tela de login depende do gerenciador de tela que você está usando.

Os problemas

Recentemente, tive que alterar o kernel de inicialização padrão em um computador Linux que usava o GRUB2. Descobri que alguns comandos pararam de funcionar corretamente ou os usei de forma incorreta. Ainda não sei qual era o problema, levará mais tempo para pesquisá-lo.

O comando grub2-set-default configurou incorretamente o índice padrão do kernel no arquivo /etc/default/grub , para que o kernel alternativo desejado não seja carregado. /etc/default/grub GRUB_DEFAULT=saved manualmente /etc/default/grub GRUB_DEFAULT=saved em GRUB_DEFAULT=2 , em que 2 é o índice do kernel instalado que eu queria executar. Em seguida, executei o comando grub2-mkconfig > /boot/grub2/grub.cfg para criar um novo arquivo de configuração do grub. Esse truque funcionou e um kernel alternativo foi lançado.

Conclusões

O GRUB2 e o sistema de inicialização systemd são componentes essenciais para as fases de inicialização do sistema e inicialização do sistema da maioria das distribuições modernas do Linux. Apesar das contradições, especialmente em torno do systemd, esses dois componentes funcionam bem juntos para carregar o kernel e executar todos os serviços do sistema necessários para criar um sistema Linux funcional.
Embora eu considere o GRUB2 e o systemd como um todo mais complexos que seus antecessores, eles não são mais difíceis de dominar e gerenciar. Os manuais contêm muitas informações sobre o systemd e, no freedesktop.org, a lista de suas páginas é apresentada na íntegra. Para mais informações, consulte os links abaixo:



Isso é tudo. Estamos aguardando perguntas e comentários aqui ou eles podem ser solicitados diretamente em uma lição aberta .

Source: https://habr.com/ru/post/pt424761/


All Articles