Tuesday, November 26, 2013

Criando um pendrive com vários Fedoras Live

O fim de semana passado foi de backups e reinstalações de Fedora aqui em casa, para atualizar os laptops da família. Sim, eu conheço o Fedup, preupgrade e outras formas de atualizar o nosso Sistema Operacional favorito, obrigado. Ainda assim, de tempos em tempos eu gosto de fazer backup, chutar tudo o que tem no disco e reinstalar do zero, para dar uma sensação maior de "alívio refrescante". Cada um sabe de si. :-)

Eu tinha as ISOs Live do Fedora 20 Beta RC5, em 32 e 64 bits, e pensei em dar um jeito de colocar as duas co-existindo no mesmo pendrive, pra facilitar a minha vida (um dos laptops antigos é 32b). Tinha recém tentado usar um DVD multi-Live e multi-arch, do Fedora 19, que o Wolnei Tomazelli havia me dado quando nos encontramos por sorte no aeroporto de Floripa. Infelizmente o DVD estava meio arranhado e travava a instalação no meio do caminho, então decidi começar a usar apenas pendrive mesmo.

Eu já criei outros pendrives com Lives ou Installs do Fedora, usando o comando livecd-iso-to-disk, do pacote livecd-tools, porém nunca com várias versões no mesmo pendrive. No fim o processo não foi totalmente automático como eu esperava, mas também não foi nenhuma dor de cabeça arrumar os detalhes do syslinux (boot loader usado na pendrive). Pra quem nunca mexeu mais diretamente nisso pode ser um bom aprendizado.

Preparando o pendrive

Um ponto importante a se cuidar antes de preparar um pendrive de Fedora, é que grande parte dos pendrives não vem com um MBR apropriado, ou vem com uma descrição da partição meio quebrada que o Sistema Operacional entende porém o BIOS se perde na hora de dar boot. Me desculpem a explicação nada técnica, mas minha impressão é essa e só sei que "formatando resolve". ;-)

Para deixar a pendrive preparada, entre no utilitário Discos (gnome-disks), selecione a pendrive, selecione a partição, desmonte-a (ícone de stop, é um quadradinho preto) se estiver montada, e remova-a (ícone que é um sinal de menos). Depois clique no ícone das engrenagens na parte de cima da janela, que se referem ao disco todo, e formate a pendrive no padrão MBR (compatível com a maioria dos computadores). Isso na verdade só zera a tabela de partições do bichinho, reescrevendo o setor 0.

Depois disso, adicione uma nova partição no padrão FAT, clicando no ícone que é um sinal de mais. Por último, clique no ícone de engrenagem que aparece abaixo da representação do disco, e escolha editar o tipo da partição. Para garantir, mude o tipo da partição para W95 FAT32 LBA (0x0c), e marque a partição como bootável. UFA! Falta pouco.

Os comandos a partir de agora usam o dispositivo /dev/sdb para representar a pendrive. TOME CUIDADO E VERIFIQUE QUAL DISPOSITIVO REPRESENTA A SUA PENDRIVE. Para garantir que o pendrive tenha um MBR que funcione, rode o comando abaixo:

$ sudo dd if=/usr/share/syslinux/mbr.bin of=/dev/sdb

Agora falta apenas colocar o syslinux no bicho. Rode mais este comando:

$ sudo syslinux -i /dev/sdb1

Pronto, finalmente o pendrive está seguramente pronto pra bootar em qualquer máquina. É possível testar o setup até agora usando o qemu, rodando:

$ sudo qemu-kvm -hda /dev/sdb

A janela do qemu vai mostrar o prompt do syslinux (boot:), indicando que o pendrive está bootando corretamente. Feche o qemu e siga adiante.

Gravando as imagens na pendrive

Bom, partindo do ponto em que o pendrive está plugado porém desmontado e pronto pra bootar (lembre de sempre desmontar pelo utilitário Discos ou manualmente no shell), que tu sabes qual é o dispositivo a ser utilizado e que baixastes as ISOs que queres usar, rode estes comandos:

$ sudo   livecd-iso-to-disk   --multi   --livedir   F20_32   \
        Fedora-Live-Desktop-i686-20-Beta-5.iso    /dev/sdb1

$ sudo   livecd-iso-to-disk   --multi   --livedir   F20_64   \
        Fedora-Live-Desktop-x86_64-20-Beta-5.iso    /dev/sdb1

Cada um vai demorar vários minutos, enquanto eles copiam as imagens. Em princípio estaria tudo pronto, porém fica faltando um pedaço que o livecd-iso-to-disk não faz, que é criar uma configuração de syslinux que boote qualquer uma das imagens. Na verdade, neste ponto, a pendrive nem boota corretamente, pois fica no prompt do syslinux sem se ter muito o que fazer ali, a não ser que se saiba de cor a linha gigantesca de boot das imagens Live. O problema é que o livecd-iso-to-disk coloca os diretórios do syslinux dentro do diretório de cada imagem Live, porém quando o syslinux boota ele espera encontrar os seus arquivos de configuração e comandos dentro do diretório syslinux, ou na raiz do pendrive (configuração padrão).

Arrumando a configuração do syslinux

A correção é bem fácil, basta montar a pendrive e copiar o diretório syslinux (copiar, não mover) de um dos diretórios de imagem Live para o raiz do pendrive. Eu copiei o diretório syslinux que achei dentro do F20_64, desmontei e bootei, e funcionou. MAS, funcionou só para as imagens de 64 bits. O problema é que o livecd-iso-to-disk não é esperto o suficiente pra juntar as duas configurações de syslinux das duas imagens Live, então essa tarefa fica pra nós. :)

Dentro do diretório syslinux copiado, haverá um arquivo chamado syslinux.cfg. É este arquivo quem descreve o que o syslinux vai fazer quando boota, inclusive montar o menu que é interpretado pelo vesamenu.c32 do mesmo diretório. Abra esse arquivo no gedit, e passe alguns minutos lendo e entendendo o que ele faz.

Depois de se familiarizar um pouco com a sintaxe, note as linhas que contém "label linux0" e "kernel /F20_64/syslinux/vmlinuz0", por exemplo. Estas são as linhas que descrevem como bootar os kernels e imagens de disco live presentes na pendrive. O que precisamos é abrir o syslinux.cfg da OUTRA imagem live, e copiar estas entradas para o syslinux.cfg global do pendrive. É importante mudar o nome do label, para que o syslinux não se perca. Basta mudar de "label linux0" pra "label linux1".

Na minha pendrive eu copiei também a seção "label basic0" da imagem 32 bits, para ser possível bootar a imagem de 32 bits com driver de vídeo vesa, mudando-a para "basic1". É importante mudar também a descrição das linhas "label" para identificar qual imagem é de 32 bits e qual é de 64 bits.

A primeira parte do syslinux.cfg ficou assim:

label linux0
  menu label ^Start Fedora Live 64b
  kernel /F20_64/syslinux/vmlinuz0
  append initrd=/F20_64/syslinux/initrd0.img root=live:UUID=E6F0-8DA8 rootfstype=vfat ro rd.live.image live_dir=F20_64 quiet  rhgb rd.luks=0 rd.md=0 rd.dm=0
  menu default

label linux1
  menu label ^Start Fedora Live 32b
  kernel /F20_32/syslinux/vmlinuz0
  append initrd=/F20_32/syslinux/initrd0.img root=live:UUID=E6F0-8DA8 rootfstype=vfat ro rd.live.image live_dir=F20_32 quiet  rhgb rd.luks=0 rd.md=0 rd.dm=0

Note como cada label aponta para um diretório específico. Facilita testar com o qemu-kvm (de preferência passando -m 1024 para ele ter bastante memória) até ter certeza que tudo está perfeito.

Adicionando ainda mais uma imagem

Pra completar, resolvi baixar ainda uma terceira imagem Live, dessa vez a Fedora-Live-LXDE-i686-20-Beta-5.iso para testar em sistemas mais antigos. Vamos rever como adicionar ela ao pendrive, que agora terá 3 imagens Live diferentes:

$ sudo   livecd-iso-to-disk   --multi   --livedir   F20_LX32   \
        Fedora-Live-LXDE-i686-20-Beta-5.iso    /dev/sdb1

Quando estiver pronto, monte o pendrive de novo, e faça o esquema de copiar as seções do syslinux.cfg dessa nova imagem para o syslinux.cfg "global" da pendrive. Agora as seções "label linux*" ficaram assim:

label linux0
  menu label ^Start Fedora Live 64b
  kernel /F20_64/syslinux/vmlinuz0
  append initrd=/F20_64/syslinux/initrd0.img root=live:UUID=E6F0-8DA8 rootfstype=vfat ro rd.live.image live_dir=F20_64 quiet  rhgb rd.luks=0 rd.md=0 rd.dm=0
  menu default

label linux1
  menu label ^Start Fedora Live 32b
  kernel /F20_32/syslinux/vmlinuz0
  append initrd=/F20_32/syslinux/initrd0.img root=live:UUID=E6F0-8DA8 rootfstype=vfat ro rd.live.image live_dir=F20_32 quiet  rhgb rd.luks=0 rd.md=0 rd.dm=0

label linux2
  menu label ^Start Fedora Live LXDE 32b
  kernel /F20_LX32/syslinux/vmlinuz0
  append initrd=/F20_LX32/syslinux/initrd0.img root=live:UUID=E6F0-8DA8 rootfstype=vfat ro rd.live.image live_dir=F20_LX32 quiet  rhgb rd.luks=0 rd.md=0 rd.dm=0

A seção que contiver "menu default" será a que estará selecionada por default no menu criado pelo vesamenu.c32 do syslinux. Para finalizar os últimos retoques, se pode remover alguns arquivos agora inúteis, como os "boot.cat", as cópias extras do memtest, etc. Para servir de referência, aqui está o arquivo syslinux.cfg que eu criei até agora, separado com linhas extras pra facilitar a compreensão.

Novamente, lembre de sempre desmontar pelo utilitário Discos ou manualmente no shell, ao invés de "ejetar", pois o "ejetar" desliga o pendrive, e será necessário retirá-lo e plugá-lo novamente, e aí desmontar de novo. :-) E teste sempre com "sudo qemu-kvm -m 1024 -hda /dev/sdb", para facilitar a vida.

Para fazer um pendrive com syslinux ainda mais útil, se pode inclusive copiar alguns módulos extras do syslinux para dentro do diretório syslinux na raiz do pendrive. Eles estão em /usr/share/syslinux e podem ser acessados no prompt de boot do syslinux, quando se sai do menu apertando ESC. No meu pendrive eu copiei também os módulos hdt.c32, ls.c32, meminfo.c32, poweroff.com, reboot.c32 e rosh.c32. Experimentá-los fica como tema para casa. ;-)

1 comment:

José Wagner Alves da Cruz said...

Show de bola, da p criar um script e automatizar um pouco, vai ser bem útil p distribuir as isos. Parabéns