"Network/Remote Boot"

André Moreira ([email protected])
Professor Adjunto do Depart amento de Engenharia Informática do ISEP

Durante o arranque (inicialização) de um posto de trabalho, antes do arranque do sistema operativo ("boot"), são executados vários programas de inicialização residentes em ROM que fazem parte do BIOS do computador. Esta fase do arranque toma a designação de "pré-boot".

Quando se adicionam ao barramento do computador outros dispositivos é conveniente que também estes possam definir programas a executar durante o "pré-boot". Assim existem espaços de endereço livre para este efeito:

  • Atraves de "jumpers" ou por "software" define-se no dispositivo o endereço de memória onde se pretende colocar a ROM do dispositivo.
  • Durante o arranque o BIOS do computador procura assinaturas de ROM's a partir do endereço C0000 detecta a sua existencia e validade ("checksum"), executando-as.
Quando se inicializa um PC, todos podem notar a execução de um programa de inicialização da placa gráfica, se mudar a placa o programa muda.

Utilizando esta caracteristica é possível colocar uma ROM no computador de tal modo que este em lugar de efectuar o "boot" de forma tradicional (dispositivos locais), utilize serviços de rede para este efeito.

A maioria das placas de rede possuem um "socket" livre para colocação de uma "EPROM" ("Erasable Programable ROM") e permitem definir o endereço de memória onde essa ROM será "colocada".

A função do "software" residente nessa ROM pode ser muito variada. As ROMs de "boot" destinam-se a obter de um servidor de rede o sistema operativo para o "boot". Por isso contém um "driver" apropriado para a placa de rede, "software" de rede (IP/UDP/TCP, IPX/SPX, ...) e um cliente de rede para receber os ficheiros (TFTP, NFS, NCP, ...).

Uma ROM de "boot" não pode simplesmente iniciar o "boot" quando é executada pelo BIOS, recorde-se que estas ROMs se destinam a inicializar dispositivos e como tal devem devolver o controlo ao BIOS sob pena de se comprometer todo o processo. Tipicamente, quando são executadas as ROMs de "boot" capturam ("desviam") uma ou várias das interrupções de "software" que são invocadas pelo BIOS no final do "pre-boot": 18h (antes de tentar o boot por A:) e 19h (depois de tentar o boot por A:). Na realidade a int 18h é uma reliquia do passado: destinava-se a invocar o interpretador BASIC.

A especificação "Plug & Play" introduziu a possibilidade de um ROM se declarar especificamente como ROM de BOOT. Essa possibiliade foi mais tarde uniformizada com a "BIOS Boot Specification" (BBS). Um BIOS PnP BBS compativel cria uma lista de ROMs (associadas a dispositivos) que pretendem efectuar o "boot" e apresenta-a ao utilizador para que este possa optar.

O primeiro ficheiro recebido da rede é um programa conhecido por "Network Bootstrap Program" (NBP) este programa é executado e assume o controlo das operações. Isto permite uma implementação muito mais flexivel do que se a funcionalidade do NBP fosse incluida na ROM.

Porque a generalidade dos sistemas operativos não estão preparados para arrancar remotamente, nas implementaçães "diskless", o NBP cria um "ramdrive" onde coloca os ficheiros de arranque do sistema operativo (tipicamente coloca a imagem de uma disquete no "ramdrive").

BOOTP+TFTP

Embora existam várias soluções proprietárias, a mais divulgada utiliza os protocolos BOOTP e TFTP:

  1. O "software" residente na EPROM emite um pedido BOOTP em "broadcast".
  2. Um servidor BOOTP responde, enviando diversa informação, entre ela o nome do ficheiro de boot (NBP) e o endereço IP do respectivo servidor TFTP.
  3. O "software" residente na EPROM emite um pedido TFTP para obter o NBP.
  4. O NBP é executado, pode por exemplo apresentar um menu de imagens disponíveis, ou mesmo exigindo uma autencicação inicial.
  5. O NBP emite um pedido TFTP para obter a imagem pretendida e coloca-a no local adequado (tipicamente um "ramdrive").
  6. Finalmente o NBP desencadeia o "boot".

NetBoot e EtherBoot

O "software" NetBoot é um exemplo importante já que graças ao facto de usar "packet-drivers" permite criar EPROMS de "boot" para virtualmente qualquer placa de rede.

O "software" Etherboot, derivado do anterior é menos flexivel, mas pode ser colocado em EPROMS mais pequenas, como por exemplo as 27xx64 com 8 Kb. Note-se que existem algumas placas de rede antigas que não suportam EPROMS maiores.

Este "software" é "freeware" (GPL), e constitui-se numa boa solução para muitas situações, sendo compativel com a especificação BBS.

A API disponibilizada por estas ROMs é muito limitada, disponibiliza apenas 3 funções acessiveis pela interrupção 78h: "Verificação de instalação", "Finalização", "Obter o endereço de acesso à API UNDI (Universal Network Driver Interface)".

Especificação PXE

A especificação PXE ("Preboot Execution Environment") foi desenvolvida pela Intel com contribuições de outros fabricantes. Trata-se de definir um "standard" para as ROMs de "boot". Se existir uma API bem definida e normalizada para as ROMs de "boot", então poderemos desenvolver NBPs PXE compativeis que funcionarão em todos os sistemas.

Em termos de protolocos a especificação PXE utiliza o BOOTP/DHCP+TFTP, contudo define um vasto conjunto de extensões, por exemplo o TFTP "normal" limita o tamanho dos pacotes a 512 bytes, o "standard" PXE exige servidores TFTP especiais que suportam pacotes de 1408 bytes. O PXE também suporta TFTP em "broadcast" (MTFTP - "Multicast TFTP") para efectuar o "boot" simultaneo e sincronizado de um grande conjunto de postos de trabalho.

Também relactivamente ao protocolo BOOTP a especificação PXE exige um servidor DHCP especial, com vários "TAGs" extra.

As ROMs PXE não permitem o "boot" baseado nas interrupçães 18h ou 19h, exigem por isso que o BIOS seja BBS compativel.

"PXE Split ROM Architecture"

A especificação PXE utiliza uma arquitectura de ROM modular, na realidade existem tres partes distintas que podem ou não residir na mesma ROM física. Estas ROMs são:

  • BC ROM ("Base-Code ROM")
  • UNDI ROM
  • BUSD ROM

A BC ROM é independente do "hardware" de rede, assim poderá ser incluido no BIOS do computador. A UNDI ROM contém o driver adequado para o "hardware" de rede, deve portanto estár colocado na placa de rede. A BUSD ROM é opcional, destinando-se apenas a placas de rede "CardBus".

APIs PXE

As ROMs PXE disponibizam aos NBPs as seguintes APIs, que são aqui detalhadas a titulo de exemplo:

Pre-Boot API

  • UNLOAD BASE- Remove o codigo BASE PXE da memória.
  • GET CACHED INFO - Devolve a informação obtida do servidor DHCP
  • RESTART TFTP - Efectua o "download" de um NBP.
  • START UNDI - Inicialização da UNDI. Captura interrupção 1Ah que serve para detectar a existencia da UNDI.
  • STOP UNDI - Liberta a interrupção 1Ah
  • START BASE - Inicializa o "Base Code PXE".
  • STOP BASE - Termina o "Base Code PXE".

TFTP API

  • TFTP OPEN - Abre uma conexão TFTP.
  • TFTP CLOSE - Fecha uma conexão TFTP.
  • TFTP READ - Le um pacote de uma conexão TFTP.
  • TFTP/MTFTP READ FILE - Abre uma conexão TFTP, le um ficheiro inteiro e fecha a conexão.
  • TFTP GET FILE SIZE - Permite obter o tamanho de um ficheiro, extensão ao protocolo TFTP.

UDP API

  • UDP OPEN - abre uma porta UDP.
  • UDP CLOSE - fecha uma porta UDP.
  • UDP WRITE - envia um pacote UDP.
  • UDP READ - recebe um pacote UDP (não bloqueante).

UNDI API

  • UNDI STARTUP - Inicialização da UNDI.
  • UNDI CLEANUP - Prepara o "driver" para ser descarregado da mamória.
  • UNDI INITIALIZE - Reinicializa a interface de rede.
  • UNDI RESET - Reinicializa a interface de rede deixando-a pronta a enviar e receber pacotes.
  • UNDI SHUTDOWN - Reinicializa a interface de rede para esta ser usada por outro "driver".
  • UNDI OPEN - Coloca a interface de rede pronta a receber e enviar pacotes.
  • UNDI CLOSE - Coloca a interface de rede indisponível para receber ou enviar pacotes.
  • UNDI TRANSMIT PACKET - Transmite para a rede um pacote em "buffer".
  • UNDI SET MULTICAST ADDRESS - Altera a lista de endereços de destino multicast.
  • UNDI SET STATION ADDRESS - Altera o endereço MAC da interface.
  • UNDI SET PACKET FILTER - Define um novo filtro de pacotes.
  • UNDI GET INFORMATION - Copia o estado da interface para um "buffer".
  • UNDI GET STATISTICS - Le informação estatistica da interface de rede.
  • UNDI CLEAR STATISTICS - Inicializa os dados estatisticos da interface de rede.
  • UNDI INITIATE DIAGS - Inicia a execução de testes de auto-diagnostico da interface.
  • UNDI FORCE INTERRUPT - Força uma interrupção de recepção de pacote.
  • UNDI GET MULTICAST ADDRESS - Converte uma mascara IP multicast para um endereço MAC multicast.
  • UNDI GET NIC TYPE - Permite obter informação sobre a interface de rede, necessária ao "boot" PXE.
  • UNDI GET IFACE INFO - Permite obter informação sobre o tipo de interface, necessária aos "drivers" (segundo a especificação NDIS2).
  • UNDI GET STATE - Permite obter o estado da UNDI.
  • UNDI ISR - Define a "Interrupt Service Routine".

A BC ROM implementa as APIs "Pre-Boot", "TFTP" e "UDP" devendo ser "removida" antes do "boot" do sistema operativo. Por outro lado a UNDI ROM que contém a interface com o "hardware" de rede deve manter-se para ser usada pelo sistema operativo. A BUSD API apenas existe quando se encontra instalada a BUSD ROM.

Administração zero

A utilização destes métodos de arranque é muito vantajosa para os administradores de parques informáticos com elevado número de postos de trabalho:

  • Porque os ficheiros do sistema operativo são obtidos de um servidor de rede, todos os postos de trabalho arrancam da mesma forma, sob o controlo directo do administrador.
  • A instalação ou actualização de "software", incluido o sistema operativo, é realizada num único posto e copiada para o servidor ficando em efeito para todos os postos de trabalho.
  • Porque se trata de um ambiente "pré-boot", sem remover a EPROM é impossível aos utilizadores efectuar o "boot" de uma forma diferente sem controlo do administrador.

Trata-se sem dúvida de uma solução "administração zero" muito tentadora, contudo temos de apontar alguns inconvenientes a ser solucionados:

Muitos sistemas operativos "exigem" a existencia de um disco local.
Esta exigencia pode ou não ser clara, mas existe na prática por exemplo para os ambientes Win32 da MicroSoft.
Por outro lado, mesmo quando se consegue contornar os problemas de instalação a eficiencia torna-se muito precária porque os sistemas operativos vão usar os servidores de ficheiros como se fossem discos locais (swap, etc).
A variedade de "hardware" dos postos de trabalho coloca problemas.
Embora se refira que apenas é necessário instalar um único exemplar do sistema operativo para que ele fique disponível em todos os postos, isso não é inteiramente verdade, na realidade é necessária uma instalação para cada tipo de posto de trabalho, ou seja no servidor será necessário ter uma imagem para cada tipo de posto de trabalho.
Alguns S.O. não possuem configuração dinamica eficiente.
Por exemplo os clientes BOOTP/DHCP dos ambientes Windows da MicroSoft ignoram o nome do posto de trabalho, além disso, o nome NETBIOS da máquina é independente do nome DNS.

Embora todos estes problemas possam ser resolvidos, adicionam alguma complexidade ao modelo inicial.

Configuração dinâmica

O sistema operativo de um posto de trabalho com "remote/network boot" necessita de diversa informação sobre o "hardware" e a forma de o configurar correctamente.

A configuração dinamica é uma operação que tem como objectivo definir de um modo automatizado a configuração da máquina. Esta operação deve ser realizada antes do "boot" pelo NBP ou durante o "boot" caso o sistema operativo suporte configuração dinamica.

A solução que se pretende evitar é manter no servidor uma imagem especificamente configurada para cada posto de trabalho. Neste caso não há necessidade de qualquer configuração dinamica.

Uma solução mais aceitável consiste em manter no servidor uma imagem para cada tipo de posto de trabalho (tipo de "hardware"). Nesta situação a configuração dinamica resume-se ao endereço IP e nome do posto de trabalho.

A solução ideal seria manter no servidor apenas uma única imagem para todos os postos de trabalho. Isto implica um esforço de configuração dinamica muito significativo.

Cada posto de trabalho possui um endereço MAC "gravado" na sua interface de rede, como cada endereço MAC é único é o valor ideal para utilizar como "indice" de uma base de dados onde se encontram os registos correspondentes às máquinas existentes. Em função do endereço MAC é necessário obter todos os outros parametros de configuração necessários ou escolher a imagem ou ficheiros correctos.

"Remote/Network Boot diskless"

Muitos anos atrás o "Remote/Network boot" teve origem nas máquinas "diskless". Trata-se de máquinas que não possuem disco para armazenar o S.O., como tal o NBP cria um "ramdrive" onde coloca os ficheiros necessários.

Com o aumento da velocidade dos discos locais, redução do seu preço e aumento da sua fiabilidade, a solução "diskless" tornou-se menos atractiva. A introdução de mecanismos de "swap" em disco e aumento brutal do volume de ficheiros necessários aos sistemas operativos mais correntes tornou as configurações "diskless" muito complicadas sob o ponto de vista de eficiencia.

As soluções "diskless" acrescentam contudo uma vantagem importante ao "Remote/Network boot": a ausencia de disco que se traduz por uma redução significativa no custo inicial de um PC (cerca de 1/6) e uma redução significativa na taxa de avarias do equipamento.

A utilização actual de máquinas "diskless" tem duas aplicações possiveis:

Pequenos servidores de rede
Por exemplo servidores de impressora, servidores de terminal ou sistemas de aquisição de dados, são maquinas de baixa capacidade e que que devem funcionar sem interrupçóes e por isso tiram todo o proveito de uma configuração "diskless".
Terminais e NCs
Uma configuração "diskless" é ideal para transformar um PC desactualizado num terminal de texto ou num NC, por exemplo usando VNC ou X11.

Com a redução do preço da memória central (RAM) começa a ser atractiva a instalação de postos Win32 "diskless" de elevada performance baseados num "ramdrive" de grande dimensão. Actualmente o custo de um disco local corresponde a cerca de 128 Mb de RAM. Utilizando este "ramdrive" para instalar o Windows 98 num volume comprimido ("DrvSpace 3") obtem-se facilmente um disco de 250 Mb de capacidade. Com este espaço torna-se facil manter um posto de trabalho Windows 98 desde que as aplicações sejam instaladas em servidores de rede.

"Remote/Network Boot" com disco local

Os problemas resultantes da ausencia de disco local (postos de trabalho "diskless") podem ser resolvidos, simplesmente por adição de um disco local. Se numa implementação tradicional o NBP encarrega-se de criar um "ramdrive" onde coloca a imagem de "boot", neste tipo de implementação coloca directamente a imagem no disco.

Existem actualmente diversos NBP's comerciais ou não, adaptados a estas tarefas, são programas que devem ter entre outras, além de compatibilidade PXE, as seguintes caracteristicas:

  • Gestão de partições, devendo por isso reconhecer diversos formatos de sistemas de ficheiros (FAT16, FAT32, UFS, HPFS, NTFS, ...).
  • Utilização de cliente TFTP melhorado (suporte de pacotes de 1048 bytes).
  • Compressão de dados (para diminuir o tráfego de rede e a duração dos "downloads").
  • Interface gráfica com o utilizador (dispensavel, mas muito apreciada).
  • Suporte de mecanismos de autenticação dos utilizadores (NIS, NT, NetWare, ...).
  • Gestão de ficheiros (copy; move; erase).
  • Configuração dinamica de ficheiros (geralmente apenas para ficheiros ASCII).

Além do NBP devem existir ferramentas de administração, nomeadamente para criar e gerir as imagens dos discos.

BPBATCH (versão 3.20)

O NBP "BPBATCH", desenvolvido pela "University of Geneva", é um bom exemplo de uma implementação não comercial.

O NBP é na realidade um interpretador de comandos, depois de carregado o bpbatch" efectua o "download" (por TFTP) de um "script" (definido pelo TAG155 do bootp) e inicia a sua execução.

A gestão de partiçóes é muito simples e baseia-se nos seguintes comandos:

  • SetPartitions "descrição"
  • SetBootPart número-partição
  • Blank número-partição
  • Clean número-partição
  • FullUnzip "nome-ficheiro" número-partição
  • IncrUnzip "nome-ficheiro" número-partição

O comando "SetPartitions" define a tabela de partições do disco (MBR), é usado um "string" com uma sequencia de identificadores de tipos de partição e respectivos tamanhos em Mb (ver exemplos abaixo). A sequencia especificada neste comando vai corresponder à númeração atribuida às partições, assim, como o número 0 está reservado para o MBR, a primeira partição especificada pelo comando "SetPartitions" terá o número 1.

"FullUnzip" corresponde a uma cópia de sectores pelo que dispensa a formatação (comando "Clean Partitions"). O comando "IncrUnzip" descomprime ficheiros para uma partição já formatada, sem apagar os já existentes.

Os tipos de partição suportados pelo "bpbatch" são: FAT16; EXT; BIGDOS; NTFS; FAT32; FAT32-LBA; BIGDOS-LBA; EXT-LBA; LINUX-SWAP; LINUX-EXT2.

Na prática as operações são limitadas a apenas alguns tipos de partição. As operações FullUnzip e todos os manuseamentos de ficheiros individuais (IncrUnzip, Copy, Del, ...) estão limitadas a partições dos tipos FAT16/BIGDOS, FAT32 e LINUX-EXT2. As operações de limpeza de partições ("Blank Partition" e "Clean Partitions") são suportadas ainda para LINUX-SWAP e EXT.

Um exemplo da sequencia de comandos para colocar Linux no disco local pode ser algo como:

setpartitions "linux-ext2:992 linux-swap:32"
fullunzip "linux.imz" 1
clean 2

Para MS-DOS ou Windows 95/98:

setpartitions "bigdos:1024"
setbootpart 1
fullunzip "dos.imz" 1

O "bpbatch" utiliza o cliente TFTP melhorado disponibilizado pela ROM PXE, mas também pode usar TFTP convencional. Os dados são transferidos pela rede sob a forma comprimida. A interface gráfica com o utilizador é funcional, mas não suporta rato.

Como já foi referido existem comandos para gestão de ficheiros e directórios nas partições. Os ficheiros e directórios locais são referenciados na forma:

{:n}path/ficheiro
onde n representa o número da partição.

A configuração dinamica é conseguida de duas formas:

  • Comando "Patch" - Permite a cópia de um ficheiro de texto do servidor TFTP para uma partição local, durante a cópia os "strings" existentes no ficheiro, com a forma ${nome} são substituidos pela variável nome. Durante a execução do "bpbatch" estão disponíveis várias variaveis, nomeadamente as correspondentes a parametros obtidos na resposta "bootp".
  • Comando "IncrUnzip" - Este comando permite a adição de uma grande quantidade de ficheiros a uma configuraçáo de base colocada numa partição com o comando "FullUnzip". A ideia é que estes ficheiros adicionados correspondam a uma configuração especializada (tipo de "hardware"). A escolha do "IncrUnzip" a realizar para cada caso terá de se basear nas variaveis disponiveis no "bpbatch".

O "bpbatch" suporta autenticação de utilizadores atravez de um "gateway" instalado numa máquina linux. O comando

CheckUser "user" "password" "domain"
valida o utilizador usando esse "gateway" o dominio "Unix" corresponde a uma autenticação local/NIS, pode também ser usado um nome de dominio NT/Samba.

Além deste comando de interface com o "gateway" existem comandos para cifragem e decifragem DES, bem como aplicação do algoritmo MD5.


[email protected]
http://www.dei.isep.ipp.pt/~andre