Instalando Linux 64bits num PC sem disco

Esta entrada é um artigo 100% técnico, por isso ainda estão a tempo de voltar à página principal antes de sentir a cabeça a andar à roda…🙂

Quando se fala de computadores sem disco (“diskless”, “thin clients”, etc.), fala-se sempre de NFS (Network File System). Mas esta não é a única maneira de arrancar um núcleo Linux a partir de um sistema de ficheiros de raiz partilhado pela rede.

Existe uma outra alternativa: ATA-over-Ethernet (AoE).

  • Introdução

Vantagens do AoE sobre o NFS:

  1. É um protocolo de nível OSI 2 (Ethernet), e não de nível OSI 3 (IP), e por isso:
    1. É mais simples e “leve”, logo potencialmente mais rápido;
    2. É fácil de usar de maneira segura, pois os pacotes são sempre eliminados em qualquer encaminhador (router) ou comutador (switch) IP, não havendo necessidade de configurar filtros IP (firewalls);
    3. Sendo baseado no endereço MAC de Ethernet, não necessita de uma interface IP configurada, nem sequer precisa de um endereço IP (embora não haja problema se houver uma interface IP a funcionar no mesmo porto);
    4. Durante o “shutdown” do sistema, o facto da pilha IP ser desactivada antes do sistema de ficheiros ser desmontado não afecta a conexão Ethernet ao disco remoto; desta maneira a finalização é completamente “limpa”, algo que é complicado de obter com um sistema raiz em NFS.
  2. É mais simples de configurar; basta lançar o servidor dum lado, carregar o módulo de Linux do outro, e está pronto a montar partições.
  3. Podem-se efectuar remotamente operações de baixo nível sobre o disco/partição tal como se ele estivesse ligado localmente, como por exemplo correr um verificador (fschk), formatar, ou ter acesso à informação “SMART” do disco (temperaturas, relatório de falhas, etc.), caso este o suporte.

Desvantagens do AoE em relação ao NFS:

  1. Não tem semântica de concorrência! – a não ser que se use um sistema de ficheiros capaz de lidar com acessos concorrentes (como o GFS, por exemplo), é impossível aceder a uma partição de dados a partir de mais de uma máquina em simultâneo sem corromper os dados de forma catastrófica. No entanto, se só se aceder de uma máquina à vez, tudo bem.

Eu já há algum tempo que sou “cliente” do AoE, usando-o para partilhar a minha “/home” a partir do servidor. Mas porque a distribuição Ubuntu não permite arrancar um Linux a partir de outros sistemas de raiz que não sejam locais ou NFS, nunca tinha usado AoE para o “root filesystem”.

Infelizmente, deparei-me com uma série de incompatibilidades entre o sistema de 32bits que tenho no servidor e o novo sistema de 64bits que tenho no cliente sem disco… entre elas, o NFS deixou de funcionar, pois o sistema operativo de 32bits não consegue ler correctamente uma partição formatada por um sistema operativo de 64bits, e portanto também não a consegue exportar por NFS sem corrupção de dados.

A única opção que me restou foi agarrar o touro pelos cornos e montar o sistema AoE completo:

  1. Exportar um disco rígido por AoE a partir do servidor de 32bits;
  2. Conectar uma das suas partições no cliente de 64bits como se fosse local;
  3. Iniciar o instalador do Ubuntu Linux (a partir do “Live CD”) no cliente e instalá-lo nessa partição (formatação incluída);
  4. Alterar a imagem de arranque do cliente (a “initramfs”) de forma a permitir AoE como sistema de raiz;
  5. Copiar o novo núcleo e imagem de arranque do cliente para o TFTP do servidor.

Não vou aqui explicar os requisitos mínimos para o arranque de um sistema sem disco; isso encontra-se debatido em montes de tutoriais (howtos) pela web fora, e já deve fazer parte da bagagem de quem lê este artigo. Vou só dizer resumidamente que consiste em:

  1. Placa de rede no cliente capaz de arrancar o sistema (compatível com PXE);
  2. Servidor DHCP para atribuir um endereço IP ao cliente, e reencaminhá-lo para o serviço TFTP;
  3. Servidor TFTP para permitir o descarregamento de um “bootloader” de rede (pxelinux, p.ex.) para o cliente;
  4. Configuração do pxelinux para permitir o descarregamento por TFTP de um núcleo Linux e respectiva imagem de arranque (initramfs).

A partir do momento em que estes requisitos estão cumpridos, pode-se arrancar o cliente pela rede sem qualquer disco local.

No entanto, convém fornecer alguma forma ao núcleo Linux de aceder ao disco que contém o resto do sistema operativo… é aqui que entram as minhas alterações: vou acrescentar a opção AoE às já existentes “local” e “nfs”.

  • Disfarçando um disco remoto como local

Bom, mas primeiro o que vem primeiro. Eis como fiz para instalar o sistema de 64bits no PC sem disco.

  1. No servidor, abrir uma consola de comando e publicar o disco rígido:
    1. vasco@thebrick~$ sudo vblade 0 1 eth1 /dev/hda & # publish my hda disk through eth1
  2. Meter o “Live CD” do Ubuntu Linux 64bits no PC sem disco;
  3. Arrancá-lo a partir do CD; assim que carregar o menu principal, pressionar F3 para escolher teclado Português, e F6 para remover a palavra “splash” da linha de arranque – as novas placas gráficas nVidia dão-se mal com o “bootsplash”…
    1. Press F6 on Live CD menu and remove “splash” from kernel options if you have a new nvidia card.
  4. Deixar o “live CD” carregar. Quando pronto, abrir uma consola de comando e fazer:
    1. ubuntu@ubuntu~$ sudo modprobe aoe # load AoE kernel module
    2. ubuntu@ubuntu~$ sudo ln /dev/etherd/e0.1 /dev/hda # access to remote partition table
    3. ubuntu@ubuntu~$ sudo ln /dev/etherd/e0.1p2 /dev/hda2 # access to remote partition 2
  5. Lançar o instalador do “Live CD” (duplo click no ícone gráfico).
  6. Proceder à instalação normal. Apenas um cuidado a ter: se o disco exportado for o mesmo da raiz do servidor (é o meu caso), então convém impedir que o “grub” se instale, senão o servidor não volta a arrancar:
    1. Click button “Advanced” and remove “(hd0,0)” from grub instalation; ignore subsequent instalation error.
  7. A instalação termina. Pode dar um erro de instalação do “grub“, mas isso não faz mal. É que o nosso “bootloader” vai ser o “pxelinux”, conforme visto acima.
  8. Montar a partição recentemente criada.
    1. ubuntu@ubuntu~$ sudo mount /dev/hda2 /mnt #mount remote root partition
  9. O sistema operativo está instalado, mas não vai poder arrancar enquanto não configurarmos o nosso mega arranque pela rede…🙂 prosseguir abaixo com as instruções de modificação da imagem de arranque.
  • Initramfs

Felizmente para todos nós, o Linus e o resto do pessoal que trabalha no núcleo Linux facilitou à malta o trabalho de construir imagens de arranque. O pacote “initramfs-tools” contém um ambiente completo e automatizado para gerar imagens com as alterações que quisermos fazer. E já vem incluído na maioria (senão totalidade) das distribuições GNU/Linux (aliás, esta é uma das razões porque há tantas distribuições – é fácil começar😉 ).

Para mais informações, convém consultar o manual! “man initramfs-tools

A imagem de arranque é uma miniatura de sistema operativo, contendo apenas os programas indispensáveis para estabelecer uma base funcional mínima no PC de forma a poder montar o “root filesystem” e arrancar o sistema completo.

É composta pelo canivete suíço do GNU/Linux, o “busybox”, e um conjunto de “scripts” de arranque para tratar de coisas imprescindíveis como carregar módulos necessários aos controladores de discos, activar a ligação de rede, e montar a primeira partição – o sistema de raiz.

O ambiente de produção dessas imagens também é rico em “scripts”, e podemos alterá-lo através deles. Após muito procurar na web, lá encontrei um exemplo porreiro para servir de base para o meu trabalho.

Para convencer o Ubuntu a arrancar a partir de AoE, bastou acrescentar 2 scripts (links aqui a seguir):

  • /etc/initramfs-tools/hooks/aoe -Download this!
    • Este é executado durante a produção da imagem de arranque, e assegura que o módulo “aoe” está presente e carregado; adicionalmente guarda o nome da placa ethernet de arranque num ficheiro que irá aparecer durante o arranque, para consulta pelos “scripts” da imagem.
  • /etc/initramfs-tools/scripts/init-premount/aoe -Download this!
    • Este é executado na imagem de arranque. Basicamente, activa o porto de rede especificado, e assegura-se de que os discos AoE foram detectados (pode levar algum tempo, pela rede) antes de permitir a montagem da raiz.

Para instalar estes scripts, basta descarregá-los, copiar para o sítio certo e dar permissões de execução:

  1. ubuntu@ubuntu~$ sudo cp ~/Desktop/aoe-hooks.doc /mnt/etc/initramfs-tools/hooks/aoe
  2. ubuntu@ubuntu~$ sudo chmod +x /mnt/etc/initramfs-tools/hooks/aoe
  3. ubuntu@ubuntu~$ sudo cp ~/Desktop/aoe-scripts.doc /mnt/etc/initramfs-tools/scripts/init-premount/aoe
  4. ubuntu@ubuntu~$ sudo chmod +x /mnt/etc/initramfs-tools/scripts/init-premount/aoe

A seguir “recompila-se” a imagem de arranque do sistema:

  1. ubuntu@ubuntu~$ sudo chroot /mnt
  2. root@ubuntu~$ update-initramfs -u

E como não tenho outra maneira de copiar os ficheiros de arranque para o servidor, tem mesmo de ser com um “USB stick”…

  1. root@ubuntu~$ exit
  2. ubuntu@ubuntu~$ sudo cp /mnt/boot/initrd.img-2.6.20-15-generic /media/disk/initrd.img
  3. ubuntu@ubuntu~$ sudo cp /boot/vmlinuz-2.6.20-15-generic /media/disk/vmlinuz

E no servidor:

  1. vasco@thebrick~$ sudo cp /media/disk/initrd.img /var/lib/tftpboot/
  2. vasco@thebrick~$ sudo cp /media/disk/vmlinuz /var/lib/tftpboot/

OK, agora só falta a cereja em cima do bolo. Para dizer ao núcleo Linux para montar o sistema de raiz a partir de AoE, editar a configuração do pxelinux no servidor:

  1. vasco@thebrick~$ sudo nano /var/lib/tftpboot/pxelinux.cfg/default # edit pxelinux kernel params.
  2. Set the “root=” parameter with your AoE partition (i.e. “root=/dev/etherd/e0.1p2”)

Pronto!

Agora é só reiniciar o sistema e já deve arrancar. 🙂

  1. ubuntu@ubuntu~$ sudo umount /mnt /media/disk
  2. ubuntu@ubuntu~$ sudo eject
  3. ubuntu@ubuntu~$ sudo reboot

Enjoy!

~ por Vasco Névoa em Agosto 15, 2007.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s

 
%d bloggers like this: