Blog

Feb092016

Linux auf dem Mac

Heute - naja, was heißt heute - seit einigen Tagen schon, versuche ich Linux auf meinem MacBook2,1 zum Laufen zu bekommen.

Doch woran es zunächst schon scheitert, ist das Booten einer Linux-CD. Ubuntu 14.04 lässt sich booten, davon gibt es schließlich auch ein 64-Bit-Image mit der Bezeichnung "Mac".
Doch neuere Versionen booten nicht. Nein, das tun sie nicht, jedenfalls nicht auf dem MacBook2,1. Nicht mit refit, nicht mit refind, nicht mit der Alt-Taste oder sonstwas.

Eine Lösung dieses wird auf https://bugs.launchpad.net/ubuntu-cdimage/+bug/1298894/comments/16 beschrieben, welches ein kleines C-Programm zur Verfügung stellt, um das ISO-Image von Ubuntu so zu verändern, dass es eben doch bootet.

/*
 Removes all entries but the first one from the El Torito boot catalog of
   http://cdimage.ubuntu.com/daily-live/current/trusty-desktop-amd64.iso

 Compile by:
   cc -g -Wall -o make_single_eltorito make_single_eltorito.c

 Run without arguments in the directory where the ISO image is stored.
*/

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

static char *iso_name = {"trusty-desktop-amd64.iso"};

int main(int argc, char **argv)
{
  int fd, ret;
  unsigned char buf[2048 - 64];
  off_t lba;
  size_t buf_size = 2048 - 64;

  fd = open(iso_name, O_RDWR);
  if (fd == -1)
    goto err_ex;
  if (lseek(fd, (off_t) 32768 + 2048 + 71, SEEK_SET) == -1)
    goto err_ex;
  ret = read(fd, buf, 4);
  if (ret == -1)
    goto err_ex;
  if (ret < 4) {
    fprintf(stderr, "Cannot read 4 bytes from %s\n", iso_name);
    exit(1);
  }
  lba = buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
  if (lseek(fd, lba * 2048 + 64, SEEK_SET) == -1)
    goto err_ex;
  memset(buf, 0, buf_size);
  ret = write(fd, buf, buf_size);
  if (ret == -1)
    goto err_ex;
  if (ret < buf_size) {
    fprintf(stderr, "Cannot write %d bytes to %s\n", (int) buf_size, iso_name);
    exit(1);
  }
  close(fd);
  printf("done\n");
  exit(0);
err_ex:;
  perror(iso_name);
  exit(1);
}

Als Nachtrag merke ich an, dass ich dieses Programm mit cc -g -Wall -o make_single_eltorito make_single_eltorito.c kompiliert habe, so wie auf der verlinkten Hilfeseite nachzulesen ist. Dies funktioniert unter Linux und Mac OS X gleichermaßen und funktioniert auch mit debian-ISOs. Vielleicht funktioniert es sogar mit dem ReactOS.iso-Image.

Zunächst habe ich den Namen der ISO-Datei im Programmcode geändert, dieser ist hard-kodiert, d.h., er lässt sich nicht zur Laufzeit des Programms ändern. Dies hab ich kompiliert, ausgeführt, DVD gebrannt und nun bootet sie auch problemlos.

Um Platz für die Linux-Installation zu machen, habe ich übrigens nicht mit BootCamp, sondern einfach mit dem Festplattendienstprogramm die Partitionen geändert.
Mac OS X hab ich auf meinem 1 TB Laufwerk um 100 GB verkleinert, den Rest hab ich als "Freien Speicher" deklariert.

Die Installation von Ubuntu verlief wie bei jedem anderen PC - mit Ausnahme, dass es bei der Version 16.04 Alpha 2 Probleme gab, wenn ich gleich nach dem Booten die Sprache und die Installation auswählte - also erst in die GUI booten lassen und von dort aus installieren.

Doch nun das dicke Ende:
Was mir bei Ubuntu 14.04 LTS schon passiert ist, trat auch hier ein. Nämlich, dass Refind den GRUB nicht startet - stattdessen gibt es nur einen schwarzen Bildschirm.
Unter 14.04 LTS hatte das alles schonmal funktioniert - bis zu einem Update im Dezember. Vorher lud Refind den GRUB zuverlässig, aber GRUB lud Ubuntu nicht zuverlässig nach. Nun lud Refind nicht einmal mehr den GRUB.
Mittels der SuperGRUB-Disk und der Suche nach grub.cfg-Dateien, ließ sich die installierte Version von Ubuntu 14.04 LTS bzw. jetzt 16.04 Alpha 2 starten. In der Konfiguration war also kein Fehler.

Da wir ja nicht mehr 1997 haben und wir zum Booten einer CD eine Diskette nötig haben, wollen wir auch keine CD mehr zum Booten einer Festplatte nötig haben.
Nun habe ich mal was von anderen Boot-Loadern gehört - wie zum Beispiel GRUB-EFI oder LILO.
Tja, und siehe da, LILO löst das Problem, nachdem es (automatisch) konfiguriert wurde. (Die Anleitung für die automatische Konfiguration wird bei der Installation von LILO angezeigt.) Refind startet LILO, LILO startet Ubuntu 16.04 Alpha 2, fertig.

Nun bin ich mal gespannt, wie lange dieser Zustand anhalten wird, bevor es wieder zu Problemen kommt.
Will ich noch dazu sagen, dass es nun bereits seit 10 Jahren Macs mit EFI und Intel-Prozessoren gibt, diese sind bekannt und beliebt. Da kann es nicht sein, dass die sich derzeit selbst den Ast absägende Linux-Gemeinschaft es nicht hinbekommt, eine für den Mac konzipierte Linux-Boot-CD oder wenigstens eine klare Anleitung zu schaffen, die auf diese Probleme eingeht.
Sicher, Anleitungen gibt es in der Tat viele - doch auf den schwarzen Bildschirm, in den Refind bootet, oder der Tatsache, dass sich Linux-CDs auf bestimmten Macs gar nicht erst booten lassen, geht bisher kaum eine von denen ein.

Noch ein Nachtrag zur iSight-Camera: Grundsätzlich läuft Linux auf dem MacBook2,1 reibungslos. Einzig die iSight-Kamera benötigt eine Firmware, die aus einer Mac OS X Installation heraus extrahiert werden kann.
Genauere Anleitungen dazu gibt es hier und hier. Diese Anleitungen gehen davon aus, dass die Firmware aus einer Snow Leopard-Installation heraus nicht funktionieren würde. Die Einträge sind jedoch von 2010, es sind einige Jahre ins Land gegangen und ich darf an dieser Stelle sagen, dass es mit den aktuellen iSight-Tools in Ubuntu 16.04 LTS Alpha 2 doch funktioniert. Zum Glück ... denn eine Leopard-Installation liegt mir gerade nicht vor. Wahrscheinlich hätte auch die Extrahierung aus einer Lion-Installation heraus funktioniert, jedoch hab ich das nicht probiert. Hätte ich nicht vor einigen Tagen aus Neugier oder Nostalgie Snow Leopard neben Linux und Lion installiert, hätte ich das ganze wohl aus Lion heraus probiert. Vielleicht probiert's irgendwann jemand von Euch und teilt mir mit, ob's klappte.

Tags: