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

# 経緯
先日samsung のスマートフォンをLinux マシンにUSB 接続をしたところ、通常のストレージデバイスと同じように認識(/dev/sdX  にスペシャルファイルが作成)されるかと思っていたところ、そうはならなかった。


```text
[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 からインストールします。


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


```console: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 "ディレクトリ"` コマンドを実行します。

```console:fusermount
# 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/0044

- mount mtp device on Debian wheezy (htc desire 500 in my case)
http://crunchbang.org/forums/viewtopic.php?id=35093