Recuperando um MacBook Intel parado instalando o Ubuntu

Existem vários maneiras, eu corri a mais arriscada, simplesmente “mandei embora” o MacOS, apagando as respectivas partições (com e excepção da partição de boot EFI), e quando fui instalar o Ubuntu, o sistema insistia em não reconhecer a nova partição com o Ubuntu instalado, procurei com insistência na net soluções, até que encontrei este artigo[^1]. E percebi que o problema tem a ver precisamente com a partição EFI, que no mac tem de ser HFS+, e não FAT, para que o sistema a reconheça como tal. De forma que como instalador do Ubuntu instala esta partição com o sistema FAT, ela tem de ser apagada e substituída por uma HFS+, como vamos ver de seguida.

TL; DR

Sumáriamente, para os impacientes, os passos são os seguintes:

  • Instalar o ubuntu nornalmente
  • Reiniciar no boot menu do Grub e através da linha de comandos deste, descobrir a partição raíz do Ubuntu que acabou de instalar
  • Através de um comando Grub nessa linha de comandos, arrancar o Ubuntu
  • Instalar software no Ubuntu para criar a partição HFS+ EFI
  • Apagar a partição EFI FAT criada pelo instalador do Ubuntu substituí-la pela HFS+
  • Instalar o bootloader do grub na partição EFI
  • Reiniciar o sistema, e agora o boot menu Grub já deve aparecer com o Ubuntu…

Agora vamos aos passinhos todos, um a um…

O detalhe todo…

  • Instale o Ubuntu normalmente no seu mac e espere que complete e o sistema peça para reiniciar, deixe ficar o disco de instalação que utilizou ligado no USB, porque vamos precisar dele de seguida
  • Após o início, mantenha a tecla Meta (Maçã) premida, da mesma que usou para arrancar a partir do disco USB, mas quando aparecer o boot menu do Grub prima c, isso vai fazer com que apareça uma linha de comandos:

    grub>

nessa linha de comandos, digite:

 grub> ls

e irá aparecer algo do género:

 (memdisk) (hd0) (hd1) (hd1,gpt3) (hd1, gpt2) (hd1,gpt1) ...

Supondo que `hd1` é o disco onde instalou o Ubuntu, você pode descobrir qual das várias partições `gptX` é aquela onde está o Ubuntu instalado. Se digitar por exemplo (hd1,hpt1) e premir `<Tab>` depois o grub vai auto-completar com qualquer

grub> ls (hd1,hpt1)/boot/grub

e o sistema disser

error: file `/boot/grub' not found.

isso signfica que não é a partição que estamos á procura. Mas se tentar com a seguinte:

grub> ls (hd1,gpt2)/boot/grub
unicode.pf2 ...

Cá está. Esta é a partição onde está o sistema raíz do Ubuntu instalado. De seguida temos de dizer
ao sistema que é esta a partição raíz:

grub> set root=(hd1,gpt2)

De seguida temos de descobrir o UUID, identificador único da partição raíz:

grub> ls -l (hd1,gpt2)
        Partition hd1,gpt2: Filesystem type ext* 〈...snip...〉 UUID e86c20b9-83e1-447d-a3be-d1ddaad6c4c6 - Partition start at [...]

Essa sequência de números hexadecimais não vai ser a mesma que vai aparecer a si, mas aponte o UUID que ele vai ser necessário no passo seuginte:

grub> linux /boot/vmlinuz〈...prima tab!..〉.efi.signed root=UUID= e86c20b9-83e1-447d-a3be-d1ddaad6c4c6[^1]

[^2]: Substitua pelo UUID que encontrou acima

Aqui estamos basicamente a dizer ao grub a localização da imagem do kernel do Linux

De seguida basta apontar a localização da imagem de arranque do sistema, para tal prima na CLI do Grub:

grub> initrd /boot/initrd〈...tab aqui!...〉

Então para completar este passo basta digitar:

grub> boot 

E voilà! Vai ver as mensagens do Kernel aparecer dizendo que o Linux está a ser executado…

Nota: se por qualquer após o kernel ter acabado de ser executado, se for deixado num prompt de initrafms, significa isso que o sistema não conseguiu montar a partição raíz, provavelmente porque enganou-se ao escrever o UUID…

Criando a partição de boot EFI baseado em HFS+

Para o passo seguinte, já com o sistema do Linux a correr, vamos precisar de instalar alguns pacotes de software para poder criar a partição EFI. Para isso vamos precisar dum pacote. Na página[^1] sugere instalar um repositório PPA. Mas se estiver a correr Ubuntu 18 ou posterior, não vai conseguir instalar o software usando o apt. Em vez disso aceda à página do repositório directamente descarregue os pacotes mactel-boot e mactel-boot-logo. Instale ambos os pacotes .deb com `dpkg -i`.

Depois instale os pacotes:

hfsprogs gdisk grub-efi-amd64

De seguida execute o utilitário `gdisk` para listar as partições no disco `sda`:

$ sudo gdisk /dev/sda
GPT fdisk (gdisk) version 1.0.1
Partition table scan:
  MBR: hybrid
  BSD: not present
  APM: not present
  GPT: present
Found valid GPT with hybrid MBR; using GPT.
Command (? for help):

prima `p` e `<Enter>` para listar as partições em `sda`:

Command (? for help): p
Disk /dev/sda: ...
[...]
Number  Start (sector)  End (sector)  Size     Code   Name
   1         2048         1050623  512.0 MiB   EF00   EFI System Partition
[...]

Neste caso, e o seu pode ser um pouco diferente, a instalação do Ubuntu criou uma partição com 512 MB usando FAT (vfat).

O mac não reconhece esta partição neste sistema de ficheiros, portanto vamos apagá-la:

Command (? for help): d
Partition number (1-3): 1

E criamos una nova com HFS+:

Command (? for help): n
Partition number (1-128, default 1): 1

Prima `<Enter>` duas vezes para aceitar os valores propostos

First sector (34-121307102, default = 2048) or {+-}size{KMGTP}:
Last sector (2048-1050623, default = 1050623) or {+-}size{KMGTP}:

Mas quando chegar a vez de especificar o sistema de ficheiros, introduza `AF00`:

Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300): AF00
Changed type of partition to 'Apple HFS/HFS+'

Agora, basta fazer `<w>+<Enter>` seguido de `<Y>` para aceitar os valores introduzidos e escrevar a nova tabela de partições:

Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): Y
OK; writing new GUID partition table (GPT) to /dev/sdd.
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.

Temos que formatar a nova partição:

$ sudo mkfs.hfsplus /dev/sda1 -v Ubuntu
Initialized /dev/sda1 as a 512 MB HFS Plus volume

De seguida, temos de indicar ao sistema que apagámos uma partição, e para isso temos de editar o ficheiro `/etc/fstab`:

sudoedit /etc/fstab

Se o ficheiro tiver um conteúdo análogo a este:

# /boot/efi was on /dev/sda1 during installation
UUID=C59D-1B30  /boot/efi       vfat    defaults        0       1

Apague a linha começada por UUID que indica a partição EFI que havia sido criada pela instalação e que nós apagámos.

De seguida, confirmamos de que já não está nenhuma partição montada em /boot/efi:

$ mount | grep /boot/efi
/dev/sda1 on /boot/efi ...

Se aparecer uma linha semelhante a esta, "desmontamos" a partição do sistema de ficheiros:

sudo umount /dev/sda1

De seguida vamos instruir o sistema de que queremos uma nova partição que vai ser montada nesta posição:

sudo bash -c 'echo UUID=$(blkid -o value -s UUID /dev/sda1) /boot/efi auto defaults 0 0 >> /etc/fstab'

E vamos montar a partição no /etc/fstab:

sudo mount /dev/sda1

De modo que deva voltar a aparecer uma partição montada em /boot/efi:

$ mount | grep /boot/efi
/dev/sda1 on /boot/efi ...

De seguida vamos reinstalar o GRUB na nova partição, a começar pela directoria dentro da partição EFI:

$ sudo mkdir -p "/boot/efi/EFI/$(lsb_release -ds)/"

a expressão $(lsb_release -ds) produz um nome da pasta com a versão correcta do Ubuntu que estamos a usar.

De seguida temos de criar dois ficheiros para que o mac reconheça a partição EFI. Os ficheiros são inúteis do ponto de vista prático, mas são necessários para a que a partição seja reconhecida:

$ sudo bash -c 'echo "This file is required for booting" > "/boot/efi/EFI/$(lsb_release -ds)/mach_kernel"'
$ sudo bash -c 'echo "This file is required for booting" > /boot/efi/mach_kernel'

Vamos então reinstalar o GRUB na partição EFI:

$ sudo grub-install --target x86_64-efi --boot-directory=/boot --efi-directory=/boot/efi --bootloader-id="$(lsb_release -ds)"

Só nos falta marcar (bless) usando um dos programas que instalámos do repositório:

sudo hfs-bless "/boot/efi/EFI/$(lsb_release -ds)/System/Library/CoreServices/boot.efi"

E finalmente, temos a configuração do GRUB:

$ sudo sed -i 's/GRUB_HIDDEN/#GRUB_HIDDEN/g' /etc/default/grub
$ sudo sed -i 's/GRUB_TIMEOUT=10/GRUB_TIMEOUT=0.1/' /etc/default/grub
$ sudo grub-mkconfig -o /boot/grub/grub.cfg

E pronto! Basta reinicar e irá aparecer o bootmenu do GRUB no arranque!


Posted

in

,

by