MTP

提供: ArchWiki
2023年3月22日 (水) 16:38時点におけるAshMyzk (トーク | 投稿記録)による版 (TranslationStatus)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

関連記事

メディア転送プロトコル (Media Transfer Protocol, MTP) は、多くの携帯電話 (全 Windows Phone 7/8/10 デバイスやほとんどの新しい Android デバイス) やメディアプレイヤ (例: Creative Zen) との間でメディアファイルの転送を行うために使用できます。

接続

MTP を介してコンピュータをデバイスに接続するには:

  • 対象デバイスがあなたのコンピュータと USB で接続されている必要があります
  • MTP が対象デバイスで有効化されている必要があります
  • デバイスのスクリーンがアンロックされている必要があります (セキュリティ上の理由により)

FUSE ファイルシステム

以下のプログラムは、FUSE ファイルシステムを介して MTP デバイスにアクセスできるようにします。

ノート: MTP は複雑であり、その実装はデバイス間で異なっています。下記のクライアントを試し、どのクライアントがあなたのデバイスで最もうまく機能するか調べてください。
ヒント: MTP 関連のパッケージをインストールした後は、コンピュータを再起動することが推奨されます。

FUSE ベースのファイルシステムを使用する場合、まず先にマウントポイントのディレクトリを作成する必要があるかもしれません。以下の例では ~/mnt ディレクトリが使われています。

通常、FUSE のマウントは fusermount -u マウントポイント を使ってアンマウントできます。

Android File Transfer

Android File Transfer — CLI、Qt UI、カスタムの MTP 実装を使用する FUSE ラッパを搭載している MTP クライアント

https://whoozle.github.io/android-file-transfer-linux/ || android-file-transfer

~/mnt にデバイスをマウントするには:

$ aft-mtp-mount ~/mnt

アルバムアートを表示させたい場合は、albumart.xxx という名前にし、一番最初にマウント先のフォルダに配置しておかなければなりません。その後で、他のファイルをコピーしてください。また、fuse は ui/cli のファイル転送よりも 7~8 倍遅くなる可能性があることに注意してください。

コマンドラインインターフェイスでデバイスと対話したい場合は、以下のコマンドを実行してください:

$ aft-mtp-cli

help と入力すると、利用可能な全コマンドが一覧表示されます。exit と入力すると終了します。

グラフィカルユーザインターフェイスでデバイスと対話したい場合は、android-file-transfer アプリケーションを起動し、マウント先フォルダを選択して、ツールバーの任意のボタンを押してください。利用可能なオプションは、Upload AlbumUpload DirectoryUpload Files です。最後の2つは自明です。Upload album は、ソースディレクトリからアルバムカバーを検索し、利用可能な最も良いカバーを設定します。

MTPfs

MTPfslibmtp ベース。任意の MTP デバイスに対して読み書きをサポートする FUSE ファイルシステムです

https://www.adebenham.com/mtpfs/ || mtpfs
ノート: 以下は機能しない可能性が高く、libgphoto2 や、PCManFM などの gvfs サポートのあるファイルマネージャに頼らなくてはならないかもしれません。

まず、/etc/fuse.conf を編集して、以下の行をアンコメントしてください:

user_allow_other

~/mnt にデバイスをマウントします:

$ mtpfs -o allow_other ~/mnt

jmtpfs

jmtpfslibmtp ベース。MTP (Media Transfer Protocol) デバイスにアクセスします。

https://github.com/JasonFerrara/jmtpfs || jmtpfsAUR

~/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-MTPFSlibmtp ベース。Simple Media Transfer Protocol FileSystem は、USB でローカルマシンに接続された MTP デバイス上のファイルを操作できるファイルシステムです

https://github.com/phatina/simple-mtpfs/ || simple-mtpfsAUR

検出されたデバイスを一覧表示するには simple-mtpfs -l を実行してください。

リストの最初のデバイスを ~/mnt にマウントするには、simple-mtpfs --device 1 ~/mnt を実行してください。

go-mtpfs

go-mtpfs — カスタムの MTP 実装を持つ、Go で書かれた FUSE ファイルシステム

https://github.com/hanwen/go-mtpfs || go-mtpfs-gitAUR

android-udev をインストールしてください。これは、/etc/udev/rules.d/51-android.rules を編集して、(mtp-detect を実行後に見られる) idVendoridProduct に適用できるようにします。行の最後にはあなたのユーザ OWNER="<user>" を追加してください。

~/mnt 上にデバイスをマウントします:

$ go-mtpfs ~/mnt
ノート:
  • 複数のデバイスを使用する際は、-d フラグを使用してデバイスを指定する必要があるかもしれません (mtp-detect を実行することで id を調べられます)。
  • 外部 SD カードがあると、go-mtpfs でのマウントが失敗するかもしれません。SD カードが存在している状態でデバイスへアクセスしようとして go-mtpfs がエラーを吐く場合は、SD カードを取り出して、もう一度マウントしてみてください。

libmtp

libmtp はライブラリ MTP 実装です。いくつかのコマンドラインツールの例も付属しています (pacman -Ql libmtp でリストアップできます)。

libmtp パッケージをインストールしてください。

デバイスを検出するには mtp-detect を実行してください。

エラーが返ってくる場合、あなたのユーザが adbusers ユーザグループに属していることを確認してください。

mtp-connect コマンドでファイルを転送できます。

フロントエンド

gMTP — libmtp のためのグラフィカルフロントエンド。デスクトップに依存しない GUI で Android デバイスに接続し、ファイルを管理できます。

https://gmtp.sourceforge.io/ || gmtp

メディアプレイヤー

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

gvfs-mtp は公式リポジトリで利用可能です。

lsusb を使うことで、あなたのデバイスの情報を取得できます。Bus 番号と Device 番号は、gvfs-mtp で使ったり、udev ルールを作成する際のデバイス ID として使ったりできます。

Bus 002 Device 018: ID 04b7:88a9 Compal Electronics, Inc.

検出された、MTP が有効化されたデバイスを見るには

gio mount を使うか:

gio mount -li | grep -e ^Volume -e activation_root
Volume(0): MT65xx Android Phone
  activation_root=mtp://[usb:002,018]/

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
...

利用可能なすべての接続済み MTP デバイスをマウントするには、インラインスクリプトを使用してください:

gio mount -li | awk -F= '{if(index($2,"mtp") == 1)system("gio mount "$2)}'

gvfs-mtp でコマンドからマウント/ディスマウントするには、Bus 番号と Device 番号を使用してください。例えば、マウントする場合は gio mount mtp://[usb:001,007]/、アンマウントする場合は gio mount -u mtp://[usb:001,007]/ となります。マウント済みデバイスは mtp:host= で始まるディレクトリ内で利用でき、/run/user/$UID/gvfs/ 下に配置されています。

gvfs で MTP デバイスの自動マウントを無効化するには、/usr/share/gvfs/mounts/mtp.mount 内の AutoMount 変数の値を true から false に変更してください。

ノート: (上記の) ファイルマネージャは自動マウントのオプションを独自に持つことができます。起動時に、これらのファイルマネージャは利用可能なマウント可能デバイスをすべてチェックします。

ファイルマネージャにあなたのデバイスが表示されない場合、#libmtp にネイティブサポートが存在せず、サポートされているデバイスのリストに入っていません。コマンドラインを使ってマウントを試みる場合は、エラーが発生する場合もあります:

Device 0 (VID=XXXX and PID=XXXX) is UNKNOWN.
Please report this VID/PID and the device model to the libmtp development team

デバイスをファイルマネージャに表示させるための回避策は、対象デバイス用の udev ルールを記述することです。しかし、MTP 接続を用いてデバイスをマウントできる保証はありません。

vendorId:productID という形式の ID を使用してください (例: 04b7:88a9)。そして、設定ファイルを作成して udev ルールを作成してください:

/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"

udev ルールを再読込してください:

# udevadm control --reload

gvfs をサポートしているファイルマネージャは、MTP デバイスを表示でき、#libmtp によってサポートされていればマウントできます。しかし、サポートがなく、デバイスを開けない場合、携帯電話の設定を PTP に変更し、gvfs-gphoto2 をインストールして、最低限、写真へのアクセスをできるようにしてください。PTP のマウントを行うコマンドラインは MTP デバイスのそれに少し似ています: gio mount gphoto2://[usb:002,019]/

ノート: デバイスへのアクセスが制限され、コマンドラインから標準的なコマンド (例: cpls) を使用できない場合、gvfs 独自の代替コマンドを探してみてください: ls -1 /usr/bin/gvfs-*

トラブルシューティング

libmtp (gvfs-mtp): ファイルマネージャ (nautilus、pcmanfm、vifm など) が Android デバイスの DCIM/Camera にアクセスする際にハングする

症状: DCIM/Camera ディレクトリに入る事以外、うまく機能する。この場合、ファイルマネージャがフリーズし、コマンドラインからそのディレクトリで ls を実行することさえできなくなるs。

可能性の高い原因は libmtp のバグです。

どうやら 20180915_180351(0).jpg のような名前のファイルが原因のようです。例として、Samsung の電話はそのような名前のファイルを作成する傾向にあります。

これに関するチケット (12 など) と質問 (12) が複数存在します。

可能な回避策は、そのようなディレクトリに対しては #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 をより簡単に使えるようにします。

翻訳ステータス: このページは en:Media Transfer Protocol の翻訳バージョンです。最後の翻訳日は 2023-03-22 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。