Multiboot de ISOs a partir de uma pen USB

Desde que voltei de Lisboa para casa dos meus pais que tenho tido mais tempo livre do que gostaria. Para o ocupar, só fazendo de conta que sou geek e/ou nerd. Só assim evito trepar às paredes, armado em Spiderman, para depois me atirar para o chão como um lutador de Wrestling.

Uma das coisas que tentei fazer foi colocar vários ISOs de diversas distribuições de GNU/Linux numa pendrive e fazer boot directamente de uma das imagens que escolhesse. O processo levou-me várias horas, sendo que a maioria do tempo foi a experimentar tutoriais e dicas que fui encontrando na net. Escusado será dizer que nenhum deles resultou na totalidade. Só depois de ter ido ao #grub, no Freenode, e de ter recebido ajuda de alguns utilizadores do canal é que fiquei com isto a funcionar como queria e devia.

Para conseguir fazer boot de diversos ISOs, utilizei o Kubuntu 9.10 (a distribuição que uso neste momento), uma pendrive de 8GB com duas partições FAT32 (não sei se funcionará com outro sistema de ficheiros, mas presumo que dê sem qualquer problema), os ISOs do Kubuntu 9.10, Debian 5.0 Businesscard e gNewSense Deltah 2.2, e o GRUB 1.97~beta4.

O primeiro passo é, claro, ter a pen ligada ao computador e as partições criadas. Depois, faz-se mount à partição onde se pretende instalar o GRUB e colocar os ISOs e, de seguida, instala-se o gestor de arranque nessa partição com o comando sudo grub-install --no-floppy --root-directory=/media/USBFolderName /dev/sdx.

Tenham atenção ao /dev/sdx. No meu caso, foi /dev/sdc; no vosso, pode muito bem ser diferente. Convém verificar qual o device da vossa pen. Se já tiverem feito mount a uma partição do dispositivo, basta um cat /etc/mtab para descobrirem qual é. E não se esqueçam que é melhor ter o GRUB instalado na MBR do dispositivo do que numa partição.

Também, tenham atenção ao --root-directory. Ele deve apontar para o mountpoint da partição da pen onde querem instalar os ficheiros do GRUB2. No meu caso, era --root-directory=/media/gnulinux/.

Depois de instalado o GRUB2, na partição vai aparecer-vos uma pasta chamada «boot». Dentro dela, está uma outra chamada «grub». Entrem em ambas e, na última, criem o ficheiro grub.cfg.

Atenção, tem mesmo que ser grub.cfg. Foi isto que me fez andar às voltas, porque a informação que encontrava na net dizia para criar o grub.conf. E conf != cfg. Se não fosse o pessoal do #grub, a esta hora ainda andava aqui às voltas só por causa deste pequeno e importante detalhe.

Agora que o grub.cfg está configurado, temos que decidir onde vamos colocar as imagens das distribuições. Eu preferi fazer assim, mas podem muito bem inserir o conteúdo no ficheiro primeiro e depois colocar as imagens na pen.

Para facilitar, criei uma pasta chamada «isos» na raíz da partição e copiei para lá as imagens. Assim que as coloquei lá, inseri todos os dados necessários no grub.cfg para fazer boot e usar uma das imagens que escolhesse.

Este é o meu grub.cfg

### BEGIN /etc/grub.d/00_header ###
set default=0
set timeout=5
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/white
### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/10_linux ###

menuentry "Try Kubuntu 9.10" {
set quiet=1
loopback loop /isos/kubuntu-9.10-desktop-i386.iso
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=/isos/kubuntu-9.10-desktop-i386.iso noeject noprompt --
initrd (loop)/casper/initrd.lz
}

menuentry "Try Debian" {
set quiet=1
loopback loop /isos/debian-500-i386-businesscard.iso
linux (loop)/install.386/vmlinuz iso-scan/filename=/isos/debian-500-i386-businesscard.iso noeject noprompt --
initrd (loop)/install.386/gtk/initrd.gz
}

menuentry "Try gNewSense 2.2" {
set quiet=1
loopback loop /isos/gnewsense-livecd-deltah-i386-2.2.iso
linux (loop)/isolinux/vmlinuz iso-scan/filename=/isos/gnewsense-livecd-deltah-i386-2.2.iso noeject noprompt --
initrd (loop)/isolinux/initrd.gz
}

### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###


O «set default=0» define qual a imagem que quero que ele arranque por omissão. Neste caso, é o Kubuntu. Se preferisse o Debian, mudava o 0 por 1; caso pretendesse o gNewSense, mudava o 0 por 2. Perceberam a lógica?

O «set timeout=5» é o número de segundos que o menu de arranque do GRUB é mostrado até arrancar a imagem pré-definida anteriormente. Este parece-me ser tempo mais que suficiente para escolher a imagem pretendida.

O «/etc/grub.d/05_debian_theme» é irrelevante, por isso vou saltá-lo. Importa apenas saber que permite definir as cores do menu do GRUB.

Importante, mesmo importante, é tudo o que está entre «### BEGIN /etc/grub.d/10_linux ###» e «### END /etc/grub.d/10_linux ###». É aí que criamos um entrada no menu do GRUB e definimos as opções de arraque de cada uma das imagens. O que lá colocarem irá sempre variar consoante a distribuição e até a própria versão da distribuição.

Para o Kubuntu, foi fácil: a informação que encontrei online estava correcta. Mas para o Debian e gNewSense foi à base da adivinhação e alguma lógica. Mas ficou tudo a funcionar, salvo o gNewSense, que faz boot mas depois bloqueia quando detecta a pen USB. Pode ser algum stress da própria distribuição, que é o que me parece, mas também pode ser que as opções de arranque que defini no grub.cfg não sejam as mais correctas.

Espero que esta informação vos seja útil e evite que também cheguem quase a andar às cabeçadas à parede para fazer mutliboot de ISOs a partir de uma pen USB.

publicado por brunomiguel às 12:30 | link do post | comentar