Egal ob auf dem Hackintosh oder auf einem echten MAC wer unter OS-X Yosemite TimeMachine benutzt und dann in die Lage kommt den Rechner aus dem Backup wiederherzustellen wird sich früher oder später mit folgendem Problem konfrontiert sehen:
Die Sympthome sind hierbei immer die gleichen, das Backup wird zurückgespielt, der Rechner startet neu und schon sieht man das Verbotszeichen und das war es dann. Aber wie kommt es dazu und warum kann ich meinen MAC nicht mehr von einem vorhandenen Backup wiederherstellen? Der schuldige an der Stelle ist die IOAHCIFamily.kext in Kooperation mit dem TrimEnabler für nicht von Apple zertifizierten SSD Speichermedien. Um es klar zu sagen der Fehler tritt unter Yosemite sowohl auf echten MAC´s als auch auf Hackintoshes auf und hängt mit der Tatsache zusammen, dass Apple mit Yosemite den Zwang eingeführt hat nur signierte Extensions zu benutzen zu können. Man mag nun meinen die IOAHCIFamily.kext kommt doch von Apple selbst und müsste doch eigentlich signiert sein was genau genommen auch der Fall ist bis zu dem Zeitpunkt an dem der TrimEnabler ausgeführt wird. Der TrimEnabler macht nichts anderes als einen BinärPatch in die IOAHCIFamily.kext einzubauen um den Trim Support für alle SSD´s zu aktivieren dummerweise verändert der Patch auch die Checksum der Kext und somit wird die Signatur ungültig. Im laufenden Betrieb ist das dank dem flag -kext-dev-mode=1 bekanntlich kein Problem denn der Kext wird geladen obwohl er keine gültige Signatur mehr besitzt nach einem zurückspielen eines Backups wird es jedoch zu einem massiven Problem denn der Kernel weigert sich schlichtweg diesen veränderten kext zu laden das Ergebnis ist ein "Still waiting for root device...".
Aber ich habe doch den kext-dev-mode=1 Flag gesetzt damit sollten doch auch unsignierte Extensions geladen werden, warum funktioniert das hier nicht? Im Spoiler einige Hintergründe..
Hierzu schadet es nicht, wenn man sich mal ein wenig mit der Art und Weise befasst wie OS-X das Thema Extensions während des Bootens behandelt und wie es gelingt dem Kernel unsignierte Extensions unterzuschieben. OS-X verlässt sich beim Systemstart auf ein ziemlich ausgefeiltes cache System das alle benötigten Extensions sowie den Kernel an einem zentralen Ort in einem Cache zusammenführt (/System/Library/Caches/com.apple.kext.caches/Startup/kernelcache). Dieser Cache enthält alle zum starten des Systems nötigen Dateien und wird vom System beim ersten Start zusammengebaut. Ist der kext-dev-mode Flag gesetzt erlaubt OS-X beim erstellen des caches auch unsignierte Extensions mit einzubeziehen, ist der Flag nicht gesetzt bleiben dieses aussen vor. Einmal im cache enthalten wird nicht mehr geprüft ob die Extension signiert ist oder nicht, das System arbeitet. Genau in diesem Mechanismus liegt die Crux, denn nach dem zurücksichern eines Backups ist kein gültiger cache vorhanden und so versucht das System die Extensions beim start aus /S/L/E zu laden und scheitert dabei an der veränderten IOAHCIFamily.kext. So nun aber genug der Theorie, interessiert vermutlich eh die wenigsten und zurück zur eigentlichen Anleitung
Schön und gut, wie kann ich vermeiden, dass das passiert und meine TimeMachine Backups wieder normal benutzen?
Jetzt wo klar ist, wer bzw. was das Problem verursacht ist die Lösung ziemlich einfach und einleuchtend. Alles was zu tun ist ist dafür Sorge zu tragen, dass unser Backup eine unangetastete Version der IOAHCIFamily.kext enthält und die TimeMachine in der Zukunft diese unangetastete Version auch nicht mehr überschreibt. Um das zu erreichen gehen wir wie folgt vor:
unangetastete Version der IOACHIFamily.kext besorgen:
Auf einem echten MAC sowie auf Hackintoshes mit Clover oder Ozmosis gibt es eine Recovery Partition von der wir uns die unangetastete Version der IOACHIFamily.kext besorgen dazu benötigen wir die folgenden Dinge:
-FestplattenDienstProgramm
-Terminal
-KextUtility
-SystemEinstellungen
Als erstes öffnen wir uns ein Terminal und schalten durch die Eingabe von
den debug Modus vom FestplattenDienstProgramm frei. Einmal freigeschaltet haben wir im FestplattenDienstProgramm nun den neuen Menu Punkt Debug
Diesen klicken wir nun an und wählen aus dem Menu den Punkt "Jede Partition einblenden" aus so, dass uns ab jetzt auch alle versteckten Partitionen angezeigt werden. Einmal ausgewählt taucht in der Partitionsliste auf der linken Seite auch die Recovery Partition auf die wir anklicken und mit einem Klick auf aktivieren sogleich auch einbinden.
Einmal eingebunden können wir die Partition auf dem Schreibtisch öffnen allerdings hilft uns das jetzt noch nicht wirklich weiter denn das Objekt unserer Begierde befindet sich in einem aktuell noch verstecken DMG Image auf der Partition. Um dieses sichtbar zu machen geben wir folgende Befehle im Terminal ein
Ist das erledigt wird uns die versteckte BaseSystem.dmg angezeigt und kann eingebunden werden (Rechtsklick -> Öffnen mit -> DiskImageMounter).
Einmal eingebunden befindet sich im Ordner /System/Library/Extensions das Objekt unserer Begierde.
Jetzt einfach die IOAHCIFamily.kext auf den Schreibtisch kopieren und mit dem KextUtility installieren und anschließend den Rechner neu starten. ist der Rechner nun neu gestartet stoßen wir als nächstes ein TimeMachine Backup an um sicher zu stellen, dass der geänderte Kext ins Backup übernommen wird. Sofern Ihr Eure Backups ausschließlich manuell anstoßt könnt Ihr jetzt den TrimEnabler wieder installieren und habt dann trotzdem ein Backup in der Hinterhand von dem Ihr Euer System im Falle eines Falles wiederherstellen könnt. Leider ist bisher kein Weg bekannt, wie man bei inkrementiellen Backups verhindern kann, dass die TimeMachine den Kext im Backup wieder überschreibt.