経緯
先日samsung のスマートフォンをLinux マシンにUSB 接続をしたところ、通常のストレージデバイスと同じように認識(/dev/sdX にスペシャルファイルが作成)されるかと思っていたところ、そうはならなかった。
[xxxx.xxxxxx] usb 2-1: new high-speed USB device number 9 using xhci_hcd
[xxxx.xxxxxx] usb 2-1: New USB device found, idVendor=04e8, idProduct=6860
[xxxx.xxxxxx] usb 2-1: New USB device strings: Mfr=2, Product=3, SerialNumber=4
[xxxx.xxxxxx] usb 2-1: Product: XX-YYY
[xxxx.xxxxxx] usb 2-1: Manufacturer: samsung
[xxxx.xxxxxx] usb 2-1: SerialNumber: ffffffffffffffff
原因は、最近のAndroid デバイスでは外部機器との通信にMTP(Media Transfer Protocol) と呼ばれる専用プロトコルを使用するようになっており、従来のUSB メディアやUSB メモリのようにdmesg でドライブレター(/dev/sdX
といったファイル) が自動的に 認識されて、それをマウントしてファイルを取り出すといった方法が使えないようになっています。
MTP プロトコルを使用することによって、従来の方式では、パーティションごと公開してしまうことによって、自身が管理してい るファイルを不意に上書きされたり変更されてしまうといったリスクを防ぐことができます。
もともとMTP プロトコルはWindows 用に開発されていましたが、Unix 向けにlibmtp
というライブラリも開発されています。
今回使用しているLinux で利用したライブラリや技術要素としては下記のとおりです。
jmtpfs
jmtpfs
を使用することでMTP デバイスをファイルシステムとしてマウントできるようにする機能を利用することが できます。
jptpfs
は内部的にはjmtpfs
とFUSE(Filesystem in USErspace)
を利用しており、libmtp を用いてデバイスへのアクセスを行い、その結果をFUSE
経由でkernel に提供することでMTP デバイスを仮想的 なファイルシステムとして見せるような設計となっています。
FUSE(Filesystem in USErspace)
本来kernel 内部で行われる複雑なファイルシステムに関する処理をユーザ領域で実行可能にする機能です。
一般的なファイルシステムはkernel 内にモジュールとして盛り込まれ、HDD やSSD などのデバイスからkernel を通してユーザ領 域とファイルという単位でデータをやり取りしてといった機能を持っているのが一般的です。
一方でFUSE は他のファイルシステムと同様にkernel に組み込まれているものの、他のユーザ領域で動いているソフトウェアから データを受け取り、それをあたかもHDD やSSD のようなデバイスから取得してきたファイルであるかのように見せることができる ようになります。
環境準備
今回はFedora を利用しました。
Fedora でjmtpfs
を利用するには、dnf からインストールします。
# dnf install jmtpfs
......
Dependencies resolved.
######====================================================================================================================
Package Arch Version Repository Size
######====================================================================================================================
Installing:
fuse x86_64 2.9.7-1.fc24 updates 85 k
jmtpfs x86_64 0.4-3.fc24 fedora 62 k
libmtp x86_64 1.1.11-1.fc24 updates 170 k
Transaction Summary
######====================================================================================================================
Install 3 Packages
マウント
jmtpfs
をインストールしたら適当な場所にディレクトリを作成してマウントするだけです。
# cd ~
# mkdir /mnt/android
# jmtpfs /mnt/android
Device 0 (VID=04e8 and PID=6860) is a Samsung Galaxy models (MTP).
# cd /mnt/android
# ls -l
...ファイル一覧が表示される...
ファイルが閲覧できるようになっていれば成功です。
jmtpfs
を使うことで通常のファイルシステムと同様に、ファイルの参照、コピー、移動ができるようになっていま す。
アンマウント
アンマウントを行うにはfusermount -u "ディレクトリ"
コマンドを実行します。
# fusermount -u /mnt/android
参考
第44回 Nexus 7とMTP[その1]
http://gihyo.jp/lifestyle/serial/01/ganshiki-soushi/0044第45回 Nexus 7とMTP[その2]
http://gihyo.jp/lifestyle/serial/01/ganshiki-soushi/0044mount mtp device on Debian wheezy (htc desire 500 in my case)
http://crunchbang.org/forums/viewtopic.php?id=35093