Linux でAndroid スマートフォンをストレージデバイスとしてマウントする

  • 7
    いいね
  • 0
    コメント

経緯

先日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 は内部的にはjmtpfsFUSE(Filesystem in USErspace) を利用しており、libmtp を用いてデバイスへのアクセスを行い、その結果をFUSE 経由でkernel に提供することでMTP デバイスを仮想的 なファイルシステムとして見せるような設計となっています。

FUSE(Filesystem in USErspace)

本来kernel 内部で行われる複雑なファイルシステムに関する処理をユーザ領域で実行可能にする機能です。
一般的なファイルシステムはkernel 内にモジュールとして盛り込まれ、HDD やSSD などのデバイスからkernel を通してユーザ領 域とファイルという単位でデータをやり取りしてといった機能を持っているのが一般的です。
一方でFUSE は他のファイルシステムと同様にkernel に組み込まれているものの、他のユーザ領域で動いているソフトウェアから データを受け取り、それをあたかもHDD やSSD のようなデバイスから取得してきたファイルであるかのように見せることができる ようになります。

環境準備

今回はFedora を利用しました。
Fedora でjmtpfs を利用するには、dnf からインストールします。

installjptpfs
# 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 をインストールしたら適当な場所にディレクトリを作成してマウントするだけです。

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
# fusermount -u /mnt/android

参考