MTP
メディア転送プロトコル (Media Transfer Protocol, MTP) は、多くの携帯電話 (全 Windows Phone 7/8/10 デバイスやほとんどの新しい Android デバイス) やメディアプレイヤ (例: Creative Zen) との間でメディアファイルの転送を行うために使用できます。
目次
接続
MTP を介してコンピュータをデバイスに接続するには:
- 対象デバイスがあなたのコンピュータと USB で接続されている必要があります
- MTP が対象デバイスで有効化されている必要があります
- デバイスのスクリーンがアンロックされている必要があります (セキュリティ上の理由により)
FUSE ファイルシステム
以下のプログラムは、FUSE ファイルシステムを介して MTP デバイスにアクセスできるようにします。
FUSE ベースのファイルシステムを使用する場合、まず先にマウントポイントのディレクトリを作成する必要があるかもしれません。以下の例では ~/mnt
ディレクトリが使われています。
通常、FUSE のマウントは fusermount -u マウントポイント
を使ってアンマウントできます。
Android File Transfer
Android File Transfer — CLI、Qt UI、カスタムの MTP 実装を使用する FUSE ラッパを搭載している MTP クライアント
~/mnt
にデバイスをマウントするには:
$ aft-mtp-mount ~/mnt
アルバムアートを表示させたい場合は、albumart.xxx
という名前にし、一番最初にマウント先のフォルダに配置しておかなければなりません。その後で、他のファイルをコピーしてください。また、fuse は ui/cli のファイル転送よりも 7~8 倍遅くなる可能性があることに注意してください。
コマンドラインインターフェイスでデバイスと対話したい場合は、以下のコマンドを実行してください:
$ aft-mtp-cli
help と入力すると、利用可能な全コマンドが一覧表示されます。exit と入力すると終了します。
グラフィカルユーザインターフェイスでデバイスと対話したい場合は、android-file-transfer アプリケーションを起動し、マウント先フォルダを選択して、ツールバーの任意のボタンを押してください。利用可能なオプションは、Upload Album、Upload Directory、Upload Files です。最後の2つは自明です。Upload album は、ソースディレクトリからアルバムカバーを検索し、利用可能な最も良いカバーを設定します。
MTPfs
MTPfs — libmtp ベース。任意の MTP デバイスに対して読み書きをサポートする FUSE ファイルシステムです
まず、/etc/fuse.conf
を編集して、以下の行をアンコメントしてください:
user_allow_other
~/mnt
にデバイスをマウントします:
$ mtpfs -o allow_other ~/mnt
jmtpfs
jmtpfs — libmtp ベース。MTP (Media Transfer Protocol) デバイスにアクセスします。
~/mnt
にデバイスをマウントします:
$ jmtpfs ~/mnt
2つのステップを行うことにより、Linux の残りの部分と一致させます (通常の mount/umount コマンドを使用する):
$# ln -s <実際の mount コマンドのパス/名前> <Linux の mount 規則と一致する名前> $ ln -s /sbin/jmtpfs /sbin/mount.jmtpfs
以下の行を /etc/fstab
に追加してください:
#jmtpfs <mount path> fuse nodev,allow_other,<other options> 0 0 jmtpfs /home/sam/run/motog fuse nodev,allow_other,rw,user,noauto,noatime,uid=1000,gid=1000 0 0
そして、デバイスをマウントし、オプションが渡されていることを確認してください:
$ mount /home/sam/run/motog Device 0 (VID=22b8 and PID=2e82) is a Motorola Moto G (ID2). Android device detected, assigning default bug flags $ mount ... jmtpfs on /home/sam/run/motog type fuse.jmtpfs (rw,nosuid,nodev,noexec,noatime,user_id=1000,group_id=1000,allow_other,user=sam)
SIMPLE-MTPFS
SIMPLE-MTPFS — libmtp ベース。Simple Media Transfer Protocol FileSystem は、USB でローカルマシンに接続された MTP デバイス上のファイルを操作できるファイルシステムです
検出されたデバイスを一覧表示するには simple-mtpfs -l
を実行してください。
リストの最初のデバイスを ~/mnt
にマウントするには、simple-mtpfs --device 1 ~/mnt
を実行してください。
go-mtpfs
go-mtpfs — カスタムの MTP 実装を持つ、Go で書かれた FUSE ファイルシステム
android-udev をインストールしてください。これは、/etc/udev/rules.d/51-android.rules
を編集して、(mtp-detect を実行後に見られる) idVendor
と idProduct
に適用できるようにします。行の最後にはあなたのユーザ OWNER="<user>"
を追加してください。
~/mnt
上にデバイスをマウントします:
$ go-mtpfs ~/mnt
libmtp
libmtp はライブラリ MTP 実装です。いくつかのコマンドラインツールの例も付属しています (pacman -Ql libmtp
でリストアップできます)。
デバイスを検出するには mtp-detect
を実行してください。
エラーが返ってくる場合、あなたのユーザが adbusers
ユーザグループに属していることを確認してください。
mtp-connect
コマンドでファイルを転送できます。
フロントエンド
gMTP — libmtp のためのグラフィカルフロントエンド。デスクトップに依存しない GUI で Android デバイスに接続し、ファイルを管理できます。
メディアプレイヤー
Amarok などの音楽プレイヤーで MTP デバイスを使うこともできます。これには /etc/udev/rules.d/51-android.rules
を編集する必要があります (以下では MTP デバイスの例として Galaxy Nexus を使っています):
次を実行してください:
$ lsusb
あなたのデバイスを探してください。以下のように出力されるはずです:
Bus 003 Device 011: ID 04e8:6860 Samsung Electronics Co., Ltd GT-I9100 Phone [Galaxy S II], GT-P7500 [Galaxy Tab 10.1]
/etc/udev/rules.d/51-android.rules
へのエントリは以下のようになります:
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0666", OWNER="[username]"
udev ルールをリロードしてください:
# udevadm control --reload
ファイルマネージャ統合
MTP で接続された Android デバイスのストレージのコンテンツをファイルマネージャで閲覧するには、対応するプラグインをインストールしてください:
- GVFS (GNOME Files) を使用するファイルマネージャの場合は、MTP 用の gvfs-mtp か PTP サポート用の gvfs-gphoto2 をインストールしてください。
- KIO (KDE の Dolphin) を使用するファイルマネージャの場合は、kio-extras (dolphin の依存パッケージ) に MTP サポートが含まれています。
必要なパッケージをインストールしたら、デバイスがファイルマネージャに自動的に表示され、URL (例: mtp://[usb:002,013]/
) からアクセスできるはずです。
gvfs-mtp
The gvfs-mtp is available in the official repositories.
With lsusb
you can get information about your device where Bus and Device numbers can be used with gvfs-mtp
and device ID for creating of an udev rule.
Bus 002 Device 018: ID 04b7:88a9 Compal Electronics, Inc.
To see detected device with enabled MTP
Use gio mount:
gio mount -li | grep -e ^Volume -e activation_root
Volume(0): MT65xx Android Phone activation_root=mtp://[usb:002,018]/
Use lsusb:
lsusb -v 2> /dev/null | grep -e Bus -e iInterface -e bInterfaceProtocol
... Bus 002 Device 018: ID 04b7:88a9 Compal Electronics, Inc. bInterfaceProtocol 0 iInterface 5 MTP ...
To mount all available connected MTP devices use inline script
gio mount -li | awk -F= '{if(index($2,"mtp") == 1)system("gio mount "$2)}'
To mount or dismount from a command with gvfs-mtp use Bus and Device numbers, e.g. to mount gio mount mtp://[usb:001,007]/
and to unmount gio mount -u mtp://[usb:001,007]/
. The mounted device will be available in a directory that begins with mtp:host= and is located under /run/user/$UID/gvfs/.
To disable automount of MTP devices with gvfs you will need to change value true to false for variable AutoMount that is located in /usr/share/gvfs/mounts/mtp.mount
.
If your device is not showing up in the file manager then #libmtp is missing a native support and is not currently available in the list of the supported devices. If you will try to mount by using command line you may also get an error
Device 0 (VID=XXXX and PID=XXXX) is UNKNOWN. Please report this VID/PID and the device model to the libmtp development team
The workaround to make it shown in the file manager is to write an udev rule for the device but it is no guaranty that you will be able to mount it with by using MTP connection.
Use ID number that represents by pattern vendorId:productID,e.g. 04b7:88a9, and make an udev rule by creating a configuration file
/etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", ATTR{idVendor}=="04b7", ATTR{idProduct}=="88a9", MODE="0660", GROUP="uucp", ENV{ID_MTP_DEVICE}="1", SYMLINK+="libmtp"
Reload the udev rules.
# udevadm control --reload
The file managers with support for gvfs will be able to show MTP devices and mount them if supported by #libmtp but if has no support and cannot be opened then change settings in the phone to PTP and install gvfs-gphoto2 for having access at least to the photos, command line mounting of PTP is a little similar to mounting of the MTP devices: gio mount gphoto2://[usb:002,019]/
.
トラブルシューティング
libmtp
未知のデバイス
以下のようなメッセージが表示される場合:
Device 0 (VID=XXXX and PID=XXXX) is UNKNOWN. Please report this VID/PID and the device model to the libmtp development team
デバイスが次のリストに含まれているか確認する必要があります: Supported devices list。リストに入っていない場合は、開発チームに報告してください。リストに含まれている場合は、libmtp が少しだけ旧式になっている可能性があります。libmtp によって適切に使用されるように、デバイスを次のファイルに追加することが可能です:
/usr/lib/udev/rules.d/69-libmtp.rules
Unable to enumerate USB device
システムログ (journalctl
) に以下のようなメッセージが表示される場合:
usb usb4-port2: unable to enumerate USB device
以下のコマンドを実行してみてください [1]:
# modprobe -vr uhci_hcd # modprobe -va ohci_hcd # modprobe -va uhci_hcd
上記のコマンドで直る場合、以下の内容で /etc/modprobe.d/usb_hci_order.conf
を作成してください:
# create a dependency on ohci for uhci, which fixes problems # with external usb devices not showing up # softdep uhci_hcd pre: ohci_hcd
gvfs-mtp
gvfs-mtp パッケージをインストールしても、デバイスがファイルマネージャに表示されない場合、デバイスが自動マウントされるように udev ルールを書く必要があるかもしれません。
デバイスを接続して、vendor-id と product-id をそれぞれ取得してください:
$ lsusb Bus 001 Device 007: ID 0421:0661 Nokia Mobile Phones Lumia 920 (...)
ID の文字の後の2つの数字が vendorID : productID です。
ID がわかったら udev ルールを作成します。例:
# nano /etc/udev/rules.d/51-android.rules
ルールの中身は以下のようにしてください:
ATTR{idVendor}=="YOUR VENDOR ID HERE", ATTR{idProduct}=="YOUR PRODUCT ID HERE", SYMLINK+="libmtp", MODE="660", ENV{ID_MTP_DEVICE}="1"
udev ルールをリロードします:
# udevadm control --reload
そしてシステムを再起動してください。これで (Thunar などの) ファイルマネージャは MTP デバイスを自動でマウントできるようになったはずです [2]。
jmtpfs
jmtpfs でマウントは成功するがデバイス上のファイルにアクセスしようとすると以下のエラーが表示される場合:
cannot access <mount-point>: Input/output error
上記のエラーはセキュリティ機能が原因です。スマートフォンがロック画面でロックされているときに MTP は使用できません。ロックを解除してもういちど試してみてください。
kio-mtp
"ファイルマネージャで開く"が使えない場合は、/usr/share/apps/solid/actions/solid_mtp.desktop
ファイルを編集することで問題を解決できます。
次の行を:
Exec=kioclient exec mtp:udi=%i/
以下のように変更してください:
Exec=dolphin "mtp:/"