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.
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:
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).
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:
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.
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).
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 /path/to/kernelfile
Use the qualified
/boot/GENERIC/kernel
to refer to
the default kernel that comes with an installation, or
/boot/kernel.old/kernel
, to refer to the
previously installed kernel before a system upgrade or before
configuring a custom kernel.
Use the following to load the usual modules with another kernel. Note that in this case it is not necessary the qualified name:
unload
set kernel="mykernel
"
boot-conf
Para carregar um script de configuração do kernel automatizado:
load -t userconfig_script /boot/kernel.conf
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.
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.
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.
/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.
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
.
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>.