Como bootar uma imagem ISO usando o Grub

#linux

Senta que lá vem história

Meu último notebook quebrou o teclado :/ e eu tive a oportunidade de usar um MacBook Pro early 2015, esse do screenshot:

Screenshot de "About This Mac"

Eu lembro que tive problemas migrando do Linux para o macOS no passado. Eu sempre usei um sistema de arquivos case-sensitive no Linux (claro), porém no macOS case-sensitive é uma alternativa e não o padrão.

Não estou dizendo para você migrar para um sistema de arquivos case-sensitive no macOS, inclusive eu ouvi falar de alguns softwares que tem problema se você usar no macOS (ouvi falar do Photoshop). Entretando, eu sou um usuário Linux e eu tenho certeza que teria problemas se migrasse novamente. Além do mais esse setup é temporário.

Eu já sabia toda a teoria para reinstalar o macOS, porém não sabia na prática, daí fui pesquisar sobre isso. Achei como fazer isso, mas também encontrei que eu poderia usar o “macOS Recovery” e que esse recovery é exatamente o mesmo que bootar por um pendrive.

Me questionei se eu poderia fazer o mesmo com uma máquina que o principal sistema operacional é Linux.

As restrições para uma opção “recovery” no Linux seriam: tem que ser uma ISO e eu posso instalar essa ISO no HD sem precisar baixar um sistema operacional todo novamente. Tem que ser uma ISO, pois é muito mais fácil atualizar uma ISO. Tem que ser um sistema operacional que eu possa navegar na internet e baixar algo para corrigir o meu principal ou até mesmo instalar ele no HD.

A minha escolha foi para o Ubuntu que agora está na versão 18.04.

No meu setup atual, eu crie uma partição para a imagem ISO e outra para o /boot, 2GB e 512MB, respectivamente. Eu nunca tive uma partição para /boot antes, mas pensei que seria uma boa ideia dessa vez.

Tentei muitas opções usand o dd para fazer essa partição bootar, porém nada funcionou, uma das opções era extrair o conteúdo do HD. Mas se for para extrair o conteúdo do HD eu prefiro bootar a imagem ISO direto.

Como nada funcionou eu apaguei a sda2 e sda3 e criei apenas uma sda2 de 2.5GB.

Em resumo, meu setup é uma partição sda2 com o sistema de arquivos fat (aka, mkfs.fat -F 32). Sim a partição /boot pode ser uma fat.

Mão na massa!

Crie, ou mais provavelmente, atualize o arquivo /etc/grub.d/40_custom com este conteúdo:

#!/bin/sh
exec tail -n +3 $0

menuentry "Ubuntu" {
  set isofile="/ubuntu-18.04-desktop.amd64.iso"
  loopback loop (hd0,2)$isofile
  linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet splash noprompt noeject
  initrd (loop)/casper/initrd.lz
}

Pode ser que você queira remover quiet splash e adicionar o toram.

hd0 em (hd0,2) signigica sda e o 2 é para 2 de sda2. Se fosse um sdb1 seria (hd1,1), por exemplo.

Agora execute:

# grub-mkconfig -o /boot/grub/grub.cfg
# grub-install /dev/sda

Se a ISO estiver numa partição ext4 (eu não testei isso) pode ser necessário adicionar o insmod ext2 depois da linha do menuentry.

Apenas uma recomendação final: teste esse boot, não espere precisar para fazer esse teste.

IMPORTANT: Apagar o diretório /boot/grub faz com que o grub pare de funcionar, a ração disso é que o grub ainda lê conteúdo do disco para carregar as opções. Mantenha a o diretório /boot/grub não importa se a iso esteja dentro dele ou não.

Minha recomendação, e é o que eu faço, é criar uma partição /boot de 2.5GB ou o que for melhor para o seu caso.

Referências