Você está na página 1de 9

Por Dentro do Processo de Inicializao do Linux

Faa uma visita monitorada, do Master Boot Record at o primeiro aplicativo de espao do usurio M. Tim Jones, Consultant Engineer, Emulex Corp. Resumo: O processo de inicializao de um sistema Linux consiste de diversos estgios. Mas quando se efetua boot em um desktop x86 padro ou um destino do PowerPC fortemente embarcado, muito de seu fluxo tem uma semelhana surpreendente. Este artigo abrange o processo de boot do Linux, desde a primeira autoinicializao at o incio do primeiro aplicativo de espao do usurio. Nesse artigo, sero vistos vrios outros tpicos relacionados ao boot, como os loaders de boot, a descompactao de kernels, o disco RAM inicial e outros elementos de boot do Linux. Data: 31/Mai/2006 Nvel: Introdutrio Atividade: 15647 visualizaes Comentrios: 0 (Visualizar | Incluir comentrio - Conectar) Mdia de classificao (47 votos) Classificar este artigo

Antigamente, para autoinicializar um computador, era preciso alimentar uma fita de papel que continha um programa de boot ou carregar manualmente um programa de boot utilizando os controles de endereo do painel frontal/dados/controle. Os computadores atuais so equipados com recursos que simplificam o processo de boot, embora no necessariamente o deixem mais simples. Vamos comear com uma visualizao de alto nvel de boot do Linux para que se tenha uma viso geral. Em seguida, revisaremos o que ocorre separadamente em cada uma das etapas. As referncias de origem durante esse processo o ajudaro a navegar pela rvore de kernel e a entender melhor esse processo. Viso Geral A Figura 1 mostra uma visualizao estratgica.

Figura 1. Visualizao Estratgica do Processo de Inicializao do Linux

Quando um sistema efetua boot pela primeira vez, o processador executa um cdigo em um local conhecido. Em um Computador Pessoal (PC), esse local o Sistema Bsico de Entrada/Sada (BIOS), que est armazenado na memria flash, na placa-me. A Unidade Central de Processamento (CPU) em um sistema embarcado solicita ao vetor de reconfigurao que inicie um programa em um endereo conhecido em flash/ROM. Nos dois casos, o resultado o mesmo. Como os PCs oferecem bastante flexibilidade, o BIOS precisa determinar quais dispositivos so candidatos ao boot. Examinaremos isso posteriormente com mais detalhes. Quando um dispositivo de boot encontrado, o loader de boot de primeiro estgio carregado na RAM e executado. Esse loader de boot tem menos de 512 bytes (um nico setor), e sua tarefa carregar o loader de boot de segundo estgio. Quando o loader de boot de segundo estgio est na RAM e em execuo, uma tela inicial geralmente exibida e o Linux e o disco RAM inicial opcional (sistema de arquivo raiz temporrio) so carregados na memria. Quando as imagens so carregadas, o loader de boot de segundo estgio passa o controle para a imagem do kernel e o kernel descompactado e inicializado. Neste estgio, o loader de boot de segundo estgio verifica o hardware do sistema, enumera os dispositivos de hardware anexados, monta o dispositivo raiz e, em seguida, carrega os mdulos de kernel necessrios. Ao ser concludo, o primeiro programa de espao de usurio (init) inicia e a inicializao do sistema de alto nvel executada. Em resumo, assim que funciona o boot do Linux. Agora vamos prosseguir e explorar alguns dos detalhes do processo de boot do Linux. Voltar para parte superior Inicializao do Sistema

O estgio de inicializao do sistema depende do hardware no qual o Linux est efetuando boot. Em uma plataforma integrada, um ambiente de autoinicializao utilizado quando o sistema ligado ou reconfigurado. Como exemplos, temos U-Boot, RedBoot e MicroMonitor da Lucent. As plataformas integradas normalmente vm de fbrica com um monitor de boot. Esses programas residem em uma regio especial da memria flash no hardware de destino e fornecem os meios para fazer download de uma imagem do kernel Linux na memria flash e, em seguida, execut-la. Alm da capacidade de armazenar e executar boot em uma imagem do Linux, esses monitores de inicializao executam alguns nveis de teste do sistema e a inicializao do hardware. Em um destino embarcado, esses monitores de inicializao costumam abranger os loaders de boot de primeiro e de segundo estgios.

Extraindo o MBR
Para ver o contedo de seu MBR, utilize o comando:
# dd if=/dev/hda of=mbr.bin bs=512 count=1 # od -xa mbr.bin

O comando dd, que precisa ser executado a partir da raiz, l os primeiros 512 bytes de /dev/hda (a primeira unidade Integrated Drive Electronics ou IDE) e os grava no arquivo mbr.bin. O comando od imprime o arquivo binrio nos formatos hex e ASCII. Em um PC, o processo de inicializao do Linux comea no BIOS, em 0xFFFF0. A primeira etapa do BIOS Power-On Self Test (POST). A tarefa do POST executar uma verificao do hardware. A segunda etapa do BIOS enumerar e inicializar o dispositivo local. Dados os diferentes usos das funes do BIOS, temos duas partes: o cdigo POST e os servios de tempo de execuo. Depois de concludo, o POST apagado da memria, mas os servios de tempo de execuo do BIOS permanecem e ficam disponveis ao sistema operacional de destino. Para inicializar um sistema operacional, o tempo de execuo do BIOS procura por dispositivos ativos e inicializveis na ordem de preferncia definida pelas configuraes de Complementary Metal Oxide Semiconductor (CMOS). Um dispositivo de boot pode ser um disco flexvel, um CD-ROM, uma partio de um disco rgido, um dispositivo na rede ou at mesmo um memory stick flash USB. Normalmente, o Linux tem boot executado a partir de um disco rgido, onde Master Boot Record (MBR) contm o loader de boot primrio. O MBR um setor de 512 bytes, localizado no primeiro setor do disco (setor 1 do cilindro 0, cabeote 0). Depois que o MBR carregado na RAM, os campos do BIOS o controlam. Voltar para parte superior Loader de Boot de Estgio 1 O loader de boot primrio, que reside no MBR, uma imagem de 512 bytes contendo o cdigo do programa e uma pequena tabela de partio (consulte a Figura 2). Os

primeiros 446 bytes so o loader de boot primrio, que contm o cdigo executvel e um texto de mensagem de erro. Os 64 bytes seguintes formam a tabela de partio, que contm um registro para cada uma das quatro parties (cada uma com 16 bytes). O MBR termina com dois bytes, que so definidos como o nmero mgico (0xAA55). O nmero mgico funciona como verificao de validao do MBR.

Figura 2. Anatomia do MBR

A funo do loader de boot primrio encontrar e carregar o loader de boot secundrio (estgio 2). Isso feito consultando a tabela particionada de uma partio ativa. Ao localizar uma partio ativa, ele faz uma varredura das parties restantes na tabela, a fim de certificar-se de que todas esto inativas. Quando isso verificado, o registro de boot da partio ativa lido a partir do dispositivo para a RAM e executado. Voltar para parte superior Loader de Boot de Estgio 2 O loader de boot secundrio, ou de segundo estgio, pode ser chamado de loader de kernel. Neste estgio, sua tarefa carregar o kernel Linux e o disco RAM inicial opcional.

Loaders de Boot de Estgio GRUB

O diretrio /boot/grub contm os loaders de boot stage1, stage1.5, e stage2, bem como diversos loaders alternativos (por exemplo, os CR-ROMs usam iso9660_stage_1_5). Os loaders de boot de primeiro e segundo estgios combinados so chamados de Linux Loader (LILO) ou GRand Unified Bootloader (GRUB) no ambiente x86 do PC. Como o LILO apresenta algumas desvantagens que foram corrigidas no GRUB, vejamos o GRUB. (Consulte muitos recursos adicionais sobre GRUB, LILO e tpicos relacionados na seo Recursos, mais adiante neste artigo.) O ponto alto do GRUB que ele inclui o conhecimento dos sistemas de arquivo Linux. Em vez de utilizar setores brutos no disco, como o LILO faz, o GRUB pode carregar um kernel Linux a partir de um sistema de arquivos ext2 ou ext3. Isso feito transformando o loader de boot de dois estgios em um de trs estgios. O estgio 1 executa boot em um loader de boot de estgio intermedirio (1,5), que compreende o sistema de arquivos especfico, contendo a imagem do kernel Linux. Como exemplos, temos reiserfs_stage1_5 (para carregar a partir de um sistema de arquivos com registro de mudanas Reiser) ou e2fs_stage1_5 (para carregar a partir de um sistema de arquivos ext2 ou ext3). Quando o loader de boot do estgio intermedirio estiver carregado e em execuo, o loader de boot do estgio 2 poder ser carregado. Quando o estgio 2 estiver carregado, o GRUB poder, mediante solicitao, exibir uma lista dos kernels disponveis (definidos em /etc/grub.conf, com soft links de /etc/grub/menu.lst e /etc/grub.conf). possvel selecionar um kernel e at aditlo com parmetros adicionais de kernel. Opcionalmente, possvel utilizar shell de linha de comandos para obter um maior controle manual sobre o processo de boot. Com o loader de boot de segundo estgio na memria, o sistema de arquivos consultado e a imagem de kernel padro e a imagem initrd so carregadas na memria. Com as imagens prontas, o loader de boot de estgio 2 chama a imagem de kernel. Voltar para parte superior Kernel

Boot Manual no GRUB


A partir da linha de comandos do GRUB, possvel executar boot em um kernel especfico com uma imagem initrd nomeada, como a seguir:
grub> kernel /bzImage-2.6.14.2 [Linux-bzImage, setup=0x1400, size=0x29672e] grub> initrd /initrd-2.6.14.2.img [Linux-initrd @ 0x5f13000, 0xcc199 bytes] grub> boot Descompactando Linux... Ok, executando boot no kernel.

Se no souber o nome do kernel que ser executado o boot, aperte a barra (/) e pressione a tecla Tab. O GRUB exibir a lista de kernels e imagens initrd. Com a imagem de kernel na memria e o controle fornecido no loader de boot de estgio 2, o estgio do kernel comea. A imagem do kernel no bem um kernel executvel, mas uma imagem de kernel compactada. Em geral uma zImage (imagem compactada, com menos de 512KB) ou uma bzImage (imagem compactada grande, com mais de 512KB), previamente compactada com zlib. No incio dessa imagem de kernel h uma rotina que executa uma quantidade mnima de configuraes de hardware e, em seguida, descompacta o kernel contido na imagem de kernel, deixando-o com bastante memria. Se houver uma imagem de disco RAM inicial, essa rotina vai para a memria e a usa futuramente. A rotina chama ento o kernel e a execuo de seu boot iniciada. Quando bzImage (para uma imagem i386) chamada, voc inicia em ./arch/i386/boot/head.S na rotina de montagem start (consulte a Figura 3 para o fluxo principal). Essa rotina efetua algumas configuraes bsicas de hardware e chama a rotina startup_32 em ./arch/i386/boot/compressed/head.S. Essa rotina configura um ambiente bsico (pilha, etc.) e limpa o Block Started by Symbol (BSS). Em seguida, o kernel descompactado por meio de uma chamada uma funo C, denominada decompress_kernel (localizada em ./arch/i386/boot/compressed/misc.c). Quando o kernel descompactado na memria, ele chamado. Esta ainda outra funo startup_32, mas essa funo est em ./arch/i386/kernel/head.S. Na nova funo startup_32 (tambm denominada swapper ou processo 0), as tabelas de pginas so inicializadas e a paginao de memria ativada. detectado o tipo de CPU, junto com qualquer Unidade Opcional de Ponto Flutuante (FPU), e so armazenados para uso futuro. A funo start_kernel ento chamada (init/main.c), o levando ao kernel Linux que especificamente no faz parte da arquitetura. Isto , basicamente, a funo main do kernel Linux.

Figura 3. As Funes Principais Fluem para o Boot do Kernel i386 Linux

Ao chamar start_kernel, uma lista grande de funes de inicializao chamada para configurar interrupes, executar configurao de memria adicional e carregar o disco RAM inicial. Ao final, faz-se uma chamada para kernel_thread (em arch/i386/kernel/process.c) para iniciar a funo init, que o primeiro processo de espao do usurio. Por fim, a tarefa ociosa iniciada e o planejador agora pode assumir o controle (depois da chamada para cpu_idle). Com as interrupes ativadas, o planejador antecipado assume periodicamente o controle para fornecer vrias tarefas. Durante a inicializao do kernel, o disco RAM inicial (initrd) que havia sido carregado na memria no loader de boot de estgio 2 copiado na RAM e montado. Essa srie initrd atua como um sistema de arquivos raiz temporrio na RAM e permite que o kernel execute boot totalmente, sem precisar montar nenhum disco fsico. Como os mdulos necessrios para fazer interface com os perifricos podem fazer parte de initrd, o kernel pode ser muito pequeno, mas ainda oferecer suporte a um grande nmero de configuraes possvel de hardware. Depois que o kernel executa boot, o sistema de arquivos raiz dinamizado (por meio de pivot_root), no qual o sistema de arquivos raiz initrd desmontado e o sistema de arquivos raiz real montado.

Sada decompress_kernel
A funo decompress_kernel onde voc v as mensagens de descompactao usuais emitidas para o monitor:
Descompactando Linux... Ok, executando boot no kernel.

A funo initrd permite criar um pequeno kernel de Linux com drivers compilados como mdulos carregveis. Esses mdulos carregveis possibilitam que o kernel tenha meios de acesso aos discos e aos sistemas de arquivos desses discos, bem como aos drivers de outros recursos de hardware. Como o sistema de arquivos raiz um sistema de arquivos em um disco, a funo initrd fornece um meio de efetuar a autoinicializao para obter acesso ao disco e montar o sistema de arquivos raiz real. Em um destino embarcado sem um disco rgido, initrd pode ser o sistema de arquivos raiz final ou esse sistema de arquivos raiz final pode ser montado por meio do Network File System (NFS). Voltar para parte superior Init Aps executar boot e inicializado, o kernel inicia o aplicativo do primeiro espao do usurio. Ele o primeiro programa chamado, compilado com a biblioteca C padro. At este momento no processo, nenhum aplicativo C padro foi executado. Em um sistema Linux de desktop, o primeiro aplicativo iniciado geralmente /sbin/init. Mas isso no precisa ser assim. Os sistemas embarcados raramente exigem a inicializao extensiva fornecida por init (como configurado por /etc/inittab). Em muitos casos, possvel chamar um simples script de shell que inicie os aplicativos embarcados necessrios.

Voltar para parte superior Resumo Assim como o prprio Linux, o processo de inicializao do Linux bastante flexvel, suportando um grande nmero de processadores e plataformas de hardware. No incio, o loader de boot loadlin oferecia uma maneira simples de inicializar o Linux, de forma simples. O loader de boot LILO expandia as capacidades de inicializao, mas no percebia que nenhum sistema de arquivos estava faltando. A mais recente gerao de loaders de boot, como o GRUB, permite que o Linux inicialize a partir de uma variedade de sistemas de arquivos (do Minix ao Reiser).

Recursos Aprender

Boot Records Revealed um grande recurso nos MBRs e nos diversos loaders de boot. Ele no apenas desmonta os MBRs, como tambm discute o GRUB, o LILO e os vrios loaders de boot do Windows. Verifique a pgina Geometria do Disco para entender os discos e suas geometrias. Ser encontrado um resumo interessante das atribuies de discos. Um Live CD um sistema operacional que pode ser inicializado a partir de um CD ou DVD sem precisar de um disco rgido. "Boot loader showdown: Getting to know LILO and GRUB" (developerWorks, agosto de 2005) oferece um exame detalhado nos loaders de boot LILO e GRUB. Na srie de tutoriais do developerWorks, Linux Professional Institute (LPI) exam prep, obtenha uma introduo completa sobre como executar boot em um sistema Linux e muitas outras tarefas fundamentais do Linux, enquanto voc se prepara para a certificao de administrador do sistema. LILO foi o precursor do GRUB, mas ainda possvel encontr-lo ao executar boot no Linux. O comando mkintrd utilizado para criar uma imagem de disco RAM inicial. Esse comando til ao criar um sistema inicial de arquivos raiz para executar boot na configurao, permitindo o pr-carregamento dos dispositivos de blocos necessrios para acessar o sistema de arquivos raiz real. No Debian Linux Kernel Project, obtenha mais informaes sobre o kernel, boot e desenvolvimento embarcado do Linux. Na zona Linux do developerWorks, encontre mais recursos para desenvolvedores Linux.

Fique atualizado com eventos tcnicos e Webcasts do developerWorks.

Obter produtos e tecnologias

O programa MicroMonitor oferece um ambiente de boot para vrios dispositivos de destino pequenos. possvel utilizar esse monitor para executar boot no Linux em um ambiente embarcado. Ele tem portas para ARM, XScale, MIPS, PowerPC, Coldfire e Super-H da Hitachi. GNU GRUB um shell de boot repleto de opes e flexibilidade. LinuxBIOS uma substituio do BIOS. No somente executa boot no Linux e no prprio LinuxBIOS, como um kernel compactado do Linux. OpenBIOS outro projeto porttil de BIOS que funciona em diversas arquiteturas como x86, Alpha e AMD64. No kernel.org, obtenha a rvore mais recente do kernel. Solicite o SEK para Linux, um conjunto de dois DVDs que contm o software de perodo experimental IBM mais recente para Linux a partir do DB2, Lotus, Rational, Tivolie WebSphere. Com o Software de perodo experimental IBM, disponvel para download diretamente do developerWorks, construa seu prximo projeto de desenvolvimento em Linux.

Discutir

Verifique blogs do developerWorks e envolva-se com a comunidade do developerWorks.

Sobre o autor

M. Tim Jones um arquiteto de firmwares embarcados e autor de Inteligncia Artificial: Sistemas de Abordagem, GNU/Linux, Programao de Aplicativos AI (atualmente em sua segunda edio), Programao de Aplicativos AI (em sua segunda edio) e BSD Sockets Programming from a Multilanguage Perspective. Sua formao em engenharia vai desde o desenvolvimento de kernels para nave espacial geossincrnica at a arquitetura de sistema embarcado e o desenvolvimento de protocolos de interligao de redes. Tim um Engenheiro Consultor para a Emulex Corp. em Longmont, Colorado. Classificar este artigo

Você também pode gostar