# Inicialização do Linux

O processo de inicialização do Linux é o processo de inicialização em vários estágios realizado durante a inicialização de uma instalação do Linux. É, em muitos aspectos, semelhante ao BSD e outros processos de inicialização no estilo Unix, dos quais deriva.
A inicialização de uma instalação do Linux envolve vários estágios e componentes de software, incluindo inicialização de firmware, execução de um gerenciador de inicialização, carregamento e inicialização de uma imagem do núcleo do Linux e execução de vários scripts e daemons de inicialização. Para cada um desses estágios e componentes, existem diferentes variações e abordagens. Por exemplo, GRUB, LILO, Syslinux ou Loadlin podem ser usados como carregadores de inicialização, enquanto os scripts de inicialização podem ser do estilo init tradicional ou a configuração do sistema pode ser realizada por meio de alternativas modernas, como systemd ou Upstart.

## Visão geral

Os primeiros estágios do processo de inicialização do Linux dependem muito da arquitetura do computador. Hardware compatível com IBM PC é uma arquitetura comumente usada no Linux. Nesses sistemas, o BIOS desempenha um papel importante, que pode não ter análogos exatos em outros sistemas. No exemplo a seguir, assume-se o hardware compatível com IBM PC:
* O BIOS executa tarefas de inicialização específicas para a plataforma de hardware real. Quando o hardware é enumerado e o hardware necessário para a inicialização é inicializado corretamente, o BIOS carrega e executa o código de inicialização a partir do dispositivo de inicialização configurado.
* O gerenciador de inicialização geralmente apresenta ao usuário um menu de opções de inicialização possíveis e possui uma opção padrão, que é selecionada após algum tempo. Depois que a seleção é feita, o carregador de inicialização carrega o núcleo na memória, supre-o com alguns parâmetros e dá a ele o controle.
* O núcleo, se comprimido, irá se descomprimir. Em seguida, ele configura as funções do sistema, como hardware essencial e paginação de memória, e chama start_kernel que executa a maioria da configuração do sistema (interrupções, o restante do gerenciamento de memória, inicialização do dispositivo e do driver etc.). Em seguida, ele inicia, separadamente, o processo ocioso, o planejador e o processo init, que é executado no espaço do usuário.
* O init consiste de scripts que são executados pelo shell (sysv, bsd, runit) ou arquivos de configuração que são executados pelos componentes binários (systemd, upstart). O init possui níveis específicos (sysv, bsd) ou destinos (systemd), cada um deles consistindo em um conjunto específico de serviços (daemons). Estes fornecem vários serviços e estruturas do sistema não operacional e formam o ambiente do usuário. Um ambiente de servidor típico inicia um servidor da Web, serviços de banco de dados e rede.
* O ambiente de desktop típico começa com um daemon, chamado de gerenciador de exibição, que inicia um ambiente gráfico que consiste em um servidor gráfico que fornece uma pilha gráfica básica básica e um gerenciador de login, o qual fornece a capacidade de inserir credenciais e selecionar uma sessão. Depois que o usuário inserir as credenciais corretas, o gerenciador de sessões inicia uma sessão. Uma sessão é um conjunto de programas, como elementos de interface do usuário (painéis, áreas de trabalho, applets etc.) que, juntos, podem formar um ambiente de área de trabalho completo.
No desligamento, o init é chamado para fechar toda a funcionalidade do espaço do usuário de maneira controlada. O init então termina e o núcleo executa seu próprio desligamento.

## Fase do carregador de inicialização

A fase do carregador de inicialização varia de acordo com a arquitetura do computador. Como as fases anteriores não são específicas do sistema operacional, considera-se que o processo de inicialização baseado em BIOS para arquiteturas x86 e x86-64 é iniciado quando o código do registro mestre de inicialização (MBR) é executado em modo real e o carregador de inicialização de primeiro estágio está carregado. Nos sistemas UEFI, uma carga útil, como o núcleo do Linux, pode ser executada diretamente. Assim, nenhum gerenciador de inicialização é necessário. Abaixo está um resumo de alguns carregadores de inicialização populares:
* O LILO não entende ou analisa o leiaute do sistema de arquivos. Em vez disso, um arquivo de configuração (/etc/lilo.conf) é criado em um sistema ativo que mapeia informações brutas de deslocamento [offset] (ferramenta mapeadora) sobre a localização de discos do núcleo e da RAM (initrd ou initramfs). O arquivo de configuração, que inclui dados como partição de inicialização e nome de caminho do núcleo para cada um, bem como opções personalizadas, se necessário, é gravado junto com o código do carregador de inicialização no setor de inicialização do MBR. Quando este setor de inicialização é lido e recebe o controle pelo BIOS, o LILO carrega o código do menu e o desenha, em seguida, usa valores armazenados junto com a entrada do usuário para calcular e carregar o núcleo do Linux ou carregar em cadeia qualquer outro carregador de inicialização.
* O GRUB 1 inclui lógica para ler sistemas de arquivos comuns em tempo de execução para acessar seu arquivo de configuração. Isso dá ao GRUB 1 a capacidade de ler seu arquivo de configuração do sistema de arquivos em vez de incorporá-lo ao MBR, o que permite alterar a configuração em tempo de execução e especificar discos e partições em um formato legível em vez de confiar em deslocamentos (offsets). Ele também contém uma interface de linha de comando, o que facilita a correção ou modificação do GRUB se ele estiver mal configurado ou corrompido.
* O GRUB 2 difere do GRUB 1 por ter dois (opcionalmente três) estágios e ser capaz de detectar automaticamente vários sistemas operacionais e configurações automáticas. O carregador de primeiro estágio (stage1) é carregado e executado pelo BIOS a partir do registro mestre de inicialização (MBR) ou por outro carregador de inicialização do setor de inicialização de partição. Sua tarefa é descobrir e acessar vários sistemas de arquivos nos quais a configuração pode ser lida posteriormente. O carregador de estágio intermediário opcional (stage1.5) é carregado e executado pelo carregador de primeiro estágio, caso o carregador de segundo estágio não seja contíguo ou se o sistema de arquivos ou o hardware exigir tratamento especial para acessar o carregador de segundo estágio. O carregador de segundo estágio (stage2) é carregado por último e exibe o menu de inicialização do GRUB que permite ao usuário escolher um sistema operacional ou examinar e editar os parâmetros de inicialização. Depois que uma entrada de menu é escolhida e parâmetros opcionais são fornecidos, o GRUB carrega o kernel na memória e passa o controle para ele. O GRUB 2 também é capaz de carregar em cadeia de outro carregador de inicialização.
* O SYSLINUX/ISOLINUX é um gerenciador de inicialização especializado em inicializar instalações Linux completas a partir de sistemas de arquivos FAT. É frequentemente usado para disquetes de boot ou de resgate, USBs ativos e outros sistemas de inicialização leves. O ISOLINUX é geralmente usado por CDs ao vivo do Linux e CDs de instalação inicializáveis.
* O Loadlin é um gerenciador de partida que pode substituir um núcleo do DOS ou do Windows 9x com o núcleo do Linux em tempo de execução. Isso pode ser útil no caso de hardware que precisa ser ligado via software e para o qual tais programas de configuração são proprietários e só estão disponíveis para DOS. Este método de inicialização é menos necessário hoje em dia, já que o Linux possui drivers para uma infinidade de dispositivos de hardware, mas já viu algum uso em dispositivos móveis. Outro caso de uso é quando o Linux está localizado em um dispositivo de armazenamento que não está disponível para o BIOS para inicialização: o DOS ou o Windows pode carregar os drivers apropriados para compensar a limitação do BIOS e inicializar o Linux a partir daí.