玩式草子─ソフトウェアとたわむれる日々

第45回 Nexus 7とMTP[その2]

この記事を読むのに必要な時間:およそ 4 分

前回紹介したように,gmtpに文字コード回りのパッチをあてることで,無事Plamo Linux環境とNexus 7の間でファイルをやりとりできるようになりました。しかしながら,あれこれ使っているとgmtpの欠点も目についてきました。

まず最初に気になったのは,gmtpを起動してからNexus 7側のデータが表示されるまでにずいぶん時間がかかることです。しばらく待っていれば表示はされるものの,どれくらい待たされるのかが分からないのはちょっと苦痛です。

またgmtpには,ファイルの転送のみならず,ファイルの削除や移動といった機能も用意されてはいるものの,Nexus 7上ではそれらの処理は機能しないようで,操作しようとすると多数のエラーメッセージが出力されます。

これはNexus 7のMTP機能の実装に問題があるのかも知れません。

前回紹介したように,EUC-JPを利用可能にするための修正も,ファイル名の文字コードしか直していないので,途中のパス名に日本語があるとエラーダイアログが表示されるのも見苦しいところです。

そのようなわけで,gmtp以外に何かいいツールはないか,と探してみることにしました。

FUSEとjmtpfs

そうして見つけたのがjmtpfsです。mtpfsはgmtpとは全く異なる視点から開発されたソフトウェアです。すなわち,gmtpがMTPデバイス上のファイルを操作するための,いわゆるファイル管理ツールとして設計されているのに対し,jmtpfsはMTPデバイスを従来のUSBマス・ストレージクラスと同じように,ファイルシステムとしてマウントする機能を提供するように設計されています。

しかし前回にも触れたように,自律的にファイルを管理しているMTPデバイスでは,単純なUSBストレージデバイスとは異なり,ファイルシステムそのものは外部に公開せず,データのやりとりはMTPプロトコルを介することになっています。そこでjmtpfsでは,MTPデバイスへのアクセスはlibmtpを用い,その結果をカーネルへFUSEの機能を用いて提供することで,MTPデバイスを仮想的なファイルシステムとして見せるような設計になっています。

この方法でMTPデバイスを利用するのはjmtpfsが最初ではなく,先に開発された"MTPfs"というというソフトウェアも存在します。しかし,MTPfsはここ数年開発が停滞しており,Nexus 7のような新しめのMTPデバイスは正しく操作できないようです。

FUSE(Filesystem in USErspace)は,本来カーネル内部の処理であるファイルシステムに関する操作をユーザ領域で実行可能にする機能です。

HDD等の記憶装置とデータをやりとりするファイルシステムは,速度と信頼性を要求される重要かつ複雑な機能で,たいていのOSでは専用に設計された標準ファイルシステムがカーネルの構成要素として不可分に組み込まれています。

一方,伝統的なUNIXに比べてずっと遅れて誕生したLinuxでは,専用のファイルシステムを開発する一方で,他のOS用に普及している各種ファイルシステムにも積極的に対応してきました。その結果,モジュールドライバ化された多数のファイルシステムが利用可能で,それらを必要に応じて組み込んだり取り外したりできるようになっています。

Linuxのファイルシステムはこのように柔軟性に富んだ設計になっているので,新しいファイルシステムはカーネルの他の部分とは独立したモジュールドライバとして開発することができます。しかし,他の部分とは独立に開発できると言っても,カーネル内部で動作するドライバを書くにはカーネルプログラムに関する知識が必要で,コーディングやデバッグもユーザ領域で動作する通常のソフトウェアに比べて大変です。そこで考案されたのがFUSEです。

FUSEは他のファイルシステム用のドライバ同様,モジュールとしてカーネルに組み込まれるものの,HDD等の記憶装置用のデバイスドライバを操作するのではなく,ユーザ領域で動作するソフトウェアからのデータを受け取り,あたかも記憶装置からのデータのように見せることができます。

図1 通常のファイルアクセスとFUSEを使ったアクセス

図1 通常のファイルアクセスとFUSEを使ったアクセス

すなわち,FUSEのAPIを利用して必要な情報をやりとりするようなソフトウェア(FUSE用サービス)さえ書けば,ファイルがどこにあっても,極論すればファイルの実体は存在しなくても,他のファイル操作コマンドからはHDD上の通常ファイルと同様に扱えるわけです。

このようなFUSEの特徴を利用して,tarやzipでまとめた書庫ファイルを展開せずに読み書きしたり,sshやhttp経由で利用しているネットワークサービスをローカルなファイルシステムと同様に見せたり,ファイルやディレクトリを透過的に暗号化したり,NTFSやZFSといったLinux以外のOS用のファイルシステムを利用したりするサービスが多数開発されています。

今回紹介するjmtpfsもそのようなサービスの一種で,libmtp経由でMTPデバイスにアクセスした結果をFUSE経由で他のアプリケーションに提供するように設計されているわけです。

jmtpfsとFDclone

jmtpfsのビルドは簡単で,ソースコードを展開し,configure && make installだけで済みます。作成されるのはjmtpfsというコマンドだけで,MTPデバイスをマウントしたいディレクトリを引数に指定して,このコマンドを実行すればいいだけのようです。一般ユーザとして自分のホームディレクトリ以下にマウントすることも可能なようなので,さっそく試してみました。

$ mkdir ~/Mtp
$ jmtpfs ~/Mtp
Error: Unable to open ~/.mtpz-data for reading.
Device 0 (VID=18d1 and PID=4e41) is a Google Inc (for Asus) Nexus 7 (MTP).
Android device detected, assigning default bug flags

gmtpではずいぶん時間がかかるMTPデバイスとの接続作業が,jmtpfsではあっと言う間に完了しました。dfで確認してもちゃんと見えます。

$ df -h
ファイルシス                     サイズ  使用  残り 使用% マウント位置
/dev/sdb2                           46G   28G   16G   65% /
none                               7.9G  916K  7.9G    1% /dev
/media                             7.9G     0  7.9G    0% /media
/tmp                               7.9G   72K  7.9G    1% /tmp
192.168.1.6:/share/Srcs/           299G  280G   19G   94% /share/Srcs
..
jmtpfs                              28G   14G   14G   50% /home/kojima/Mtp

これはいけるかも,と思って~/Mtp以下をのぞいてみましたが,残念ながら文字コードが合っていないようです。

$ ls ~/Mtp/
????????鴻???????若??/

NKFを使って文字コードを調べると,想像通りUTF-8になっていました。

$ ls ~/Mtp/ | nkf -g
UTF-8
$ ls ~/Mtp/ | nkf -e
内部ストレージ/

普段使っているKDEのファイルマネージャdolphinでは,ファイルシステム上の文字コードはEUC-JPだと思っているので,文字化けして使いものになりません。

図2 Dolphineから見たMTPデバイス

図2 Dolphineから見たMTPデバイス

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html

コメント

コメントの記入