Rockbox auf dem iPod Video
Rocken ohne Blobs
Die Installation des freien Betriebssystems Rockbox ist an sich kinderleicht, ein praktischer graphischer Installationsassistent erledigt das für die meisten MP3-Player auf Knopfdruck. Dies setzt aber einerseits voraus, dass das fragliche Gerät (bzw. sein Speichermedium) noch funktioniert, und ist andererseits etwas gar unabenteuerlich. Wir wollen uns darum heute anschauen, wie man Rockbox sozusagen «von Hand» auf einen iPod installiert und dabei gänzlich auf proprietäre Software verzichten kann.
Der eigentliche Beweggrund, warum ich mich näher mit dem Thema auseinandersetzen wollte, war der bevorstehende Ausfall der Festplatte in meinem iPod Video. Als Ersatz besorgte ich mir einen iFlash-CF um eine CompactFlash-Karte als Speichermedium verwenden zu können. Nachdem ich den Adapter eingebaut hatte, musste ich feststellen, dass der iPod mit der neuen Speicherkarte nichts anfangen konnte und ich diese zuerst mit iTunes initialisieren musste. Da ich auf meinem PC weder iTunes, noch das dazu nötige Windows installiert haben will, machte ich mich auf die Suche nach einem besseren Weg, die CF-Karte in Betrieb zu nehmen.
Rockbox?
Rockbox, für die, die es nicht kennen, ist ein ein freies Betriebssystem für MP3-Player. Es läuft auf unzähligen verschiedenen Geräten und bietet allerlei Funktionen, die weit über das hinausgehen, was die Geräte normalerweise anbieten. Für mich besonders relevant ist die Unterstützung für Dateien in den Formaten Ogg Vorbis und FLAC. Bei einigen Geräten, wie z.B. dem iPod, ist es mit der originalen Software zudem recht mühsam, Musik drauf zu kopieren – mit Rockbox kein Problem, da sich die Geräte nun als ganz normaler USB-Massenspeicher am PC melden.
Was es braucht
Die Abbildung zeigt den logischen Aufbau eines iPod-Speichermediums.

Wenn wir von einer leeren Speicherkarte ausgehen, müssen wir uns also um drei Dinge kümmern:
- Den Master Boot Record (MBR)
- Die Firmwarepartition
- Die Datenpartition
Den MBR können wir mit Hausmitteln erstellen, ebenso das Dateisystem auf der Datenpartition; für die Firmwarepartition und den Inhalt des .rockbox
-Verzeichnisses auf der Datenpartition brauchen wir Spezialsoftware von Rockbox. In den nächsten Schritten werden wir zuerst die notwendigen Programme kompilieren und danach daraus die Images für den iPod erstellen.
Rockbox kompilieren
Wenn wir Rockbox nicht über den einfachen automatischen Installer installieren wollen, müssen wir in einem ersten Schritt den Quellcode beziehen. In den folgenden Beispielen verwende ich das Verzeichnis /tmp/ipod für die einzelnen Zwischenschritte – das lässt sich ggf. oben in den Artikeloptionen anpassen.
$ mkdir -p /tmp/ipod ; cd /tmp/ipod $ git clone git://git.rockbox.org/rockbox $ cd rockbox
Jetzt haben wir unsere lokale Kopie des Rockbox-Quellcodes und können uns daran machen, diesen zu kompilieren.
Cross-Compiler
Jetzt brauchen wir einen Cross-Compiler, der Rockbox für die ARM-Architektur des iPod kompilieren kann; Rockbox bringt praktischerweise alles dazu notwendige mit. Wir fangen damit an, zu definieren, wo unsere Daten hingeschrieben werden:
$ export RBDEV_DOWNLOAD=/tmp/ipod/archives $ export RBDEV_PREFIX=/tmp/ipod/target $ export RBDEV_BUILD=/tmp/ipod/build
Danach starten wir das Skript, welches den Cross-Compiler kompiliert:
$ cd tools/ $ ./rockboxdev.sh Download directory : /tmp/ipod/archives (set RBDEV_DOWNLOAD or use --download= to change) Install prefix : /tmp/ipod/target (set RBDEV_PREFIX or use --prefix= to change) Build dir : /tmp/ipod/build (set RBDEV_BUILD or use --builddir= to change) Make options : (set MAKEFLAGS or use --makeflags= to change) Restart step : (set RBDEV_RESTART or use --restart= to change) Target arch : (set RBDEV_TARGET or use --target to change) Select target arch: s - sh (Archos models) m - m68k (iriver h1x0/h3x0, iaudio m3/m5/x5 and mpio hd200) a - arm (ipods, iriver H10, Sansa, D2, Gigabeat, etc) i - mips (Jz47xx and ATJ-based players) r - arm-app (Samsung ypr0) x - arm-linux (Generic Linux ARM: Samsung ypr0, Linux-based Sony NWZ) y - mips-linux (Generic Linux MIPS: AGPTek Rocker) separate multiple targets with spaces (Example: "s m a" will build sh, m68k and arm)
Nun wählen wir a («arm») als Architektur und lassen alles durchkompilieren; auf meinem klapprigen alten Core 2 Duo dauert das etwa eine Viertelstunde.
Wenn alles geklappt hat, können wir den Cross-Compiler in unseren Pfad aufnehmen, damit ihn das restliche Build-System bei Bedarf findet:
$ export PATH=$PATH:/tmp/ipod/target/bin/
Somit haben wir alles, um Rockbox selbst zu kompilieren.
Rockbox selbst
Nun da wir den Cross-Compiler haben, können wir Rockbox kompilieren. Wir fangen damit an, uns ein Verzeichnis für die generierten Daten zu erstellen:
$ cd /tmp/ipod/rockbox
$ mkdir -p build ; cd build
Danach können wir aus einer langen Liste von Geräten unseren iPod auswählen. Glücklicherweise ist sie ziemlich selbsterklärend:
$ ../tools/configure Using temporary directory /tmp Enter target platform: ==Archos== ==iriver== ==Apple iPod== 0) Player/Studio 10) H120/H140 20) Color/Photo 1) Recorder 11) H320/H340 21) Nano 1G 2) FM Recorder 12) iHP-100/110/115 22) Video 3) Recorder v2 13) iFP-790 23) 3G […]
Für den iPod Video wählen wir Option 22.
Platform set to ipodvideo Build (N)ormal, (A)dvanced, (S)imulator, (B)ootloader, (C)heckWPS, (D)atabase tool, (W)arble codec tool: (Defaults to N)
Dann wählen wir N für ein «normales» Build.
Normal build selected
Using source code root directory: /tmp/ipod/rockbox
Using arm-elf-eabi-gcc 4.4.4 (404)
Using arm-elf-eabi-ld 2.20.1.20100303
Detected make GNU Make 4.2.1
Automatically selected arch: arm (ver 4)
Created Makefile
Nun ist alles bereit und wir können mit dem eigentlichen Kompilieren loslegen:
$ make
Das dauert wieder eine Weile, bei mir gut 12 Minuten. Danach lassen wir uns ein Archiv mit den benötigten Rockbox-Dateien erstellen:
$ make tar
Das sollte nach ein paar Sekunden fertig sein. Jetzt brauchen wir noch zwei kleine Zusatzprogramme für den iPod:
$ make -C ../rbutil/ipodpatcher/ […] $ make -C ../tools/ ipod_fw
Nun haben wir für den Moment alles, was wir an Software brauchen.
Welches Modell?
Bevor wir uns an die Speicherkarte machen können, müssen wir noch eine kleine aber entscheidende Frage klären: Welchen iPod haben wir überhaupt vor uns? Auch wenn sie sich äusserlich nicht unterscheiden, vom iPod Video gibt es (mindestens) zwei verschiedene Ausführungen. Beide haben die Modellbezeichnung «A1136», eines rechnet aber mit Sektoren à 512 Bytes, beim anderen sind es 2048 Bytes. Die Unterschiede bei der Installation sind zwar klein, aber doch relevant.
Glücklicherweise können wir mit den Werkzeugen von Rockbox herausfinden, welche Sektorgrösse unser iPod verwendet; das Programm muss als root
ausgeführt werden. Für den Rest des Artikels unterscheiden wir die beiden Fälle jeweils so:
Modelle mit 512 Bytes pro Sektor
# ../rbutil/ipodpatcher/ipodpatcher -l […] [INFO] Scanning disk devices... [INFO] Read XML info (4 bytes) [INFO] Ipod found - Photo/Color ("winpod") - /dev/sdc [INFO] Reading partition table from /dev/sdc [INFO] Sector size is 512 bytes […]
Modelle mit 2048 Bytes pro Sektor
$ ../rbutil/ipodpatcher/ipodpatcher -l […] [INFO] Scanning disk devices... [INFO] Read XML info (9692 bytes) [INFO] Ipod found - Photo/Color ("winpod") - /dev/sdc [INFO] Reading partition table from /dev/sdc [INFO] Sector size is 2048 bytes […]
Wir merken uns diesen Wert für später. Falls das alte Speichermedium im iPod gar nicht mehr funktioniert, können wir den Wert auf diese Art nicht auslesen. Im diesem Fall hilft einfach ausprobieren – entweder die Anleitung für 512 Bytes oder die für 2048 Bytes sollte funktionieren.
Die Speicherkarte
Nun können wir uns daran machen, Rockbox auf die Speicherkarte zu schreiben. Wir fangen mit dem einfachsten Schritt an, der Partitionstabelle im MBR. Dazu bauen wir die Speicherkarte in den iPod ein und halten beim Einschalten die Tasten SELECT und PLAY gedrückt, der iPod startet dann im «Disk Mode» in dem wir direkt auf die Speicherkarte zugreifen können. Danach verbinden wir den iPod per USB mit dem PC.
Partitionen
Wenn man die Speicherkarte von iTunes initialisieren lässt, werden zwei Partitionen erstellt: eine Firmwarepartition, auf der das Betriebssystem und allerlei anderer Kram von Apple unterkommt, und eine Datenpartition für die Musik. iTunes verwendet dabei 80 MB für die erste Partition – das können wir besser.
Das Image das wir oben erstellt haben ist nämlich (fast) alles, was auf die erste Partition muss, die Grösse der Partition hängt also lediglich von der Grösse des Images ab. Wir lesen diese folgendermassen aus:
$ stat -c %s rockbox.ipod 807828
Mein Firmware-Image ist also 807828 Bytes gross. Dazu kommen noch ein paar Bytes für den Header, das Verzeichnis der Firmware-Partition und ggf. weitere Images (siehe Abbildung), mit 2 MB (2097152 Bytes) sollten wir auf der sicheren Seite sein. Bei einer Sektorgrösse von 512 Bytes heisst das, wir brauchen mindestens Sektoren auf der Speicherkarte.
Der MBR selber braucht auch noch ein wenig Platz auf der Karte, der iPod erwartet darum die erste Partition bei Sektor 63. Um die Partitionen zu erstellen, verwende ich sfdisk
, weil es sich auf einfache Art mit Skripten steuern lässt.
Wie wir jetzt weiterfahren, hängt davon ab, mit welcher Sektorgrösse unser iPod rechnet (siehe oben):
Modelle mit 512 Bytes pro Sektor
- Der iPod hätte seinen MBR gerne bei Sektor 63, darum fängt unsere erste Partition dort an.
- Da jeder Sektor 512 Bytes gross ist, brauchen wir für die Firmware-Partition insgesamt 2097152 / 512 = 4096 Sektoren.
- Die Datenpartition folgt darauf, d.h. bei Sektor 63 + 4096 = 4159.
Das Skript dazu sieht folgendermassen aus:
label: dos
unit: sectors
start=63, size=4096, type=0
start=4159, type=b
Modelle mit 2048 Bytes pro Sektor
- Der iPod hätte seinen MBR gerne bei Sektor 63, darum fängt unsere erste Partition dort an.
- Da jeder Sektor 2048 Bytes gross ist, brauchen wir für die Firmware-Partition insgesamt 2097152 / 2048 = 1024 Sektoren.
- Die Datenpartition folgt darauf, d.h. bei Sektor 63 + 1024 = 1087.
Das Skript dazu sieht folgendermassen aus:
label: dos
unit: sectors
start=63, size=1024, type=0
start=1087, type=b
Wir speichern das Skript als /tmp/ipod.script
und führen es mit sfdisk
aus (dieser Befehl muss als root ausgeführt werden):
# sfdisk /dev/sdX < /tmp/ipod.script
Checking that no-one is using this disk right now ... OK
[…]
The partition table has been altered.
Syncing disks.
Wenn alles geklappt hat, haben wir nun die gewünschten zwei Partitionen auf der Karte. Wir können uns die neue Partitionstabelle anzeigen lassen:
Modelle mit 512 Bytes pro Sektor
$ sfdisk -l /dev/sdX […] Device Boot Start End Sectors Size Id Type /dev/sdX1 63 4158 4096 2M 0 Empty /dev/sdX2 4159 30668799 30664641 14.6G b W95 FAT32
Modelle mit 2048 Bytes pro Sektor
$ sfdisk -l /dev/sdX […] Device Boot Start End Sectors Size Id Type /dev/sdX1 63 1086 1024 2M 0 Empty /dev/sdX2 1087 7896575 7895489 15.1G b W95 FAT32
Firmware
Auf der Firmwarepartition erwartet der iPod, sein Betriebssystem zu finden. Zusätzlich brauchen wir einen vorgegebenen Header und eine Art Inhaltsverzeichnis, damit das Gerät beim Einschalten herausfindet, wo genau es das Image für das System findet.
Wie die Abbildung zeigt, können allerlei verschiedene Images in die Firmwarepartition geladen werden. Rockbox unterstützt mindestens vier verschiedene Kombinationen von Images mit ihren jeweiligen Vor- und Nachteilen. Da wir keine Apple-Firmware starten wollen, orientieren wir uns an Option 4 («OSOS contains only Rockbox»); leider unterstützt der iPod Video das nicht genau so, weshalb wir zusätzlich noch ein zweites, leeres Pseudo-Image mit in die Firmware verpacken müssen. Konkret sieht das dann so aus:
Das Rockbox-Image haben wir oben bereits kompiliert, es heisst rockbox.bin
und liegt im build
-Verzeichnis. Das Pseudo-Image können wir uns von Rockbox generieren lassen. Zuerst bauen wir dazu ein Firmware-Image für den ipod5g
:
$ ../tools/scramble -ipod5g rockbox.bin temp.img
Leider fehlen dem Image ein paar leere Bytes am Ende. Auf dem iPod wäre das egal, da wir aber mit dem Image weiterarbeiten, hängen wir diese noch an:
$ dd if=/dev/zero of=temp.img oflag=append conv=notrunc bs=1024 count=1
An sich sollten wir dieses Image nun auf den iPod kopieren können und wären fertig. Leider erstellt scramble
zur Zeit aber Images, die nur auf iPods mit 512 Bytes pro Sektor funktionieren (und auch da nicht ganz korrekt), wir begnügen uns also damit, aus dem Image die leere Partition zu klauen. Den Dateinamen können wir dabei nicht wählen, ipod_fw
hat diesen beim Generieren der Images fest verdrahtet:
$ ../tools/ipod_fw -o apple_sw_5g_rcsc.bin -e 1 temp.img
Somit haben wir nun beide Images, die wir brauchen: Rockbox in rockbox.bin
und zusätzlich ein leeres apple_sw_5g_rcsc.bin
, weil der iPod das so will. Daraus erstellen wir das Image für die Firmwarepartition:
Modelle mit 512 Bytes pro Sektor
$ ../tools/ipod_fw -g 5g -o firmware.bin -l rockbox.bin -n -r 0xb000 Generating firmware image compatible with iPod video
Modelle mit 2048 Bytes pro Sektor
$ ../tools/ipod_fw -s 2048 -g 5g -o firmware.bin -l rockbox.bin -n -r 0xb000 Generating firmware image compatible with iPod video
Danach schreiben wir das Image (als root) auf die entsprechende Partition:
# dd if=firmware.bin of=/dev/sdX1 bs=512
Somit sollte unser Betriebssystem nun einsatzbereit sein.
Daten
Auf der Datenpartition erstellen wir ein FAT32
-Dateisystem und entpacken die Tar-Datei darauf. Das tun wir auch wieder als root:
Modelle mit 512 Bytes pro Sektor
# mkfs.vfat -F 32 /dev/sdX2
Modelle mit 2048 Bytes pro Sektor
# mkfs.vfat -F 32 /dev/sdX2 -S 2048
Danach entpacken wir die Rockbox-Dateien auf die neue Partition:
# mount /dev/sdX2 /mnt/ipod
# tar --no-same-owner -C /mnt/ipod/ -xf rockbox.tar
# umount /mnt/ipod
Tadaa. Soll heissen, das war auch schon alles; beim nächsten Neustart sollte der iPod Rockbox laden.
Wer nicht nur Sokoban spielen möchte, für den ist jetzt der Zeitpunkt gekommen, noch ein wenig Musik auf den iPod zu laden. Meiner ist schon wieder randvoll und wie die Bilder möglicherweise erahnen lassen, dürfte eines meiner nächsten Projekte der Einbau eines neuen Displays sein.