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 (gvfs-mtp): ファイルマネージャ (nautilus、pcmanfm、vifm など) が Android デバイスの DCIM/Camera にアクセスする際にハングする
症状: DCIM/Camera ディレクトリに入る事以外、うまく機能する。この場合、ファイルマネージャがフリーズし、コマンドラインからそのディレクトリで ls
を実行することさえできなくなるs。
可能性の高い原因は libmtp のバグです。
どうやら 20180915_180351(0).jpg
のような名前のファイルが原因のようです。例として、Samsung の電話はそのような名前のファイルを作成する傾向にあります。
これに関するチケット (1、2 など) と質問 (1、2) が複数存在します。
可能な回避策は、そのようなディレクトリに対しては #FUSE ファイルシステム にある go-mtpfs などの異なるオプションを使うか、あるいは、どうにかして携帯カメラのファイル命名ポリシーを変更する (または、Open Camera などの他のカメラアプリに変える) ことです。
jmtpfs: 初回アクセス時に入出力エラー
症状: jmtpfs はマウントに成功するが、デバイス上のファイルに (ls
などで) アクセスすると、エラーが報告される:
cannot access <mount-point>: Input/output error
これはセキュリティ機能のようです: 携帯電話がロックスクリーンによってロックされているとき、MTP は機能しません。電話をアンロックすれば、ケーブルで繋がっている限り再び機能するはずです。
kio-mtp: 「ファイルマネージャで開く」アクションを使用できない
「ファイルマネージャで開く」アクションを使うことができない場合、/usr/share/solid/actions/solid_mtp.desktop
ファイルを編集することでこの問題を回避できます。
Exec=kioclient exec mtp:udi=%i/
の行を Exec=dolphin "mtp:/"
に変更してください。
kio-mtp が異なるサービスから同時に呼び出される
このフォーラムで言及されている通り、mtpfs と kio-mtp (及び、音楽プレイヤを含む、kio-mtp を使用する、衝突するサービス) を並列に使用するのは避けるべきです。
例えば、MTP サービス用の Amarok のプラグインは、Dolphin (plasma) が異なるモデルの電話のファイルにアクセスできなくするかもしれません。そのプラグインをオフにすることで、少なくとも1つのユーザに対してはこれを解決できます。
Android File Transfer: connect failed: no MTP device found
android-file-transfer をインストールした後に MTP デバイスをマウントしようとすると以下のエラーが発生する場合:
$ aft-mtp-mount /path/to/folder
connect failed: no MTP device found
android-udev をインストールしてください。このパッケージには製造業者/デバイス毎に対して MTP デバイスの udev ルールが含まれていて、ADB や MTP をより簡単に使えるようにします。