Home Map Index Search News Archives Links About LF
[Top Bar]
[Bottom

Bar]
[Photo of the

Author]
Yap De Ken
Sobre o autor: Mora em Sydney, Austrália. Primeiro encontrou o Unix em 1979 e tem usado Linux nos últimos 4 anos para processamento de textos, acesso Internet e dar suporte ao seu passatempo com eletrônica. Quando não está brincando com Linux ou não está em seu trabalho diário, gosta de viajar, conhecer pessoas interessantes, experimentar novos roteiros ou apenas apreciar os arredores ao dar um passeio. Trabalha em uma companhia multinacional como um cientista pesquisador.

Contate o autor

Uma introdução ao boot de rede e ao Etherboot

[Ilustration]

Sumário: Este é um artigo avançado que explica como inicializar seu computador a partir de um programa armazenado em memória não-volátil sem acessar seu disco rígido. É uma técnica ideal para manter e configurar um conjunto de máquinas Linux.




O que é boot de rede?

O boot de rede é uma idéia velha. A idéia central é que o computador tenha algum código de inicialização em memória não-volátil, por exemplo um chip ROM, permitindo que um servidor seja contatado e que envie arquivos de sistema através da rede. Um dos objetivos é evitar o uso de um disco rígido para o boot. Há várias razões para se fazer isto. Uma é reduzir o custo de se manter software em muitas máquinas diferentes. Com o boot via rede, os arquivos são mantidos em um servidor central e podem ser atualizados através de um só local. Outro objetivo é usar computadores em locais onde os discos rígidos não são robustos o bastante. Por exemplo, um computador em um piso de fábrica, onde um disco rígido pudesse ser demasiadamente frágil. Finalmente um outro objetivo é ter um sistema que possa ser comutado entre diferentes sistemas operacionais sem ter que reinstalar o software.

O boot via rede co-existe frequentemente com boot de disco. Por exemplo, um sistema pode executar o Windows do disco mas às vezes carregar o Linux via rede. Há algumas aplicações interessantes desta técnica. Por exemplo: um amigo usa isto para restaurar o Windows através da rede. Quando uma instalação do Windows se torna corrompida, como frequentemente ocorre, o administrador do sistema pode restaurar a instalação, carregando o Linux através da rede e fazendo com que um script automático formate o disco e copie nele uma instalação nova do Windows.

Como funciona?

A fim inicializar através da rede, o computador deve ter 1. uma identificação, 2. uma imagem do sistema operacional e 3. geralmente, um "filesystem" funcionando.

Considere um computador diskless (DL) que tenha uma ROM para boot de rede. Pode ser um de diversos DL idênticos. Como podemos distinguir este computador de outros? Há uma informação que é única para esse computador (na realidade, para seu adaptador da rede), que é seu endereço Ethernet. Cada adaptador Ethernet no mundo tem um endereço Ethernet único de 48 bits, porque cada fabricante de hardware Ethernet recebeu blocos de endereços específicos. Por convenção, estes endereços são escritos como dígitos hexadecimais com dois pontos separando cada grupo de dois dígitos, por exemplo: 00:60:08:C7:A3:D8.

Os protocolos usados para se obter um endereço IP, dado um endereço Ethernet, são chamados Boot Protocol (BOOTP) e Dynamic Host Configuration Protocol (DHCP). DHCP é uma evolução do BOOTP. Em nossa discussão, a menos que indicado de outra maneira, qualquer coisa que se aplica ao BOOTP também aplica-se a DHCP. (Realmente é uma pequena mentira que o BOOTP e DHCP traduzam somente endereços Ethernet. Por precaução, os designers fizeram previsão para o BOOTP e DHCP trabalharem com qualquer tipo de endereço de hardware. Mas Ethernet é o que a maioria das pessoas estará usando.)

Um exemplo de uma tradução feita pelo BOOTP seria como esta:

DL : Olá, meu endereço de hardware é 00:60:08:C7:A3:D8, dê-me por favor meu endereço IP.

Servidor BOOTP: (procura o endereço na base de dados.) Seu nome é aldebaran, seu endereço IP é 192.168.1.100, seu servidor é 192.168.1.1, o arquivo que você deverá carregar é /tftpboot/vmlinux.nb (e algumas outras informações).

Você pode querer saber como o DL encontrou o endereço do servidor BOOTP em primeiro lugar. A resposta é que não encontrou. O pedido do BOOTP foi propagado na rede local e qualquer servidor BOOTP poderá responder ao pedido.

Após ter obtido um endereço IP, o DL deve buscar uma imagem do sistema operacional e executá-la. Um outro Internet Protocol é usado aqui, chamado Trivial File Transfer Protocol (TFTP). TFTP é como uma versão menor do FTP --- não existe nenhuma autenticação, e funciona sobre o User Datagram Protocol (UDP) em vez do Transmission Control Protocol (TCP). UDP foi escolhido em vez do TCP por simplicidade. A implementação de UDP no DL pode ser pequena, de modo que o código caiba em uma ROM. Como UDP é orientado a blocos, invés de orientado a "streams", a transferência vai de bloco em bloco, como esta:

DL: Dê-me o bloco 1 de /tftpboot/vmlinux.nb.
Servidor de TFTP: Aqui está.
DL: Dê-me o bloco 2.

e assim sucessivamente, até que o arquivo inteiro seja transferido. O "handshaking" é um simples esquema de "acknowledge" de cada bloco, e a perda do pacote é contornada pela retransmição após o "time-out". Quando todos os blocos forem recebidos, a ROM de boot de rede passa o controle à imagem do sistema operacional, em seu ponto de inicialização.

Finalmente, a fim executar um sistema operacional, um "filesystem" raiz deve ser fornecido. O protocolo usado pelo Linux e outros Unix é normalmente o Network File System (NFS), embora outras escolhas sejam possíveis. Neste caso o código não tem que residir na ROM, pode ser parte do sistema operacional que acabou de ser trazido. Entretanto o sistema operacional deve ser capaz de funcionar com um "filesystem" raiz que seja um NFS, em vez de um disco real. Linux tem as variáveis de configuração necessárias para se construir uma versão que possa fazer isto.

Boot de Rede na Prática

Além das ROM's de boot comerciais, existem duas fontes de pacotes gratuitos para boot de rede. São o Etherboot e o Netboot. Ambos podem ser encontrados na Etherboot home page. Primeiro você tem que se assegurar que sua placa de rede tem suporte para Etherboot ou Netboot. Eventualmente você terá que encontrar alguém que armazenará o código em uma EPROM (Erasable Programmable Read Only Memory) para você, mas no começo você poderá fazer o boot de rede através de um disquete.

Para criar um disquete de boot, um bloco especial para boot é fornecido na distribuição. Este pequeno programa de 512 bytes carrega os blocos de disco seguintes, do disquete para a memória, e inicia sua execução. Assim, para fazer o disquete de boot, só precisamos concatenar o bloco de boot com o binário Etherboot que contém o driver para a placa de rede que será usada, desta maneira:

cat floppyload.bin 3c509.lzrom > /dev/fd0

Antes que você coloque o disquete de boot de rede, você terá que configurar três serviços no Linux: BOOTP (ou DHCP), TFTP e NFS. Você não tem que configurar todos os três de uma vez, você pode fazê-lo passo a passo, garantindo que cada passo esteja funcionando antes de passar para o seguinte.

Aassumirei que você instalou o servidor bootpd a partir de uma distruição ou compilando seu código fonte. Você então deve assegurar de que este servidor esteja esperando por requisições bootp. Existem das formas de fazer isto: uma é iniciar o bootpd como um serviço de rede que estará sempre ativo enquanto o computdor estiver funcionando, a outra é iniciá-lo a partir do inetd. Para este último, o arquivo /etc/inetd.conf deverá conter uma linha como esta:

bootps dgram udp wait root /usr/sbin/tcpd bootpd

Se você tiver que modificar /etc/inetd.conf, então você precisará reiniciar o inetd, enviando ao processo o sinal de HUP.

A seguir, você precisará fornecer ao bootp um banco de dados para mapear endereços Ethernet em endereços IP. Este banco de dados está no arquivo /etc/bootptab. Ele contém linha com a seguinte forma:

aldebaran.foo.com:ha=006008C7A3D8:ip=192.168.1.100:bf=/tftpboot/vmlinuz.nb

Outras informações podem ser especificadas, mas nós começaremos com o básico.

Agora dê boot no DL com o disquete, ele deverá detectar sua placa Ethernet e propagar uma requisição BOOTP. Se tudo correr bem, o servidor deverá responder ao DL com a informação esperada. Como /tftpboot/vmlinux.nb não existe ainda, o boot irá falhar quando tentar carregar este arquivo.

Agora você precisa compilar um kernel especial, que tenha a opção de montar o "filesystem" raiz em um NFS ativo. Você também precisará habilitar a opção de obter o endereço IP do kernel a partir da resposta BOOTP. Será ainda necessário compilar o driver do Linux para seu adaptador de rede dentro do kernel, invés de carrega-lo como módulo. É possível o download de um ramdisk inicial de modo que o carregamento de módulo funcione, mas isto é algo que você pode fazer mais tarde.

Você não pode instalar diretamente o arquivo zImage resultante da compilação do kernel . Ele deve ser convertido em uma tagged image. Uma tagged image é uma imagem comum do kernel com um cabeçalho especial que diz ao bootloader de rede onde os bytes irão na memória e em qual endereço iniciar o programa. Você usará um programa chamado mknbi-linux para criar esta tagged image. Este utilitário pode ser encontrado na distribuição Etherboot. Após você ter gerado a imagem, coloque-a no diretório /tftpboot com o nome que você especificou no /etc/bootptab. Tenha certeza de fazer com que este arquivo possa ser lido por todos, pois o servidor tftp não possui privilégios especiais.

Para o TFTP, eu assumirei que você instalou o tftpd de uma distribuição ou o compilou a partir de seu código fonte. Tftpd é normalmente iniciado através do inetd com uma linha como esta no /etc/inetd.conf.

tftp dgram udp wait root /usr/sbin/tcpd in.tftpd -s /tftpboot

Novamente, reinicie o inetd com um sinal de HUP, e você poderá tentar novamente o boot, mas desta vez a imagem do kernel deverá ser trazida e executada. O boot continuará até o ponto em que ele tentará montar o "filesystem" raiz. Então você deverá configurar e exportar partições NFS para continuar.

Por vários motivos, não é uma boa idéia usar a raiz do servidor como "filesystem" raiz dos DL's. Um deles é que vários arquivos de configuração do servidor estão em seu diretório raiz, e o DL pegará informações erradas deste modo. Outro é segurança. É perigoso permitir escrita (e escrita é necessária para o "filesystem" raiz, por várias razões) na raiz de seu servidor. Entretanto, a boa notícia é que a raiz para o DL não é muito grande, cerca de apenas 30 MB, e muito disso pode ser compartilhado entre múltiplos DL's.

Idealmente, para construir a raiz, você deve saber quais arquivos a distribuição do seu sistema operacional espera encontrar lá. São críticos para o boot os arquivos de device, arquivos no /sbin e /etc. Você pode deixar de lado muito trabalho pesado fazendo uma cópia de uma raiz existente e alterando apenas alguns arquivos para o DL. Na distribuição Etherboot, existe um tutorial e links para alguns scripts que criarão este "filesystem" raiz para o DL a partir da raiz do servidor. Existem também dicas para resolução de problemas na documentação Etherboot, pois esta é normalmente a parte mais cheia de truques da configuração.

O kernel Linux personalizado para o DL espera encontrar sua reaiz em /tftpboot/<IP address of the DC>, por exemplo: /tftpboot/192.168.1.100 no caso acima. Isto poder ser alterado ao configurar o kernel, se for desejado.

Agora crie ou edite o arquivo /etc/exports no servidor e coloque uma linha com a seguinte forma:

/tftpboot/192.168.1.100 aldebaran.foo.com(rw,no_root_squash)

A permissão rw é necessária para vários serviços do sistema. O atributo no_root_squash previne o sistema NFS de mapear o ID de root para outro. Se isto não for especificado, vários daemons e loggers ficarão infelizes.

Inicie ou reinicie os serviços de NFS (rpc.portmap e rpc.mountd) e tente novamente o boot no DL. Se você fez tudo certo, o kernel deverá ser capaz de montar o "filesystem" raiz e inicializar o sistema até apresentar o prompt de login. Na maior parte das vezes, você encontrará várias coisas mal configuradas. A maioria das distribuições do Linux são orientadas para operação com disco e exigem pequenas modificações para se ajustar ao boot de rede. A falha mais comum é a falta de arquivos sob o diretório /usr durante o processo de boot, os quais normalmente são importados de um servidor mais à frente no processo de boot. Duas possíveis soluções são: 1. Fornecer os poucos arquivos necessários sob um pequeno diretório /usr na raiz, e 2. Modificar os "paths" para procurar os arquivos na raiz. Os arquivos que deverão ser editados estão em /tftpboot/192.168.1.100 (lembre-se, este é o diretório raiz do DL).

Você pode querer montar outros diretórios a partir de um servidor, como o /usr (que poderá ser exportado com permissão para leitura somente).

Quando você estiver satisfeito com seu boot de rede, sem nenhum problema, você poderá querer gravar o código em uma EPROM. Um dispositivo programador de EPROM tem preço a partir de cerca de 100 dólares, e é um investimento um tanto caro para um "hobbista" que o usá esporadicamente. Ocasionalmente uma aparecerá no mercado de usados a preço módico, devendo-se ter certeza de que o software para acioná-la esteja disponível. Um "hobbista" de eletrônica mais especializado poderá construir uma usando um entre vários designs gratuitos publicados na Internet, mas para a maioria dos leitores, a melhor solução é usar o conhecimento de quem tenha acesso a um programador, talvez alguém em um grupo de "hobbistas" de eletrônica ou que trabalhe na indústria eletrônica.

Um pequena observação sobre a tecnologia de EPROM: os bits de uma EPROM são programados pela injeção de elétrons com uma alta tensão dentro da porta de um transistor de efeito de campo onde um bit 0 é desejado. Os elétrons presos ali fazem com que o transistor conduza, lendo um bit 0. Para apagar a EPROM, os elétrons presos devem receber energia suficiente para escapar da porta, o que é feito pelo bombardeamento do chip com radiação ultravioleta através de uma janela de quartzo. Para prevenir seu lento apagamento, devido a anos de exposição à luz do sol e de lâmpadas fluorescentes, esta janela de quartzo é coberta com uma etiqueta opaca durante seu uso normal.

Existe outra tecnologia, chamada EEPROM (Electrically Erasable PROM), às vezes chamada Flash PROM. Aqui os bits são limpos por um sinal elétrico. Isto elimina a necessidade de um apagador ultravioleta se a EPROM for reutilizada, mas requer circuitos adicionais para se realizar o apagamento. Se você for hábil com eletrônica, existe o desenho de um circuito e o driver para uma placa EEPROM na distribuição Etherboot. Esta placa é conectada em qualquer slot ISA livre de um PC e inicializa uma placa de rede conectada em algum outro slot.

Utilidade para Boot de Rede

Terminais X são um das aplicações naturais de boot de rede. A ausência de um disco em um terminal o torna mais silencioso e contribui para tornar agradável o ambiente de trabalho. A máquina deve ter idealmente pelo menos 16MB de memória e possuir a melhor placa de vídeo que você puder encontrar. Esta é uma utilidade ideal para aqueles 486 topo-de-linha ou os primeiro modelos de Pentium, que se tornaram obsoletos pelos avanços na tecnologia.

Outras pessoas têm usado boot de rede em agrupamentos de máquinas onde a utilização do DL é leve e não justifica o uso de um disco, como por exemplo em máquinas em sala de aula.

Para Mais Informações

Você primeiro deve fazer uma parada na Etherboot home page:
http://www.slug.org.au/etherboot/

Lá você encontrará links para outras recursos, incluindo listas que você poderá assinar, onde problemas e soluções são discutidos.

Feliz boot de rede!


This website é mantido porMiguel Angel Sepulveda
© Ken Yap 1998
LinuxFocus 1998