Discuta este tópico no fórum

Se este conteúdo te ajudou, deixe um presente!

terça-feira, 3 de julho de 2012

Instalação de Linux (antigo) em discos GPT

Nos percalços da administração de sistemas, encontrei um problema interessante para resolver. Precisava instalar um RHEL 5.8 em um servidor com 6 discos de 600MB em RAID 5.  Fácil? Nem tanto. Vamos aos problemas.

Em uma configuração de RAID 5, um dos discos é usado para paridade. Neste caso, temos 5x600MB ou 3TB de espaço líquido. Como o RAID é implementado por uma controladora, o processo é mais simples. Tudo é apresentado transparentemente para o sistema operacional como um disco único de 3TB. Porém, justamente este é o problema.

Normalmente é utilizado nos discos uma tabela de partição no formato DOS, aquela com MBR, 4 partições primárias, partições estendidas. Contudo, este formato desenvolvido na época dos Megabytes não lida muito bem com o mundo dos Terabytes. O tamanho máximo representável de disco é de 2.2 TB. No meu caso, tenho 3 TB. E agora José? A solução curta e grossa é dividir os discos em 2 RAID 5, cada um com 3 discos. Porém, neste caso, eu perderia 2 discos e não 1 com paridade. Como sempre, alguém já encontrou uma solução: um novo formato de partições chamado de "GUID Partition Table", ou para os mais íntimos, GPT.

O formato GPT faz parte do padrão (U)EFI que busca substituir a BIOS hoje presente na maioria dos computadores. Os servidores e sistemas operacionais mais novos suportam estes padrão. Bem, ai chegamos a outro problema. O RedHat Enterprise Linux (RHEL) versão 5.8 não suporta UEFI para ambientes x86. Se fosse na versão 6, o suporte é nativo. Como isto é um requisito do projeto, preciso resolver ainda com o RHEL v5.8.

O primeiro passo foi investigar o que cada componente deste ambiente suporta que recurso. Cheguei a este resultado:
  • Servidor:
    • Suporta BIOS e UEFI
    • Suporta GPT tanto em BIOS como UEFI
Isto já é um ótimo começo. O uso do UEFI não é requisito para a BIOS usar discos GPT. Quanto ao RHEL v5.8:
  • RHEL
    • Grub (gerenciador de BOOT)
      • Suporta somente formato DOS
    • Kernel
      • Suporta GPT mas não EFI
    • Ferramentas
      • Exceto o fdisk, suportam GPT e DOS
Tanto o grub quanto o kernel não suportam EFI. O grub nem mesmo suporta o GTP. Buscando um denominador comum, podemos utilizar o modo BIOS, disco com GPT mas empacamos no gerenciador de BOOT (obs: grub2 suporta GPT). A BIOS pode ler o gerenciador de BOOT, ele roda mas não encontra seus arquivos. Se conseguisse carregar o kernel e o INITRD, o problema estava resolvido. Precisamos, portanto, de alguma alternativa de BOOT ou alguma bruxaria para fazer o grub funcionar.

A primeira alternativa mais simples é utilizar um disco DOS para armazenar os arquivos do grub. Isto seria o diretório /boot. Nos meus testes, utilizei um pendrive e durante o processo de instalação configurei o /boot para usar o pendrive utilizando o formato DOS. Instalação sem problemas do início ao fim. Sistema iniciou e desligou sem erros. Mas este pendrive não ficou muito interessante... e se alguém retirar o pendrive? Só irei notar a falta dele quando reiniciar o servidor e aí, já é tarde.

Buscando mais alternativas para casos similares, encontrei o caso de máquinas MacBook, que usam UEFI e GPT, e onde era instalado o Windows XP. O GPT, para evitar problemas com softwares particionadores antigos, mantém uma tabela de partição no formato DOS. O primeiro setor do disco possui uma configuração de uma partição que ocupa toda a extensão do disco e do tipo "GPT EFI". O fdisk, que não suporta GPT, mostra esta informação. Note que o primeiro setor usado é o 1 e não o 63 como em discos DOS convencionais.

# fdisk -u -l

WARNING: GPT (GUID Partition Table) detected on 'sda'! The util fdisk doesn't support GPT. Use GNU Parted.                                     
(...)                                                                                            
                                                                                                                                              
Device Boot      Start         End      Blocks   Id  System                                                                                  
  sda1               1  4294967295  2147483647+  ee  GPT  
O grub, e outros que não suportam GPT, também busca a informação onde estaria a MBR de um disco em formato DOS. A solução é (ab)usar desta configuração para informar ao grub onde ele poderia encontrar a partição /boot e seus respectivos arquivos. Isto é chamado de MBR híbrida, por conter informações do GPT e os dados de algumas partições ainda em formato DOS.

Agora, é necessário editar a tabela de partição da MBR e colocar as informações necessárias. Tentei utilizar o fdisk mas ele acabou destruindo todas as partições GPT, que tive que caçar bits para recriá-las. Googlando mais um pouco, encontrei o projeto GPT fdisk. Este projeto busca implementar um fdisk para formato GPT e algumas funcionalidades como a construção de uma MBR híbrida. Vamos ao roteiro completo.

Roteiro de instalação para o uso de MBR híbrida

Estas são instruções para o RHEL mas que, com pequenas adaptações, podem ser aproveitadas em outros ambientes.

Como primeiro passo, insira uma unidade de armazenamento temporária no servidor e dispare a instalação normalmente. Durante a fase de formatação de discos, vá para o terminal (CTRL+ALT+F2) e crie a tabela de partição em formato GPT:

# parted
(parted) mktable
... yes
... gpt
(parted) quit

Retorne ao instalador gráfico (CTRL+ALT+F6). Opte por um particionamento personalizado e utilize a seguinte disposição:

Dica: marque a partição PAD como "forçada como primária" para que ela fique como a primeira.
Atenção: a ordem é importante!
  • sda (GPT) - disco RAID 5
    1. partição ext3 PAD (2 MB) (não montada ou em diretório não usado como /pad)
    2. partição ext3 para o /boot2 (que se tornará /boot)
    3. PV LVM
      1. partição ext3 para /
      2. partição swap
      3. (demais partições...)

  • sdb (DOS) - pendrive

    1. partição ext3 para /boot
Siga a instalação normalmente. O gerenciador de BOOT deve ser instalado no disco sda, que é a opção padrão. A função da partição PAD irei explicar mais adiante.

O arranjo final dos discos fica desta forma:

# fdisk -u -l

Device Boot      Start         End      Blocks   Id  System                                                                                  
  sda1               1  4294967295  2147483647+  ee  GPT 

# parted
(parted) unit s
(parted) print

Model: DELL PERC H700 (scsi)
Disk /dev/sda: 5854986239s
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start     End          Size         File system  Name  Sinalizador
 1      32s       4129s        4067s        ext2         ext3
 2      4130s     1028129s     1024000s     ext3         ext3
 3      1028130s  5854986206s  5853958077s               lvm
O instalador não configura corretamente o boot no pendrive. Reinicie novamente usando a mídia de instalação da máquina. Porém, ainda no gerenciador de boot do DVD, entre no modo de recuperação: "linux rescue". No modo de recuperação, ele oferecerá a possibilidade de montar o sistema instalado. Permita a montagem. No shell, execute:

# chroot /mnt/sysiimage/
# grub-install --recheck /dev/sda
# exit
# reboot

Agora, o sistema deverá iniciar normalmente. Efetue os passos finais da instalação.
 
Se a presença perpétua da unidade de armazenamento "temporária" não é um problema para o seu caso, você pode parar neste ponto. Neste caso, as partições sda1 e sda2 também não seriam necessárias. Para os demais casos, vamos a etapa retirar a dependência desta unidade de arO instalador não considera o boot no pendrive. Reinicie mazenamento temporária.

No sistema, instale o programa gdisk.
# wget http://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS/gdisk-0.6.10-1.el5.rf.x86_64.rpm
# rpm -i gdisk-0.6.10-1.el5.rf.x86_64.rpm
Agora precisamos criar a configuração híbrida:
# gdisk /dev/sda
... r
... h
... 2
... Y
... 83
... N
... N
... w
Normalmente seria interessante criar uma partição para ocupar todo o restante do disco (última pergunta, penúltimo comando). Porém, por algum BUG deste programa, ele entra em uma live lock, provavelmente por causa do disco com tamanho maior que o limite da MBR. Só não alternar novamente as partições que tudo ficará bem. 


É possível que a partição /pad seja corrompida neste processo. Qualquer coisa, recrie o sistema de arquivos do /pad
# mkfs.ext3 /dev/sda1 -L /pad
O disco, quando observado pelo fdisk fica desta forma:
Disk /dev/sda: 2997.7 GB, 2997752954880 bytes
255 heads, 63 sectors/track, 364456 cylinders, total 5854986240 sectors
Units = setores of 1 * 512 = 512 bytes

Dispositivo Boot      Start         End      Blocks   Id  System
/dev/sda1               1        4129        2064+  ee  EFI GPT
Partition 1 does not end on cylinder boundary.
/dev/sda2            4130     1028129      512000   83  Linux
Partition 2 does not end on cylinder boundary.
Note que o início e o fim da partição sda2, como esperado, é o mesmo do apresentado pelo parted. Agora voltamos a questão em aberto da partição PAD. A partição de PAD possui duas funções. A primeira é manter o número dos dispositivos sincronizados entre a GPT e a DOS. Como necessariamente teremos uma partição "GPT EFI" como sda1 do formato DOS, a primeira partição possível seria a sda2 que, coincidentemente, é a partição de interesse para o grub. O outro motivo é preventivo. A primeira posição válida para uma partição no GPT é no setor 32 (observe o parted). No caso do formato DOS, a primeira partição começa no setor 63. Desta forma, se algum programa estiver protegendo ou validando os setores "de controle" abaixo de 63, como o fdisk faz, eles não acessariam o começo de uma partição no setor 34.

Agora basta realizar a migração dos dados e configurações de /boot para /boot2.
  1. Edite o /boot/grub/menu.lst e troque todas as referências de "hd1,0" (sdb1) para "hd0,1" (sda2).
  2. Copie todo o conteúdo de /boot para /boot2 (cp -a /boot/* /boot)
  3. Desmonte ambas as partições (umount /boot /boot2)
  4. Remova a entrada de /boot2 no /etc/fstab. Note que a chamada da partição é pelo LABEL. Para trocar, atualize o label das duas partições:
    1. e2label /dev/sda2 /boot
    2. e2label /dev/sdb1 xxxx
  5. Remonte a partição (mount /boot)
  6. Remova a unidade de armazenamento temporária
  7. Reinstale o gerenciador de boot (grub-install --recheck /dev/sda)
  8. Se tudo ocorrer bem, reinicie o sistema.
Somente para reforçar a ideia, se seu sistema não tem discos de mais de 2.2TB, esqueça tudo que eu escrevi. Se tudo possui suporte nativo ao GPT (BIOS, kernel e gerenciador de boot e ferramentas) não use a MBR híbrida. E, se for necessário, mude para UEFI. Somente em último caso faça o que eu escrevi neste artigo.


Agora, basta cuidar para atualizar os dados da MBR com o gdisk caso seja alterado a posição ou tamanho da partição sda2. Criar ou alterar volumes lógicos não tem problemas.

Até a próxima.