Aktuelle Android Geräte nutzen intern meist Linux Dateisysteme und zumindest wenn der Interne Speicher nur aus einem Bereich für Daten und das Android System besteht und keine extra FAT32 Partition als "virtuelle SD Card" als Speicherort für Daten genutzt wird scheitert der Zugriff per Massenspeichermodus im Zusammenspiel mit Windows schon am Dateisystem. Deshalb verwendet Google das Media Transfer Protocol (MTP), eine Weiterentwicklung des Picture Transfer Protocol (PTP) welche Microsoft zusammen mit Canon entwickelt hat um Daten von Mobilen Geräten wie Multimedia Player oder eben auch Smartphones mit einem PC auszutauschen. Aber auch im Zusammenspiel mit Linux Rechnern kann man den Massenspeichermodus nicht verwenden da man nicht im laufenden Betrieb einfach die Systempartition aushängen kann um sie zum PC durch-zureichen.


Während Windows, ab XP mit installiertem Windows Media Player 10, MTP von Haus aus unterstützt kommen sowohl Mac OS X als auch die meisten Linux Distributionen nur mit Unterstützung für das veraltete PTP das nur zur Übertragung von Fotos gedacht ist. Für Mac OS X gibt es von Google einen Dateibrowser der auf das MTP Android Device zugreift während sich Linux Anwender nach einer eigenen Lösung umsehen müssen.

Die meiner Meinung nach bisher beste Möglichkeit ein Androide Phone per MTP in das Linux Dateisystem einzubinden ist go-mtpfs ein FUSE Dateisystemtreiber das MTP Geräte per FUSE in das Linux Dateisystem einhängt.

Christoph Langer hat auf Linuxundich.de eine kurze Anleitung veröffentlicht wie man go-mtpfs einrichtet ein Android Device manuell per Shell Befehle in das Dateisystem einhängt, da es aber nicht besonders bequem ist das Android Phone jedes-mal wieder manuell über die Shell oder ein ShellScript einbinden zu müssen habe ich die Anleitung um UDEV Regeln ergänzt die das ganze automatisieren sobald man das Nexus 4 am PC anschließt (das Nexus 4 muss dazu entsperrt sein sonst wird der MTP Speicherzugriff blockiert).

Zuerst muss man go-mtpfs mit folgenden Befehlen installieren und einrichten:

$ sudo apt-get install golang-go libmtp-dev git
$ sudo go get github.com/hanwen/go-mtpfs
$ sudo ln /usr/lib/go/bin/go-mtpfs /usr/local/bin/
$ sudo adduser $USER fuse

nun legt man einen Mountpoint für das Nexus 4 an und setzt für alle Benutzer des Rechners Zugriffsrechte wenn mehrere Benutzer zugriff auf das Nexus4 bekommen sollen:

$ cd /media
$ sudo mkdir Nexus4
$ sudo chmod 777 Nexus4

Anschliesend erlaubt man noch normalen Nutzern den zugriff auf FUSE indem man in der datei /etc/fuse.conf die zeile user_allow_other einkommentiert:

$ sudo chmod a+r /etc/fuse.conf
$ sudo gedit /etc/fuse.conf

/etc/fuse.conf
...
# Allow non-root users to specify the 'allow_other' or 'allow_root' mount options.
user_allow_other

Nun könnte man das Nexus 4 theoretisch per:

$ go-mtpfs /media/Nexus4

einhängen und anschliesend per:

$ fusermount -u /media/Nexus4

wieder aushängen.

Nun legt man einen neuen Eintrag in der fstab an indem man /etc/fstab öffnet:

$ sudo gedit /etc/fstab

unten in der Datei folgende Zeile hinzufügt:

DeviceFs(Nexus\0404) /media/Nexus4 fuse.DeviceFs(Nexus\0404) allow_other,rw,user,noauto 0 0

Nun muss man noch die UDEV Regeln in der passenden Datei hinterlegen indem man /etc/udev/rules.d/99-android.rules bearbeitet:

sudo gedit /etc/udev/rules.d/99-android.rules

und folgende Zeilen hinzufügt (youtlogin sollte durch den eigenen Benutzernamen ersetzt werden):

# Google Nexus 4 16 Gb Bootloader & recovery mode
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0666" # Bootloader
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d001", MODE="0666" # Recovery

# Google Nexus 4 16 Gb PTP mode (camera)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee5", MODE="0666" # PTP media
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee6", MODE="0666" # PTP media with USB debug on

# Google Nexus 4 16 Gb MTP mode (multimedia device)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee1", MODE="0666" # MTP media
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0666" # MTP media with USB debug on
# Google Nexus 4 MTP mode : automatic mount when plugged (all android versions)
ENV{ID_MODEL}=="Nexus_4", ENV{ID_MODEL_ID}=="4ee1", ACTION=="add", RUN+="/usr/bin/sudo -u youtlogin go-mtpfs -allow-other=true /media/Nexus4"
ENV{ID_MODEL}=="Nexus_4", ENV{ID_MODEL_ID}=="4ee2", ACTION=="add", RUN+="/usr/bin/sudo -u youtlogin go-mtpfs -allow-other=true /media/Nexus4"

# Google Nexus 4 MTP mode : automatic unmount when unplugged (all android versions)
ENV{ID_MODEL}=="Nexus_4", ENV{ID_MODEL_ID}=="4ee1", ACTION=="remove", RUN+="/bin/umount /media/Nexus4"
ENV{ID_MODEL}=="Nexus_4", ENV{ID_MODEL_ID}=="4ee2", ACTION=="remove", RUN+="/bin/umount /media/Nexus4"

Nach dem Neustart den UDEV Services per:

$ sudo service udev restart

sollte das Nexus 4 beim Anschluss an den Rechner automatisch in das Linux Dateisystem eingehängt werden und auch das auswerfen des Phones sollte problemlos funktionieren.

Wie man die Passenden Device und Hersteller IDs bei anderen Devices, z.B. dem Nexus 7, ausliest findet ihr übrigens unter: http://bernaerts.dyndns.org/linux/247-ubuntu-automount-nexus7-mtp

Ich habe dieses Howto im Nachhinein geschrieben und hoffe das ich nichts vergessen habe. Ich werde das ganze aber nochmals an einem zweiten Rechner durchführen und das Howto nochmals überabeiten falls mir dabei Fehler auffallen.
Ich habe das Howto nun erfolgreich auf einem anderen Rechner durchgearbeitet und ein paar kleine Fehler korrigiert so das es so wie hier beschrieben (zumindest unter Ubuntu 12.10) auch auf jedem anderen Rechner funktionieren sollte.