MonsterInfo

Boot em Sistemas UNIX (Parte 2)

by admin on jun.03, 2008, under FreeBSD, Linux, Monster SO

No artigo anterior entendemos como o sistema de boot funciona até o ponto de ver o registro MBR, agora vamos entender como as referencias da MBR funcionam.

Agora nesta parte do artigo, não vai ter como dar moleza, vou ter que colocar muito texto, sei que muitos não tem paciencia para ler muito, mas é necessário para comprender os bootloaders do Sistemas Operacionais unix, garanto que vale a pena.

Então se preparem que ai vem muita informação técnica, vamos lá.

Referência de boot indireta

O código de MBR do tipo indireto, não inicia diretamente o kernel do sistema operacional, mas sim carrega e executa outros códigos de boot. Enquanto o código da MBR do GRUB carrega o estágio 1.5 do GRUB, (que é localizado nos 30 primeiros Kb do disco imediatamente após o MBR), o WinLoader lê a tabela de partições do disco (447º byte ao 512º byte) em busca da partição marcada como ativa, carregando e executando o primeiro bloco desta partição, chamado de Partition Boot Sector também conhecido como PBR - Partition Boot Record, comportamente semelhante realizado pelo boot loader dos BSDs, que acessam a PBR de sua partição wd0a.

O código contido no primeiro bloco da partição ativa nos sistemas MS-DOS, é apenas um JMP para a localização dos arquivos IO.SYS/MSDOS.SYS/COMMAND.COM, enquanto nos sistemas linux, este código é gerado pelos gerenciadores de boot (LILO/GRUB). Diferentemente dos sistema like-DOS em que arquivos do sistema são utilizados, os gerenciadores de boot fazem parte do primeiro bloco da partição, assim, o código gerado pelo LILO/GRUB é instalado antes do início do sistema de arquivos. Nos casos em que a MBR necessita carregar a PBR, a referência ao kernel do sistema operacional não esta na MBR, mas sim na PBR.

Uma antiga limitação do LILO é a dependência do BIOS. O suporte fornecido pela interface de comunicação com o disco do BIOS é limitado até o setor 1023º do disco, isto resulta que o LILO também fosse restrito a isto. De uma forma geral, todos as impelmentações de acesso ao hardware tentam utilizar a interface da BIOS, mas isso não é obrigatório. Uma solução para contornar este problema era criar uma pequena partição, que chegue no máximo ao setor 1023 do disco, com intuito de garantir que o kernel estivesse neste espaço acessível do disco. Esta é a razão para que antigamente fosse necessário colocarmos os arquivos de boot no diretório /boot, e este, em um sistema de arquivos separado no inicio do disco.

O LILO implementou o “Logical Block Addresses” (LBA), com isso, a “Boot Loader” simula a existência de menos setores no disco. O “Boot Loader” é responsável por este suporte, lendo a real localização do kernel no arquivo /boot/map. Como o uso do “Logical Block Addresses” (LBA) tornou-se padrão, a utilização de uma partição para os arquivos de boot (/boot) ficou obsoleto.

O comando abaixo, ms-fdisk, instala na MBR uma referência de boot indireta para a PBR da partição ativa. Note que este código não é configurável como ocorre com o LILO, este simplesbes sobrescreve o conteudo atual da MBR.

C:\> fdisk /mbr

A configuração abaixo do lilo.conf exemplifica como o LILO atua como gerenciador de boot direto para o kernel linux, e indireto (induz a execução do código bootável da partição) para um eventual “sistema do lado negro da força” (só para não fazer mensão direta ao M$):


# Gerenciador de Boot Direto
image=/boot/vmlinuz-2.6.8-2-386
label=Linux_2.6.8
root=/dev/hda2
read-only
initrd=/boot/initrd.img-2.6.8-2-386


# Gerenciador de Boot Indireto
other=/dev/hda4
label=dark_side_of_the_Force

No GRUB A opção chainloader +1 indica que o o código bootável esta na PBR da partição indicada: (hd0,0), ou seja, /dev/hda1.


# Gerenciador de Boot Indireto
title Windows boot menu
rootnoverify (hd0,0)
makeactive
chainloader +1

Referencia de boot direta

O código da MBR do tipo direto, o gerenciador de boot instalado na MBR, possui a localização física do kernel que esta disponível para boot do sistema, ou seja, head, sector, cylinder.

O acesso ao kernel e a initrd é realizado pelo código do LILO residente na MBR. Este acesso não depende do tipo de sistema de arquivos da partição, simplesmente os dados do kernel são carregados para a memória e executado-os.

Da mesma forma que o LILO, também pode-se instalar o GRUB na MBR, a diferença entre eles, é o modo de acesso ao kernel. Enquanto o LILO localiza o kernel através localização física, que também foi referenciada na MBR, o GRUB localiza o kernel através de informações do sistema de arquivos.

Intuitivamente podemos concluir que precisamos gravar LILO sempre que mudarmos o localização física do kernel, o simples ato de mover um kernel (vmlinuz*) para outro diretório e retorná-lo ao /boot tem grande chance de mudar a localização física deste kernel, enquanto que o GRUB depende de um driver de acesso ao sistema de arquivos. Assim como, a utilização do gerenciador de boot do tipo direto, não necessita de uma partição ativa, essa informação não é utilizada para continuar o boot do sistema.

É possível configurar o LILO/GRUB com uma grande variedade de opções, podendo inicializar vários sistemas operacionais, assim como, inicializar um mesmo sistema (a mesma partição raiz) com diferentes versões do kernel, o que não é possível com o Win-loader que simplesmente executando o primeiro bloco da partiçãomarcada como ativa na tabela de partições, mas também não é o objetivo do sistema da M$ bootar outros sistemas, mesmo que outras versões do próprio windows.

As configurações contidas no arquivo /etc/lilo.conf são utilizadas pelo programa lilo para gerar um código de máquina, como se fosse um montador ou compilador, que contém um menu de seleção, e as referências da localização do kernel (boot direto) ou da uma partição (boot indireto). Este código será gravado no dispositivo indicado pela opção boot= do lilo.conf. Cada arquitetura possui diferentes registadores, sendo necessário que seja gerado um código dependente da arquitetura.

Curiosidade: Para entendermos o funcionamento do boot direto e boot indireto, é possível fazer o GRUB instalado na MBR executar o LILO de uma PBR. É meio inútil, mas é bom para o entendimento. Veja abaixo:

Considerando que nosso disco primário é IDE0/Master, configure o GRUB adequadamente e instale-o na MBR (grub-install /dev/hda), caso o GRUB já esteja sendo utilizado, basta inserir a seguinte configuração:


title LILO da hda1
rootnoverify (hd0,0)
makeactive
chainloader +1

O próximo passo é configurar o /etc/lilo.conf de forma convencional, contendo as especificação do kernel. Entretando informaremos que o lilo deve ser instalado na hda1 com a opção boot=/dev/hda1. Usando o comando lilo o código binário será gerado e instalado na PBR da partição hda1.

Assim, o BIOS executará o GRUB da MBR, que executará o LILO da PBR, que executará o Kernel que esta armazenado no disco, que é carregado sem uso de drivers de sistemas de arquivos, já que o LILO realiza acesso ao disco de forma direta.

OBS: XFS não tem suporte a PBR, logo, não suporta bootloaders na partição. Não faça este teste caso você utileze XFS, caso contrário você corromperá o XFS. Isto acontece pois o superblock dele fica no block Zero da partição, aonde o LILO seria instalado, por compatibilidade discos IRIX. Quem já tentou instalar, por exemplo, o Ubuntu usando partições XFS e instalar o lilo com certeza já recebeu uma mensagem disendo que a operação não era permitida, eis o motivo.

Ná continuação trarei informações sobre esse passo do processo da inicialização dos sistemas, o tratamento da MBR, em sistemas como FreeBSD que não utiliza o Lilo nem o Grub, e também trarei informações de como interagir com a MBR, até o próximo artigo.

:, , , ,
No comments for this entry yet...

Leave a Reply

Looking for something?

Use the form below to search the site:

Still not finding what you're looking for? Drop a comment on a post or contact us so we can take care of it!

Meta