やまものブログ

メモ書きブログです (^_^;A

MTPデバイス (Androidスマホ等) -6PTP_ERROR_IO: failed to open session

Androidスマホに保存したファイルを Ubuntuのボリュームにバックアップしたい。
今まで、ファイル(Nautilus)のGUIにて手作業でコピーしていました。
これは頻度が多くなると面倒になってきます
そこで、シェルスクリプトにしたくなりました。

そこで、問題になるのがマウントポイントです。
AndroidスマホMTP接続して、適当なファイルのプロパティを確認すると、
場所: mtp://[usb:001,014]/%....
みたいな通常のファイルパスではない接続をされているようです

嘘だったらゴメンナサイですが、これは、
    gvfs-mtp-volume-monitor
が提供してくれている接続方法みたいです。

ちょっと調べると、MTPでのマウントはこんな方法でできるようです。
$ mkdir ~/mtp
$ jmtpfs ~/mtp
  ※ ~/mtp は任意のパスでよい

しかし、やってみるとエラーになりました。
ignoring libusb_claim_interface() = -6PTP_ERROR_IO: failed to open session, trying again after resetting USB interface
LIBMTP libusb: Attempt to reset device

これは他に MTPを使っているプロセスがいるのが原因らしい。
https://sourceforge.net/p/libmtp/discussion/535191/thread/8d49ff71/

そのプロセスが上記の gvfs-mtp-volume-monitor のようです。
対策は ps で 'gvfs.*mtp' を調べて、kill するとよいとのこと。
ちょっと工夫して、下記のようにして kill してみました。
$ ps auxw | grep -e 'gvfs.*mtp' | grep -v grep | awk '{cmd="kill "$2; system(cmd)}'

エラーを回避して、無事にマウントできました
これで、例えば、下記のようなかんじでファイルにアクセスできました。
$ cp ~/mtp/内部共有ストレージ/<任意のファイル>