iPhone sur Debian – Part 1
Je côtoie quotidiennement, et je n’ai pas honte de le dire, des utilisateurs de Ubuntu. Autant le préciser de suite: aucune vanne récurrente ne fuse dans le bureau, aucune remarque déplacée, une ambiance somme toute très respectueuse.
Personnellement, je n’ai pas de problème de souris qui arrête de fonctionner (“rhaaa mais qu’est-ce qui brouille le signal bluetooth ?!?”), de raccourcis-claviers qui disparaissent (“mon Ctrl-K ne fonctionne plus …”), ou encore de daemon de gestion de son qui fait ce qui lui plait (“rhaaa mais ! pourquoi c’est cette carte qui est sélectionnée par défaut ?!??”). Je regrette de ne pouvoir m’extasier sur l’ensemble de pouick-pouicks clignotants des bureaux Ubuntu annonçant fièrement “Votre batterie est en fin de vie”, ou bien encore voir la photo haute résolution de l’imprimante que j’installe.
Finition au poignet
Bref, j’utilise un système rétrograde, qui ne fournit pas le Flash, dont le bureau est en noir et blanc, sur lequel je compile un noyau dès que je veux créer un répertoire: Debian GNU/Linux
J’essaie tout de même de rester dans la modernité car je dispose d’un iPhone, fourni par mon employeur. Jusqu’à maintenant, j’utilisais une machine virtuelle pour exécuter iTunes, me permettant d’effectuer les mises à jour du petit monstre et de l’alimenter en musique numérique acquise parfaitement légalement. L’appareil n’est pas “jailbreaké”, pour des raisons de garantie. J’en ai déjà pété deux et je n’ai pas envie de jouer avec Apple (oui, c’est pas solide).
J’en suis arrivé à un stade où la VM me les brise menu, surtout pour le transfert de fichiers musicaux. En gros il me fallait quelque chose qui me permette de
- monter ce téléphone propriétaire construit par des petites mains d’enfants,
- effectuer des manipulations de fichiers,
- démonter proprement.
Mais je n’aime pas attendre une fonctionnalité qui apparaîtra au bon vouloir d’un éditeur, quand il l’aura décidé, ou lorsqu’il trouvera cela pertinent. Plusieurs projets existent, et s’ils ont l’air de parfaitement fonctionner avec un iPod, il semble que l’iPhone reste leur bête noire.
Un certain Héctor Martín Cantero, dont les doigts ne sont pas dans un certain orifice, nous gratifie d’un bon petit projet: usbmuxd. Recette qu’ il faudra assaisonner avec du libiphone/libimobiledevice de Matt Colyer.
Bon, c’est quoi le merdier ?
Lorsqu’on branche le smartphone directement, sans préparation de l’OS, on obtient évidemment un message émanant du kernel nous informant qu’un nouveau matériel est branché:
usb 2-3: new high speed USB device using ehci_hcd and address 2 usb 2-3: New USB device found, idVendor=05ac, idProduct=1292 usb 2-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3 usb 2-3: Product: iPhone usb 2-3: Manufacturer: Apple Inc. usb 2-3: SerialNumber: ici_le_numero_de_serie_de_la_bête usb 2-3: configuration #1 chosen from 4 choices
Et c’est tout.
C’est sans compter sur les informations se trouvant sur http://wikee.iphwn.org/.
Le tout repose bien évidemment sur la libusb.
En s’intéressant en particulier aux communications de l’iPhone, on apprend que ce smartphone communique au travers d’un “multiplexeur USB”. Grossièrement un bout de soft qui permet de parler TCP, sur USB, pour échanger des messages avec l’aïfaune. Et justement, le usbmuxd du Marcan, c’est un ensemble deamon/proxy qui permet ces échanges. Un bon gros travail de reverse engineering.
Sauf qu’il faut savoir le comprendre et quoi lui dire, au bestiau. C’est là qu”intervient libimobiledevice, anciennement libiphone. Cette bibliothèque permet de parler correctement le protocole propriétaire, peu châtié, des appareils Apple de la trempe iPhone, Ipod Touch et iPad. Grâce à elle, on a accès au système de fichiers, aux paramètres, aux applications installées, bref, à tout ce qui se trouve dans ces machines.
C’est donc sur cette lib que repose le magnifique ifuse ou le bakend afc du vomitif gvfs. Pour le reste, on verra plus tard.
Hey dis donc Jamy ! Ca fonctionne en vrai ?
Bah oui Fred. Je te montre, mais après tu me laisses tranquille, j’ai des trucs à faire avec la petite voix.
Avant tout, il faut que tu saisisses que l’ensemble de l’installation suivante est faite sur une Debian GNU/Linux testing, avec de l’apt-pinning pour sid et experimental.
L’installation du package usbmuxd:
filthy:~# apt-get install usbmuxd Paramétrage de libusbmuxd1 (1.0.3-1) ... Paramétrage de usbmuxd (1.0.3-1) ...
nous donne deux binaires: le daemon usbmuxd, le multiplexeur, et la commande iproxy, interface au daemon. Comme les choses sont bien faites, on dispose également d’un fichier de règles pour udev, prévues pour exécuter le daemon lorsqu’un smartphone à base de pomme est branché:
usbmux 31488 0.0 0.0 18576 880 ? S< 23:11 0:00 /usr/sbin/usbmuxd -u -U
Ceux qui ont un appareil jailbreaké peuvent d’ores et déjà jouer avec la commande iproxy.
Pour les autres, continuons avec l’installation de la libimobiledevice:
filthy:~# apt-get install libimobiledevice1 libimobiledevice-utils Paramétrage de libplist1 (1.2-3) ... Paramétrage de libimobiledevice1 (1.0.0-1) ... Paramétrage de libimobiledevice-utils (1.0.0-1) ...
La libplist1 permet l’accès aux formats binaires et XML ‘made in Apple’.
Ceux qui disposent d’un iPhone avec un OS d’origine peuvent désormais manipuler un peu. En effet, libimobiledevice-utils installe quelques binaires illustrant les accès aux informations contenues dans le téléphone:
arapaho@filthy:~$ ideviceinfo BuildVersion: 7E18 CPUArchitecture: armv6 DeviceClass: iPhone DeviceName: Hustler FirmwareVersion: iBoot-636.66.33 HardwareModel: N82AP HostAttached: true ModelNumber: MB489 PasswordProtected: false ProductType: iPhone1,2 ProductVersion: 3.1.3 ProductionSOC: true ProtocolVersion: 2 RegionInfo: FD/A SBLockdownEverRegisteredKey: true SIMStatus: kCTSIMSupportSIMStatusReady SomebodySetTimeZone: true TimeIntervalSince1970: 1270055897 TimeZone: Europe/Paris TimeZoneOffsetFromUTC: 7200.000000 TrustedHostAttached: true UniqueChipID: 2569498033525 Uses24HourClock: true iTunesHasConnected: true
Volontairement, je n’ai pas mis l’intégralité de l’output de la commande. Il peut être assez important et contient des informations sensibles sur le téléphone et la vie privée. Il est possible de passer en paramètre (-q), à ideviceinfo, le domaine de recherche que l’on souhaite. La documentation est présente dans le package, il suffit de la lire.
On a également accès à une sorte de syslog peu verbeux avec idevicesyslog, ou bien encore effectuer une sauvegarde avec idevicebackup. Bref, tout cela pour se rendre compte que ça fonctionne pas mal.
Il nous reste à monter le système de fichier, en installant dans cet objectif iFuse:
filthy:~# apt-get install -t sid ifuse Paramétrage de ifuse (1.0.0-1) ...
Un point de montage créé plus tard, et hop tout roule:
arapaho@filthy:~$ mkdir ~/iphone arapaho@filthy:~$ ifuse ~/iphone/ arapaho@filthy:~$ mount [...snip...] ifuse on /home/arapaho/iphone type fuse.ifuse (rw,nosuid,nodev,user=arapaho) arapaho@filthy:~$ df -TH Sys. de fich. Type Tail. Occ. Disp. %Occ. Monté sur [...snip...] ifuse fuse.ifuse 7,6G 497M 7,1G 7% /home/arapaho/iphone
Maintenant, on commence à respirer. On entrevoit facilement que se libérer de l’immonde iTunes, au combien lourd et lent, au combien propriétaire et fermé, est tout à fait possible. Tout en gardant un iPhone sous garantie, sans jailbreak. C’est donc tout naturellement que nous pouvons remercier les auteurs des différentes briques utilisées ici.
Dans une seconde partie, j’aborderai les aspects pratiques de la manipulation quotidienne de ces smartphones: transfert de musique, sauvegarde, etc …
A noter que cette méthode pour accéder aux iPhone est disponible depuis un bout de temps, et que plusieurs personnes l’utilisent quotidiennement, sans avoir besoin d’attendre que l’éditeur de leur distribution décide de ce qui est bon pour eux ou pas. Je me réjouis d’avance sur les exclamations de mes camarades qui, une fois leur distribution magique upgradée rapidement et sans heurts, brancheront leur iPhone et s’exclameront: “Woa, trop bien sa mère Ubuntu ! Je vois mon iPhone !”. Ce sera à la fin du mois.