12.2. Processo de Inicialização do FreeBSD
Anterior | Capítulo 12. O processo de inicialização do FreeBSD | Próxima

## 12.2. Processo de Inicialização do FreeBSD

Ligar um computador e iniciar o sistema operacional representa um dilema interessante. Por definição, o computador não sabe como fazer nada até que o sistema operacional seja iniciado. Isso inclui executar programas a partir do disco. Se o computador não pode executar um programa a partir do disco sem o sistema operacional e os programas do sistema operacional estão no disco, como o sistema operacional é iniciado?

Este problema é semelhante ao do livro As Aventuras do Barão de Munchausen. Um personagem tinha caído no meio de um bueiro, e se retirou agarrando suas botas e levantando. Nos primeiros dias da computação, o termo bootstrap era aplicado ao mecanismo usado para carregar o sistema operacional. Desde então, foi encurtado para “booting”.

No hardware x86, o Sistema Básico de Entrada/Saída (BIOS) é responsável por carregar o sistema operacional. O BIOS procura no disco rígido pelo Master Boot Record (MBR), que deve estar localizado em um local específico do disco. O BIOS tem conhecimento suficiente para carregar e executar o MBR, e assume que o MBR pode então executar o restante das tarefas envolvidas no carregamento do sistema operacional, possivelmente com a ajuda do BIOS.

### Nota:

O FreeBSD permite inicializar a partir do padrão mais antigo do MBR e da nova Tabela de Partição GUID (GPT). O particionamento GPT geralmente é encontrado em computadores com a Interface de Firmware Unificada e Extensivel (UEFI). No entanto, o FreeBSD pode inicializar a partir de partições de GPT mesmo em máquinas com apenas BIOS legado com o gptboot( 8). O trabalho está em andamento para fornecer a inicialização direta a partir do UEFI.

O código dentro do MBR é normalmente chamado de gerenciador de inicialização, especialmente quando ele interage com o usuário. O gerenciador de inicialização geralmente tem mais código na primeira faixa do disco ou dentro do sistema de arquivos. Exemplos de gerenciadores de inicialização incluem o gerenciador de boot padrão do FreeBSD boot0, também chamado Boot Easy, e o Grub, que é usado por muitas distribuições Linux®.

Se apenas um sistema operacional estiver instalado, o MBR procura pelo primeiro slice inicializável (ativo) no disco e, em seguida, executa o código nesse slice para carregar o restante do sistema operacional. Quando vários sistemas operacionais estão presentes, um gerenciador de inicialização diferente pode ser instalado para exibir uma lista de sistemas operacionais para que o usuário possa selecionar um para inicializar.

O restante do sistema de boot do FreeBSD é dividido em três estágios. O primeiro estágio sabe apenas o suficiente para colocar o computador em um estado específico e executar o segundo estágio. O segundo estágio pode fazer um pouco mais, antes de executar o terceiro estágio. O terceiro estágio termina a tarefa de carregar o sistema operacional. O trabalho é dividido em três etapas porque o MBR coloca limites no tamanho dos programas que podem ser executados nos estágios um e dois. Encadear as tarefas juntas permite que o FreeBSD forneça um carregador mais flexível.

O kernel é então iniciado e começa a sondar os dispositivos e inicializá-los para uso. Quando o processo de inicialização do kernel é finalizado, o kernel passa o controle para o processo de usuário init(8), que garante que os discos estejam em estado utilizável, inicia a configuração de recursos no nível de usuário que monta sistemas de arquivos, configura placas de rede para se comunicar na rede e inicia os processos que foram configurados para serem executados na inicialização.

Esta seção descreve esses estágios em mais detalhes e demonstra como interagir com o processo de inicialização do FreeBSD.

### 12.2.1. O gerenciador de inicialização

O código do gerenciador de inicialização no MBR é às vezes chamado de estágio zero do processo de inicialização. Por padrão, o FreeBSD usa o gerenciador de boot boot0.

O MBR instalado pelo instalador do FreeBSD é baseado no `/boot/boot0`. O tamanho e a capacidade do boot0 são restritos a 446 bytes devido à tabela de slices e ao identificador `0x55AA` no final do MBR. Se o boot0 e vários sistemas operacionais estiverem instalados, uma mensagem semelhante a este exemplo será exibida no momento da inicialização:

Exemplo 12.1. Captura de tela do `boot0`

    F1 Win
    F2 FreeBSD

    Default: F2

Outros sistemas operacionais sobrescreverão um MBR existente se forem instalados após o FreeBSD. Se isto acontecer, ou para substituir o MBR existente com o MBR do FreeBSD, use o seguinte comando:

    # fdisk -B -b /boot/boot0 device

onde `device` é o disco de inicialização, como `ad0` para o primeiro disco IDE, `ad2` para o primeiro disco IDE em um segundo controlador IDE, ou `da0` para o primeiro disco SCSI. Para criar uma configuração personalizada do MBR, consulte boot0cfg(8).

### 12.2.2. Estágio Um e Estágio Dois

Conceitualmente, o primeiro e o segundo estágios fazem parte do mesmo programa na mesma área do disco. Por causa das restrições de espaço, eles foram divididos em dois, mas são sempre instalados juntos. Eles são copiados do combinado `/boot/boot` pelo instalador do FreeBSD ou pelo `bsdlabel`.

Estes dois estágios estão localizados fora do sistema de arquivos, na primeira trilha do slice de inicialização, começando pelo primeiro setor. É ali onde o boot0, ou qualquer outro gerenciador de inicialização, espera encontrar um programa para executar, o qual continuará o processo de inicialização.

O primeiro estágio, `boot1`, é muito simples, pois pode ter apenas 512 bytes de tamanho. Ele sabe o suficiente sobre o FreeBSD bsdlabel, que armazena informações sobre o slice, para localizar e executar o `boot2`.

O estágio dois, `boot2`, é um pouco mais sofisticado, e entende o sistema de arquivos do FreeBSD o suficiente para encontrar arquivos. Ele pode fornecer uma interface simples para escolher o kernel ou loader para ser executado. Ele executa o loader, que é muito mais sofisticado e fornece um arquivo de configuração de inicialização. Se o processo de inicialização for interrompido no estágio dois, a seguinte tela interativa será exibida:

Exemplo 12.2. Captura de tela do `boot2`

    >> FreeBSD/i386 BOOT
    Default: 0:ad(0,a)/boot/loader
    boot:

Para substituir o `boot1` e `boot2` instalados, use o `bsdlabel`, onde `diskslice` é o disco e o slice para inicializar, como `ad0s1` para o primeiro slice no primeiro disco IDE:

    # bsdlabel -B diskslice

### Atenção:

Se apenas o nome do disco for usado, como `ad0`, o `bsdlabel` criará o disco no “modo perigosamente dedicado”, sem slices. Esta provavelmente não é a ação desejada, então verifique novamente o `diskslice` antes de pressionar Return.

### 12.2.3. Estágio três

O loader é o estágio final do processo de bootstrap de três estágios. Ele está localizado no sistema de arquivos, geralmente como `/boot/loader`.

O loader é projetado como um método interativo para configuração, usando um conjunto de comandos embutidos, auxiliado por um interpretador mais poderoso que possui um conjunto de comandos mais complexo.

Durante a inicialização, o loader procurará por um console e por discos, e descobrirá de qual disco está sendo inicializado. Ele irá definir as variáveis ​​de acordo, e um interpretador é iniciado onde os comandos do usuário podem ser passados ​​a partir de um script ou usados interativamente.

O loader então lerá o `/boot/loader.rc`, que por padrão lê o `/boot/defaults/loader.conf` que define padrões razoáveis para variáveis ​​e lê o `/boot/loader.conf` para mudanças locais nessas variáveis. O `loader.rc` então age sobre essas variáveis, carregando os módulos e o kernel selecionados.

Finalmente, por padrão, o loader realiza uma espera de 10 segundos por pressionamentos de teclas, e inicializa o kernel se não for interrompido. Se interrompido, o usuário é apresentado a um prompt que compreende o conjunto de comandos, no qual o usuário pode ajustar variáveis, descarregar todos os módulos, carregar módulos e finalmente inicializar ou reinicializar. Tabela 12.1, “Comandos Internos do Loader” lista os comandos do loader mais usados. Para uma discussão completa de todos os comandos disponíveis, consulte loader(8).

Tabela 12.1. Comandos Internos do Loader

Variável | Descrição
--- | ---
autoboot `segundos` | Prossegue para inicializar o kernel se não for interrompido dentro do intervalo de tempo dado, em segundos. Ele exibe uma contagem regressiva e o intervalo de tempo padrão é de 10 segundos.
boot [`-options`] [`kernelname`] | Imediatamente prossegue a inicialização do kernel, com qualquer opção especificada ou nome do kernel. Fornecer um nome de kernel na linha de comando só é aplicável depois que um `unload` foi emitido. Caso contrário, o kernel previamente carregado será usado. Se o nomedokernel não estiver qualificado, ele será pesquisado em /boot/kernel e /boot/modules.
boot-conf | Passa pela mesma configuração automática de módulos baseada em variáveis ​​especificadas, mais comumente `kernel`. Isso só faz sentido se `unload` for usado primeiro, antes de alterar algumas variáveis.
help [`tópico`] | Mostra mensagens de ajuda lidas de `/boot/loader.help`. Se o tópico fornecido for `index`, a lista de tópicos disponíveis será exibida.
include `nomedoarquivo`… | Lê o arquivo especificado e interpreta-o linha por linha. Um erro interrompe imediatamente o `include`.
load [-t `type`] `filename` | Carrega o kernel, módulo do kernel ou arquivo do tipo especificado, com o nome de arquivo especificado. Quaisquer argumentos após o `nomedoarquivo` são passados ​​para o arquivo. Se nomedoarquivo não estiver qualificado, ele será pesquisado em /boot/kernel e /boot/modules.
ls [-l] [`path`] | Exibe uma listagem de arquivos do caminho fornecido ou do diretório raiz, se o caminho não for especificado. Se `-l` for especificado, os tamanhos dos arquivos também serão mostrados.
lsdev [-v] | Lista todos os dispositivos dos quais é possível carregar módulos. Se `-v` for especificado, mais detalhes serão impressos.
lsmod [-v] | Exibe os módulos carregados. Se `-v` for especificado, mais detalhes serão mostrados.
more `nomedoarquivo` | Exibe os arquivos especificados, com uma pausa em cada `LINES` exibidas.
reboot | Reinicia imediatamente o sistema.
set `variable`, set `variable`=`value` | Define as variáveis ​​de ambiente especificadas.
unload | Remove todos os módulos carregados.

Aqui estão alguns exemplos práticos de uso do loader. Para inicializar o kernel usual no modo single-user :

    boot -s

Para descarregar o kernel e os módulos usuais e, em seguida, carregar o kernel anterior ou outro especificado:

    unload
    load kernel.old

Use o `kernel.GENERIC` para se referir ao kernel padrão que vem com uma instalação, ou `kernel.old`, para se referir ao kernel previamente instalado antes de uma atualização do sistema ou antes de configurar um kernel personalizado.

Use o seguinte para carregar os módulos usuais com outro kernel:

    unload
    set kernel="kernel.old"
    boot-conf

Para carregar um script de configuração do kernel automatizado:

    load -t userconfig_script /boot/kernel.conf

### 12.2.4. Último estágio

Quando o kernel é carregado pelo loader ou pelo boot2, que ignora o loader, ele examina qualquer flag de inicialização e ajusta seu comportamento conforme necessário. Tabela 12.2, “Interação do Kernel durante o Boot” lista os flags de inicialização comumente usados. Consulte boot(8) para obter mais informações sobre os outros sinalizadores de inicialização.

Tabela 12.2. Interação do Kernel durante o Boot

Opção | Descrição
--- | ---
`-a` | Durante a inicialização do kernel, solicita que o dispositivo seja montado como o sistema de arquivos raiz.
`-C` | Inicialize o sistema de arquivos raiz a partir de um CDROM.
`-s` | Inicialize no modo single-user.
`-v` | Seja mais detalhado durante a inicialização do kernel.

Uma vez que o kernel terminou a inicialização, ele passa o controle para o processo de usuário init(8), localizado em `/sbin/init`, ou o caminho do programa especificado na variável `init_path` no `loader`. Este é o último estágio do processo de inicialização.

A sequência de inicialização garante que os sistemas de arquivos disponíveis no sistema estejam consistentes. Se um sistema de arquivos UFS não estiver e o `fsck` não puder corrigir as inconsistências, o init jogará o sistema no modo single-user para que o administrador do sistema possa resolver o problema diretamente. Caso contrário, o sistema é inicializado no modo multi-user.

#### 12.2.4.1. Modo Single-User

Um usuário pode especificar este modo inicializando com `-s` ou definindo a variável `boot_single` no loader. Ele também pode ser alcançado executando o `shutdown now` do modo multi-user. O modo single-user começa com esta mensagem:

    Enter full pathname of shell or RETURN for /bin/sh:

Se o usuário pressionar Enter, o sistema entrará no Bourne shell padrão. Para especificar um shell diferente, insira o caminho completo para o shell.

O modo single-user é geralmente usado para reparar um sistema que não inicializa devido a um sistema de arquivos inconsistente ou a um erro em um arquivo de configuração de inicialização. Ele também pode ser usado para redefinir a senha do `root` quando ela é desconhecida. Essas ações são possíveis porque o prompt do modo single-user fornece acesso local completo ao sistema e seus arquivos de configuração. Não há rede neste modo.

Embora o modo single-user seja útil para reparar um sistema, ele representa um risco de segurança, a menos que o sistema esteja em um local fisicamente seguro. Por padrão, qualquer usuário que possa obter acesso físico a um sistema terá controle total desse sistema após a inicialização no modo single-user.

Se o `console` do sistema for alterado para `insecure` em `/etc/ttys`, o sistema solicitará primeiro a senha do `root` antes de iniciar o modo single-user. Isso adiciona uma medida de segurança ao remover a capacidade de redefinir a senha do `root` quando ela é desconhecida.

Exemplo 12.3. Configurando um Console Inseguro em `/etc/ttys`

    # name  getty                           type    status          comments
    #
    # If console is marked "insecure", then init will ask for the root password
    # when going to single-user mode.
    console none                            unknown off insecure

Um console `inseguro` significa que a segurança física para o console é considerada insegura, portanto, apenas alguém que conheça a senha do `root` pode usar o modo single-user.

#### 12.2.4.2. Modo Multi-User

Se o init encontrar os sistemas de arquivos em ordem, ou quando o usuário tiver concluído seus comandos no modo de usuário único e tiver digitado `exit` para deixar o modo single-user, o sistema entra no modo multi-user, no qual inicia a configuração de recursos do sistema.

O sistema de configuração de recursos lê os padrões de configuração do `/etc/defaults/rc.conf` e detalhes específicos do sistema a partir do `/etc/rc.conf`. Em seguida, ele monta os sistemas de arquivos do sistema listados em `/etc/fstab`. Ele inicia serviços de rede, daemons diversos do sistema e, em seguida, os scripts de inicialização dos pacotes instalados localmente.

Para saber mais sobre o sistema de configuração de recursos, consulte rc(8) e examine os scripts localizados em `/etc/rc.d`.

Anterior | Acima | Próxima
Capítulo 12. O processo de inicialização do FreeBSD | Principal | 12.3. Configurando telas iniciais de inicialização

All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/

Questions that are not answered by the documentation may be sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.