Introdução ao Linux Boot Process
A intenção deste artigo é a de descrever brevemente — e de forma geral — as etapas que compõem o booting do Linux, isso é, o que ocorre desde o momento em que o computador é ligado até o sistema operacional ser carregado. É importante notar que essas etapas dependem da arquitetura do computador, e neste artigo será utilizada como base a arquitetura x86–64.
O artigo possui alguns anexos localizados no final da página. Esse formato foi pensado para que o fluxo lógico não seja interrompido por detalhes que, apesar de importantes, acabam confundindo a leitura.
TLDR
- BIOS
- Bootloader
- Kernel
- Init
BIOS
A primeira etapa consiste na execução da BIOS (Basic Input Output System), um firmware localizado em memória não volátil, responsável por realizar o POST (Power-on Self Test). Este processo, de forma resumida, identifica e inicializa o hardware presente na máquina, tais como processador, memória, disco etc., verificando se há alguma falha. Além disso, lê o primeiro setor de um dispositivo de armazenamento, tradicionalmente um HDD, seguindo a ordem de prioridade definida na BIOS. Este setor é chamado de boot sector e pode variar quanto ao tipo, sendo MBR (Master Boot Record) e GPT (GUID Partition Table) os mais populares. Aqui será utilizado como base a MBR (verificar Anexo A).
Bootloader
Após a BIOS ler e carregar o primeiro setor do dispositivo configurado, neste caso os 446 bytes iniciais da MBR, é iniciado o que é chamado de Bootloader Estágio 1 (stage 1 boot loader). O conteúdo deste setor pode variar, porém, quando se trata de Linux, é provável encontrar um boot manager, isso é, um programa capaz de gerenciar e definir o sistema operacional que será carregado. Opções comuns são LILO (Linux Loader), GRUB (Grand Unified Bootloader) e GRUB2, que será o foco do artigo (verificar Anexo B).
O trecho de código carregado durante a primeira fase do bootloader possui espaço bastante limitado. Portanto, a tarefa que é executada durante esta etapa é a de identificar na tabela de partições qual das partições está marcada como ativa e carregar em memória o primeiro setor da mesma, também conhecida como Partition Boot Record ou Volume Boot Record (VBR). O conteúdo carregado corresponde ao Bootloader Estágio 2 (stage 2 boot loader). Em alguns casos há uma etapa entre o Estágio 2 e o Estágio 1, o Estágio 1.5, que não será descrito aqui.
O Bootloader Estágio 2 no caso do GRUB2 corresponde ao “verdadeiro” programa. Ao ser lido, ele gera uma interface em que é possível escolher o sistema operacional e parâmetros de kernel (verificar Anexo C). Pode-se encontrar diversas distrubuições de Linux e até mesmo outros sistemas operacionais como por exemplo o Windows. A opção desejada é então lida e carregada em memória.
Kernel
O kernel é a parte central de um sistema operacional, sendo ele responsável principalmente por gerenciamento de recursos como memória e processamento e interação com hardware. Após ser carregado em memória, normalmente executa um programa inicializador (init). Este programa pode variar, mas no geral ele tem como funcionalidade inicializar os programas que vivem no userspace.
Init
Distribuições populares como Debian e Fedora utilizam como padrão o Systemd. Menos recentemente, era comum encontrar o SysVinit e o Upstart, tendo em comum o mesmo objetivo de inicialização. Tradicionalmente, o kernel executa o programa /sbin/init
, correspondente ao SysVinit. Porém, com o surgimento de alternativas, o programa foi substituído por um link que aponta para o sistema inicializador desejado. Este possui PID 1, e é mantido até o momento em que o sistema é desligado.
Anexo A: MBR
Os discos normalmente são descritos em termos de setores, trilhas e cilindros. Os setores podem ser considerados como a menor unidade do disco, e tradicionalmente são formatados com 512 bytes. Uma trilha é a sequência de setores numa dada circunferência. Já um cilindro é a combinação de trilhas localizadas em pratos diferentes.
O MBR (Master Boot Record) é um tipo específico de boot sector, inicialmente utilizado em sistemas baseado em MSDOS. É localizado no primeiro setor do disco, isto é, nos primeiros 512 bytes e é composto por: 446 bytes disponíveis para código, 64 bytes para tabela de partição e 2 bytes para outras informações, como o Magic Number.
ANEXO B: GRUB2
É comum ter o GRUB2 instalado na própria MBR, porém não eliminando a possibilidade de tê-lo instalado na VBR e carregado por algum outro boot manager presente na MBR, utilizando a técnica de chain loading.
ANEXO C: Parâmetros de kernel
Paramêtros de kernel são opções para modificar a inicialização padrão do kernel, como informações adicionais sobre hardware que deve ser detectado, ou valores que devem ser sobrescritos. Um exemplo é o initrd (Initial RAM Disk), um arquivo que é carregado pelo bootloader e é utilizado para facilitar a incorporação de módulos de kernel. O parâmetro passado ao kernel é justamente a localização do initrd.