Capítulo 12. O processo de inicialização do FreeBSD

Esta tradução pode estar desatualizada. Para ajudar com as traduções, acesse a ferramenta de traduções do FreeBSD.

12.1. Sinopse

O processo de iniciar um computador e carregar o sistema operacional é chamado de "processo de bootstrap", ou de "inicialização". O processo de boot do FreeBSD fornece uma grande flexibilidade na personalização do que acontece quando o sistema é iniciado, incluindo a capacidade de selecionar diferentes sistemas operacionais instalados no mesmo computador, diferentes versões do mesmo sistema operacional ou um kernel instalado diferente.

Este capítulo detalha as opções de configuração que podem ser definidas. Ele demonstra como personalizar o processo de inicialização do FreeBSD, incluindo tudo o que acontece até que o kernel do FreeBSD tenha iniciado, procurado por dispositivos e iniciado o init(8). Isso ocorre quando a cor do texto das mensagens de inicialização muda de branco brilhante para cinza.

Depois de ler este capítulo, você reconhecerá:

  • Os componentes do sistema de boot do FreeBSD e como eles interagem.

  • As opções que podem ser passadas para os componentes no bootstrap do FreeBSD para controlar o processo de inicialização.

  • Como configurar uma tela personalizada de inicialização.

  • O básico da configuração de device hints.

  • Como inicializar no modo de usuário único e multiusuário e como encerrar corretamente um sistema FreeBSD.

Este capítulo descreve apenas o processo de inicialização do FreeBSD rodando em sistemas x86 e amd64.

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.

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 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 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

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. 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 1. Comandos Internos do Loader
VariávelDescriçã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. 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 2. Interação do Kernel durante o Boot
OpçãoDescriçã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 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.

12.3. Configurando telas iniciais de inicialização

Normalmente, quando um sistema FreeBSD inicializa, ele exibe seu progresso com uma série de mensagens no console. Uma tela inicial de inicialização cria uma tela de inicialização alternativa que oculta todo o probe de inicialização e as mensagens de inicialização de serviços. Algumas mensagens do boot loader, incluindo o menu de opções de inicialização e um prompt de contagem regressiva de espera, são exibidas no momento da inicialização, mesmo quando a tela inicial está ativada. A exibição da tela inicial pode ser desativada pressionando qualquer tecla do teclado durante o processo de inicialização.

Existem dois ambientes básicos disponíveis no FreeBSD. O primeiro é o ambiente padrão de linha de comando do console virtual legado. Depois que o sistema conclui a inicialização, é exibido um prompt de login do console. O segundo ambiente é um ambiente gráfico configurado. Consulte O sistema X Window para obter maiores informações sobre como instalar e configurar um gerenciador gráfico de tela e um gerenciador gráfico de login.

Depois que o sistema inicializa, a tela inicial é definida como proteção de tela. Após um período sem uso, a tela inicial será exibida e passará por etapas de mudança de intensidade da imagem, de brilhante a muito escuro e vice-versa. A configuração do protetor de tela inicial pode ser sobrescrita, adicionando-se uma linha saver= ao /etc/rc.conf. Vários protetores de tela embutidos estão disponíveis e descritos em splash(4). A opção saver= aplica-se apenas aos consoles virtuais e não tem efeito nos gerenciadores gráficos de telas.

Ao instalar o pacote ou port sysutils/bsd-splash-changer, uma imagem inicial aleatória de uma coleção será exibida na inicialização. A função tela inicial suporta 256 cores nos formatos bitmap (.bmp), ZSoft PCX (.pcx), ou TheDraw (.bin). A imagem .bmp, .pcx, ou .bin tem que ser colocada na partição root, em /boot por exemplo. Os arquivos de imagens iniciais tem que ter a resolução de 320 por 200 pixels ou menos para funcionarem em adaptadores VGA padrão. Para a tela inicial padrão de 256 cores e 320 por 200 pixels ou menos, adicione as seguintes linhas ao /boot/loader.conf. Substitua splash.bmp com o nome do arquivo bitmap a ser utilizado:

splash_bmp_load="YES"
bitmap_load="YES"
bitmap_name="/boot/splash.bmp"

Para usar um arquivo PCX em vez de um arquivo bitmap:

splash_pcx_load="YES"
bitmap_load="YES"
bitmap_name="/boot/splash.pcx"

Em vez disso, use ASCII art no formato https://en.wikipedia.org/wiki/TheDraw:

splash_txt="YES"
bitmap_load="YES"
bitmap_name="/boot/splash.bin"

Outras opções interessantes do arquivo loader.conf incluem:

beastie_disable="YES"

Isso impedirá que o menu de opções de inicialização seja exibido, mas o prompt de contagem regressiva da espera programada ainda estará presente. Mesmo com a exibição do menu de opções de inicialização desabilitada, entrar com uma seleção de opção no prompt de contagem decrescente de tempo programado ativará a opção de inicialização correspondente.

loader_logo="beastie"

Isso substituirá as palavras padrão "FreeBSD", que são exibidas à direita do menu de opções de inicialização, com o logotipo colorido do beastie.

Para maiores informações, consulte splash(4), loader.conf(5), and vga(4).

12.4. Sugestões de dispositivos

Durante o começo da inicialização do sistema, o boot loader(8) lê o device.hints(5). Este arquivo armazena informações de inicialização do kernel conhecidas como variáveis, algumas vezes referenciadas como "sugestão de devices". Estas "sugestões de devices" são usados pelos drivers de dispositivo para configuração do dispositivo.

As sugestões de dispositivos também são especificadas no estágio 3 do prompt do boot loader, conforme demonstrado em Estágio três. As variáveis podem ser adicionadas usando set, removidas com unset e visualizadas show. Variáveis configuradas no arquivo /boot/device.hints também podem ser sobrescritas. As sugestões de dispositivos inseridas no boot loader não são permanentes e não serão aplicadas na próxima reinicialização.

Uma vez que o sistema é inicializado, kenv(1) pode ser usado para despejar todas as variáveis.

A sintaxe para o arquivo /boot/device.hints é uma variável por linha, usando o hash "#" como marcadores de comentário. As linhas são construídas da seguinte forma:

 hint.driver.unit.keyword="value"

A sintaxe para o estágio 3 do boot loader é:

 set hint.driver.unit.keyword=value

onde driver é o nome do driver de dispositivo, unit é o número da unidade de driver do dispositivo, e keyword é a palavra-chave sugerida. A palavra-chave pode consistir das seguintes opções:

  • at: especifica o barramento ao qual o dispositivo está conectado.

  • port: especifica o endereço inicial de I/O a ser usado.

  • irq: especifica o número da requisição de interrupção a ser usada.

  • drq: especifica o número do canal DMA.

  • maddr: especifica o endereço de memória física ocupado pelo dispositivo.

  • flags: define vários bits de flags para o dispositivo.

  • disabled: se definido como 1, o dispositivo é desativado.

Como os drivers de dispositivo podem aceitar ou exigir mais sugestões não listadas aqui, é recomendável exibir uma página de manual do driver. Para obter mais informações, consulte device.hints(5), kenv(1), loader.conf(5), e loader(8).

12.5. Sequência de Desligamento

Após desligamento controlado usando shutdown(8), o init(8) tentará executar o script /etc/rc.shutdown e, em seguida, enviará a todos os processos o sinal TERM e, subsequentemente, o sinal KILL para qualquer um que não termine em tempo hábil.

Para desligar uma máquina FreeBSD em arquiteturas e sistemas que suportam gerenciamento de energia, use o shutdown -p now para desligar a energia imediatamente. Para reinicializar um sistema FreeBSD, use o shutdown -r now. É preciso ser root ou um membro de operator para executar shutdown(8). Também é possível usar halt(8) e reboot(8). Consulte as páginas de manual e o shutdown(8) para obter mais informações.

Modifique a associação ao grupo referindo-se a Usuários e Gerenciamento Básico de Contas.

O gerenciamento de energia requer que o acpi(4) seja carregado como um módulo ou estaticamente compilado em um kernel personalizado.


Última alteração em: 9 de março de 2024 por Danilo G. Baio