O Processo de Boot de um Sistema Linux

Do momento em que a placa mãe é energizada, até a execução do primeiro aplicativo no espaço de usuário, o boot do computador é uma jornada!


| Se você apoia nosso site, desative o AdBlock quando visitá-lo, inclusive em Mobile! Os anúncios são poucos e não invasivos. Se quiser contribuir com nosso trabalho, clique em qualquer banner de sua preferência, exceto dos Parceiros. Mais detalhes clicando aqui.


Introdução

De forma sintética, no momento em que apertamos o botão “ligar” na carcaça do PC e a energia flui por seus componentes, vemos uma sequência que lembra dominós pequenos derrubando dominós maiores: pequenos processos, de poucos bits na placa mãe, executam um sistema tão complexo.

A sequência do boot completo de um computador, pelo menos rodando Linux, é:

CSM (UEFI) -> MBR (GPT) -> GRUB -> KERNEL -> INIT -> RUNLEVEL

Boot

O termo boot deriva do inglês booting que, por sua vez, deriva do termo bootstrapping, de boot straps – conhecemos no Brasil como “lingua de bota”, uma tira de couro que fica no alto do calcanhar usado pra auxiliar a calçar um determinado calçado.

O termo faz alusão às fantásticas histórias sobre o Barão de Münchhausen, que, segundo a lenda, dentre outras tantas façanhas absurdas e incríveis que afirma-se ter realizado – Como as piadas de Chuq Norris -, foi capaz de se erguer de um pântano para não se molhar ao se levantar pelas linguetas das próprias botas – pulling himself by his own boot straps.

Ou seja, o termo procura dar a imagem de um processo aparentemente impossível pelo qual o sistema se ergue – ou se coloca em funcionamento – por seus próprios esforços. Em computação, as três expressões têm basicamente o mesmo significado.

A sequência de boot a partir daqui segue a seguinte estrutura:

De forma resumida temos:

  1. A BIOS – também conhecida como CSM ou poderia ser o UEFI
    Verifica a placa mãe e localiza o ponto de início MBR/GPT em um dos discos.
  2. O MBR/GPT aponta a localização do GRUB, instalado no disco.
  3. O GRUB localiza e executa o Kernel Linux
  4. O Kernel, uma vez que inicia os componentes de hardware, dá início ao Init (ou SystemD)
  5. O Init (ou SystemD) inicia os pacotes de processos chamados Runlevels
  6. Os Runlevels são basicamente a sequência de outros processos de sistema que concluem seu início.

Abaixo, mais detalhes de cada etapa do processo de boot!

1. BIOS/CSM

A energia fluiu pela placa mãe!
Nesse momento a placa mãe vai executar o BIOS: Basic Input/Output System (o Sistema Básico de Entrada e Saída). O BIOS é um programa instalado na placa mãe que faz ela reconhecer seus próprios componentes.

Uma vez ligado, ele faz uma rápida checagem de integridade da estrutura da placa mãe e dos componentes ligados a ela conhecido como POST – para verificar se está tudo Ok antes de continuar – e então, procura pelas mídias conectadas: Disco rígido, disquete, CD, DVD, etc. Quando ele encontra um – e seguindo a ordem definida pelo usuário ou pré definida pela própria placa mãe, pra qual tem prioridade de carregamento -, ele procura pelo MBR – Master Boot Record – um espacinho de poucos kilobytes nessa mídia, que vai informar aonde o GRUB fica.

Observação:
Em sistemas mais modernos, a tendência é que o BIOS em formato CSM desapareça e dê lugar ao UEFI, que possui um método de boot mais rápido e mais otimizado. Abordamos sobre o UEFI neste post do site!

4. MBR/GPT

Localizado no 1º setor de todo disco rígido.
Normalmente /dev/hda ou /dev/sda.
Possui menos de 512 bytes de tamanho.
Possui 3 partes:

  1. Carregador de sistema primário, com 446 bytes
  2. Tabela de partição com ~66 bytes, informando onde estão as partições do disco
  3. Validação de integridade.

Basicamente o MBR aponta a localização do GRUB (ou LILO)

Observação:
A tendência é que o MBR desapareça junto da BIOS e dê lugar á estrutura de partições GPT. Ao contrário da MBR que é limitada e suporta somente 4 partições primárias, a tabela de partição GPT suporta até 64 partições primárias, Secure Boot – onde somente sistemas assinados digitalmente podem iniciar – e redundância na tabela de partição, melhorando a recuperação do sistema em caso de falhas.

Assim como o MBR, o papel do GPT é apontar a localização do GRUB.

5. GRUB/LILO.

Software do GNU, do nosso amigo Richard Stallman, cujo nome é contraído de GRand Unifiet Bootloader.
É o mais popular dentre os sistemas Linux e baseados em UNIX por reconhecer a maior % de sistemas operacionais para multiboot em um PC; com ele você faz dual, tri, quad, n boot com seu PC com quantos sistemas seu disco aguentar. Se a partição for UEFI, em vez de MBR, a quantidade será bem maior.

Mais informações sobre o que é o UEFI você encontra neste post!

O GRUB vai procurar aonde estão as imagens de kernel na pasta /boot de cada partição do PC.

Ainda sendo um programa pequeno e leve, ele vai atraz do arquivo padrão /boot/grub/grub.conf para ler a localização exata do Kernel e do Initrd.img (ou dos, se mais de um) no disco rigido. Uma vez encontrado, ele exibe uma pequena tela interativa onde o usuário escolhe qual Kernel previamente localizado vai iniciar o carregamento de qual sistema operacional instalado no disco.

Basicamente, o GRUB serve para localizar e executar o kernel, iniciando seu carregamento.

Tela do GRUB para escolha de qual kernel iniciar e/ou outras opções como verificação da memória.

6. Kernel

No momento em que o usuário escolhe o kernel – ou se existir apenas 1, o GRUB iniciará ele automaticamente -, começa a ficar interessante:

O Kernel Linux será iniciado quando o GRUB iniciar o /boot/vmlinuz, uma versão compactada e resumida do kernel Linux – um executável dele cheio de informação – que dará inicio ao initrd.img.

vmlinuz deriva de virtualmemory, que é basicamente uma pequena memória SWAP no disco rigido, linux, do kernel em si e Z por ser compactado, sendo a descompressão bem rápida.

O initrd.img, tambem em /boot, é um “sistema operacional” resumido em uns 30Mb. Se voce abrir essa .img verá uma hierarquia de pastas que remete á raíz do seu sistema: Com os principais módulos básicos para que o kernel possa iniciar os trabalhos, como execução dos módulos de rede, vídeo, teclado, etc. No linux o uso do termo driver não é incentivado pela maneira como esses módulos se comportam!

Inclusive um dos fundamentos do kernel linux é ser modular, cada módulo pode ser carregado e descarregado quando o sistema achar pertinente e o usuário pode carregar aqueles que achar conveniente, a hora que quiser, sem precisar de reboot’s do PC pra isso. Na prática você pode desconectar e reconectar um teclado ou um pendrive apenas por comandos, sem precisar usar de meios físicos pra fazer isso.

initrd significa “Initial RAM Disk”, será o sistema de arquivos root temporário alocado na RAM, até que o sistema termine de montar o sistema real!

O initrd.img funciona como um sistema de arquivos pequeno numa SWAP dentro do disco rígido, contendo os drivers essenciais e daemons para que o sistema reconheça a RAM física de fato e possa copiar parte do kernel para lá e continuar o boot.

Quando o kernel vmlinuz é descompactado e copiado para a RAM fisica, o initrd.img é desmontado, não sendo mais usado.

Quer conhecer o kernel mais a fundo?

Dê uma olhada na sua /boot, você verá o vmlinuz e o initrd.img.
A pasta /sys, /bin e /lib carregam boa parte dos módulos (drivers, hardware) e executáveis dos Daemons tambem.

O kernel, uma vez carregado na memória RAM, vai montar o sistema de arquivos ROOT definido em “root=” dentro de grub.conf.

Nesse ponto, ele tambem vai iniciar o 1º processo – o único que ele inicia – o programa /sbin/systemd cujo PID é 1. Em sistemas mais antigos, é o Init quem é carregado.

Com o comando:

$ ps -ef | grep systemd

Você verá a ID do processo “systemd”, quem fez o sistema iniciar de fato. Basicamente, o kernel prepara os módulos (drivers) de hardware e deixa o terreno pronto pra iniciar 1 daemon: SYSTEMD.

Mais detalhes sobre quem é o kernel Linux, você encontra neste post!
Mais detalhes sobre os processos de usuário e de sistema, você encontra neste outro post!

7. Init (SystemD)

O init, hoje substituído pelo “systemd”, basicamente vai iniciar os demais processos e daemons.
Quer ver a importância do systemd?

$ pstree

Você verá ele lá no topo, coordenando tudo após o início do sistema. É o UNICO daemon que o kernel inicia, depois o SystemD faz o resto.

Detalhe que o SystemD é um processo de sistema que não responde ao comando kill, ele não pode ser morto!

Se por acaso ele encerrar abruptamente, o sistema inteiro cairá, resultando num Kernel Panic.

8. Runlevel

O runlevel indica o modo de operação atual da máquina, definindo quais serviços e recursos devem iniciar imediatamente e quais permanecer ativos. Basicamente cada número do runlevel equivale a um conjunto de softwares que irão iniciar com a máquina naquele momento. A maioria das distros linux inicia com o runlevel 5, ou seja, multiusuários (seu usuário + root), conectado á internet, com servidor gráfico executando e etc. Mas temos outros além desse.

No Linux os runlevels são numerados de 0 a 6. No nível 0 o sistema está parado, nenhum processo é executado. Este modo entra em ação quando desligamos o sistema via software com o comando:

# halt

Os demais operam da seguinte forma:

  • O nível 1 é chamado de single user mode e é um modo de recuperação, onde temos ativa apenas a conta de usuário root. Não é possível usar a rede nem rodar programas gráficos. Neste modo é possível alterar as configurações do sistema, alterar as senhas dos usuários, etc.
  • Nos níveis 2 e 3 já temos o modo de operação normal do sistema. Nestes modos o sistema inicializa em modo texto e depois de logado o usuário pode abrir o modo gráfico se desejar. A diferença entre os dois é que no modo 2 (também considerado um modo de recuperação) não existe suporte a rede.
  • O nível 4 geralmente fica vago. Na maioria das distribuições ele equivale ao modo 3, enquanto em outras, como no Slackware, equivale ao modo de login gráfico 5.
  • No nível 5 temos a inicialização com login em modo gráfico, default na maioria das distribuições atualmente.
  • O nível 6 é reservado à reinicialização do sistema. Todos os serviços e programas são parados e o sistema é reinicializado via software. O modo 6 difere do modo 0, onde o sistema fica simplesmente parado, apenas esperando ser desligado da energia.

Existe ainda um modo especial, o modo S, que dependendo da distribuição Linux equivale ao modo 1 ou 6.

Para consultar seu runlevel atual, rode no terminal:

$ runlevel

Apesar do SystemD ser o novo daemon gestor de sistema, os scripts do Init continuam compatíveis e vários deles são reaproveitados por questão de praticidade. O usuário pode trocar de runlevel a qualquer momento utilizando um link simbólico do init para o runlevel do SystemD, com o comando:

$ sudo init 1

Basta troca o 1 por qualquer número entre 0 e 6.
Lembrando das consequências, por exemplo, Init 1 deixará o sistema em modo de segurança enquanto que o 6 vai reiniciá-lo.

9. Curiosidade

Acima em Runlevels mostrei o comando que chama scripts reaproveitados do Init para gerenciar o SystemD. Mas como seriam esses scripts se eu usasse a sintaxe original do SystemD?

Aqui a relação entre os Runlevels e os targets, os scripts de gestão do daemon SystemD:

  • init 0 equivale ao poweroff.target (e o init0 é um link simbólico para poweroff.target).
  • init 1 equivale ao rescue.target (e o init1 é um link simbólico para rescue.target).
  • init 3 equivale ao multi-user.target (e o init3.target é um link simbólico para multi-user.target).
  • init 5 equivale ao graphical.target (e o init5.target é um link simbólico para graphical.target).
  • init 6 equivale ao reboot.target (e o init6.target é um link simbólico para reboot.target).
  • Emergency equivale ao emergency.target.

Para ver qual o atual runlevel:

$ sudo systemctl get-default

Trocando de runlevel, seguindo esse padrão, vamos usar de exemplo o equivalente ao Init 3:

$ sudo systemctl isolate multi-user.target

Caso queira definir um desses runlevels como novo padrão:

$ sudo systemctl set-default multi-user.target

Definitivamente é muito mais simples trocar de runlevel usando o link simbólico “init” em vez do padrão estipulado pelo SystemD.

10. Conclusão

Uma vez que os processos iniciam – conexão á internet, servidor de impressão, servidor gráfico, etc -, surge sua tela de login. Então você põe sua senha e usufrui de um sistema que carregou em menos de 2 minutos fazendo um esforço hercúleo para se erguer sobre as próprias botas.

#UrbanCompassPony

Fontes:
TheGeekStuff
Tecmint1
Tecmint2
VivaoLinux1
VivaoLinux2
Hardware

2 comentários em “O Processo de Boot de um Sistema Linux”

  1. Cara simplesmente show a forma didática que vc apresentou as etapas envolvidas no boot do linux e ainda com algumas curiosidades. Eu tenho uma dúvida (sou iniciante no linux) eu poderia manipular do jeito que eu quisesse esses processos? por exemplo entre uma etapa e outra acrescentar algum script ou programa a ser executado? Eu estou com a ideia de acrescentar um pequeno programa que iria apenas liberar o acesso ao linux depois que um sensor RFID autenticasse a leitura de um cartão, caso o cartão estivesse cadastrado o script iria liberar a execução dos próximos processos. Eu usaria um arduino e talvez java pra fazer a comunicação com o arduino através da porta COM.

    Onde poderia aplicar essas modificações?
    Em qual etapa?
    Em qual arquivo?

    Muito obrigado!

    Responder
    • Bom dia, dá pra modificar, mas o método mais eficiente e’ quando o Init inicia, na Etapa 7. La voce adiciona os scripts que responderão a até pouco antes da tela de Login surgir. Do jeito que você deseja, recomendo este tutorial:
      https://help.ubuntu.com/community/CommonAccessCard
      Ele serve pra fazer login no Ubuntu usando um leitor de cartão chipado, qualquer um, como um cartão de crédito ou de telefone (o chip tem uma ID unica, ela é lida e usada na senha) Seguindo esse conceito, pode ser um norte, para que você, com as adaptações necessárias, consiga usar um RFID pra desbloquear o PC!

      Responder

Deixe um comentário