Macbook 2006 e Ubuntu 16.04 con EFI

In famiglia avevamo un vecchio Macbook 2006 che se ne stava in un cassetto già da molto tempo. Perchè non riportarlo a nuova vita?

Oltre OS X Lion 10.7.5 non era possibile andare e realisticamente con 1gb di ram e un hard-disk da 5400rpm eravamo già ai limiti.

Grazie ad un precedente “upgrade” del mio mediacenter avevo un disco SSD da 64gb che mi avanzava, un vecchio portatile con lo schermo rotto e mai riparato (antieconomico) avrebbe fornito la ram per espandere il Macbook al massimo di 3gb.

Ho deciso di passare ad Ubuntu 16.04.1 LTS.  Ho scelto la versione a 64bit, visto che il portatile ha una cpu Intel Core 2 Duo.

Anche in questo caso (vedi il mio post su Lenovo Ideapad Flex 10) mi sono trovato con un problema di sistemi EFI a 32bit con sistemi potenzialmente a 64bit.
Neanche l’immagine di sistema più recente (con Ubuntu 16.04.1) supporta questa situazione ibrida. Ho dovuto quindi cercare delle soluzioni per generare un’immagine da scrivere sulla mia chiavetta usb che potesse essere eseguita dal bios EFI a 32bit del Macbook.

Questa è la sequenza delle istruzioni (da eseguire con diritti di root su un sistema con una Ubuntu 16.04), che ho lievemente modificato rispetto all’originale dedicato ad un ASUS EeeBook:

apt install p7zip-full

wget http://releases.ubuntu.com/16.04/ubuntu-16.04.1-desktop-amd64.iso

# Suppongo che la chiavetta USB sia sul device  /dev/sdb
# La chiavetta non deve essere montata su nessuna directory
# ATTENZIONE! QUESTO CANCELLERA' TUTTO QUELLO CHE STA SU /dev/sdb !
sgdisk --zap-all /dev/sdb
sgdisk --new=1:0:0 --typecode=1:ef00 /dev/sdb
mkfs.vfat -F32 /dev/sdb1

# Monto la chiavetta sulla directory /mnt e
# ci copio il file ISO:
mount -t vfat /dev/sdb1 /mnt
7z x ubuntu-16.04.1-desktop-amd64.iso -o/mnt/ 

# Crea il bootloader a 32bit e lo scrive sulla chiavetta:
apt install git bison libopts25 libselinux1-dev autogen m4 autoconf help2man libopts25-dev 
apt install flex libfont-freetype-perl automake autotools-dev libfreetype6-dev texinfo
git clone git://git.savannah.gnu.org/grub.git
cd grub
./autogen.sh
./configure --with-platform=efi --target=i386 --program-prefix=''
make
cd grub-core
../grub-mkimage -d . -o bootia32.efi -O i386-efi -p /boot/grub \
  ntfs hfs appleldr boot cat efi_gop efi_uga elf fat hfsplus iso9660 linux keylayouts \
  memdisk minicmd part_apple ext2 extcmd xfs xnu part_bsd part_gpt search search_fs_file \
  chain btrfs loadbios loadenv lvm minix minix2 reiserfs memrw mmap msdospart scsi loopback \
  normal configfile gzio all_video efi_gop efi_uga gfxterm gettext echo boot chain eval
cp bootia32.efi /mnt/EFI/BOOT/
umount /mnt

Ricordandosi che è necessario premere il tasto “Option” in fase di boot, altrimenti non potremo scegliere il boot dalla partizione EFI della chiavetta.

Finalmente,  potremo installare una bella Ubuntu sul nostro Macbook, con tabella delle partizioni GPT e pronta per il boot da EFI.

Ma il lavoro, purtroppo, non è ancora finito.. Alla fine dell’installazione, ci accorgeremo che il boot da disco non funziona e che il solo modo per eseguire Ubuntu è affidarsi alla partizione di boot dalla nostra fidata chiavetta.

Qualcosa ancora non va. Finalmente, grazie ad un ottimo articolo ho trovato la spiegazione e la soluzione del mio problema: la partizione EFI deve essere formattata con il filesystem Mac HFS+ (e non Fat32) e devono essere presenti alcuni specifici files.

Nell’articolo appena menzionato, viene spiegato come installare Ubuntu su Mac recenti (dal 2012 in poi) che ovviamente non hanno i problemi che ho affrontato per creare il disco di installazione (sono sistemi full 64bit).

Supponendo che la partizione EFI sia la numero 1, riporto di seguito le istruzioni leggermente modificate per un EFI a 32 bit:

# Repository con utilities per Intel Mac (fan control, HFS bless, bootloader icon, etc..)
add-apt-repository ppa:detly/mactel-utils
apt update
apt install mactel-boot hfsprogs gdisk grub-efi-ia32

umount /dev/sda1 
# Modifica la partizione EFI /dev/sda1 
gdisk /dev/sda

Questi sono i comandi da eseguire con gdisk:

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

Command (? for help): n
Partition number (1-128, default 1): 1
«accept defaults»

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

Command (? for help): w

Formatta la partizione EFI e Aggiorna fstab:

mkfs.hfsplus /dev/sda1 -v Ubuntu
bash -c 'echo $(blkid -o export -s UUID /dev/sda1) /boot/efi auto defaults 0 0 >> /etc/fstab'
mount /boot/efi

Installa Grub:

mkdir -p "/boot/efi/EFI/$(lsb_release -ds)/"
bash -c 'echo "This file is required for booting" > "/boot/efi/EFI/$(lsb_release -ds)/mach_kernel"'
bash -c 'echo "This file is required for booting" > /boot/efi/mach_kernel'
grub-install --target i386-efi --boot-directory=/boot --efi-directory=/boot/efi --bootloader-id="$(lsb_release -ds)"
hfs-bless "/boot/efi/EFI/$(lsb_release -ds)/System/Library/CoreServices/boot.efi"