出自 Arch Linux 中文维基

媒體傳輸協議(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 mountpoint 卸載。

Android File Transfer

Android File Transfer — 帶有 CLI、Qt 界面 和 FUSE 封裝器的 MTP 客戶端,使用自定義 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 Album(上傳專輯)、Upload Directory(上傳文件夾)和 Upload Files(上傳文件)。後兩項不必解釋。Upload album 選項將在源目錄內搜索並設置一個最佳的專輯封面。

MTPfs

MTPfs — 一個基於 libmtp 的 FUSE 文件系統,支持讀寫任意 MTP 設備。

https://www.adebenham.com/mtpfs/ || mtpfs
注意: 以下操作可能無效,需要恢復至 libgphoto2 或使用支持 gvfs 的文件管理器,例如 PCManFM

首先編輯 /etc/fuse.conf,取消該行的注釋:

user_allow_other

然後將設備掛載至 ~/mnt

$ mtpfs -o allow_other ~/mnt

jmtpfs

jmtpfs — 基於 libmtp,用於訪問 MTP(Media Transfer Protocol)設備。

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

將設備掛載至 ~/mnt

$ jmtpfs ~/mnt

通過以下兩個步驟,使其與 Linux 的其他部分保持一致(使用通常的 mount 與 umount 命令):

$# ln -s <“实际的挂载命令路径”>                 <“与 Linux 挂载约定一致的名称“>
$  ln -s /sbin/jmtpfs                        /sbin/mount.jmtpfs

將此行(非 # 注釋的那一行)添加至 /etc/fstab

 #jmtpfs <“挂载路径”>         fuse nodev,allow_other,<“其他选项”>                                 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 — 簡易媒體傳輸協議文件系統(Simple Media Transfer Protocol FileSystem),基於 libmtp,能夠對通過 USB 連接至本地機器的 MTP 設備上的文件進行操作。

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

運行 simple-mtpfs -l 以列出探測到的設備。

要將列表中的第一個設備掛載至 ~/mnt,請運行 simple-mtpfs --device 1 ~/mnt

go-mtpfs

go-mtpfs — 使用自定義 MTP 實現的 FUSE 文件系統,用 Go 語言編寫。

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

安裝 android-udev,之後可編輯 /etc/udev/rules.d/51-android.rules 並應用至 idVendoridProduct,運行 mtp-detect 後可觀察到上述行為。在行尾添加當前用戶 OWNER="user"

將設備掛載至 ~/mnt

$ go-mtpfs ~/mnt
注意:
  • 有多個設備時,可使用 -d 標誌指定某個設備(id 可通過運行 mtp-detect 獲取)。
  • 使用 go-mtpfs 掛載時,若存在外置 SD 卡,掛載可能會失敗。若在有 SD 卡的情況下嘗試訪問設備時遇 go-mtpfs 報錯,請移除 SD 卡並重新掛載。
  • 該軟體包自 2020 年以來未曾維護。

libmtp

libmtp 是一個 MTP 實現庫,還附帶了一些命令行工具示例(可使用 pacman -Ql libmtp 列出)。

安裝 libmtp 軟體包。

運行 mtp-detect 以探測設備。

若返回錯誤,請確認當前用戶在 adbusers 用戶組內。

可使用 mtp-connect 命令傳輸文件。

前端

gMTP — libmtp 的一個圖形前端。允許用戶連接安卓設備,並使用與桌面無關的圖形用戶界面管理文件。

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 查看安卓設備的存儲內容,請安裝對應的插件:

  • 對於使用 GVFS 的文件管理器(GNOME Files),安裝 gvfs-mtp 以支持 MTP 或安裝 gvfs-gphoto2 以支持 PTP。
  • 對於使用 KIO 的文件管理器(KDE 的 Dolphin),kio-extras(dolphin 的依賴項)已包含 MTP 支持。

安裝好所需的軟體包後,設備應自動顯示在文件管理器內,並且可通過 URL 訪問,如 mtp://[usb:002,013]/

gvfs-mtp

gvfs-mtp 軟體包可從官方倉庫獲取。

可通過 lsusb 獲得設備信息,包括 Bus 編號、設備編號(Device numbers)和設備 ID,前兩項信息可用於 gvfs-mtp,設備 ID 可用於創建 udev 規則。

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 numbers),例如,使用 gio mount mtp://[usb:001,007]/ 掛載,使用 gio mount -u mtp://[usb:001,007]/ 卸載。已掛載設備可通過 mtp:host= 開頭的目錄訪問,且位於 /run/user/$UID/gvfs/ 目錄下。

使用 gvfs 時,若希望禁用自動掛載 MTP 設備的功能,需更改 AutoMount 變量的值,將其從 true 更改為 false,該變量位於 /usr/share/gvfs/mounts/mtp.mount

注意: 文件管理器自身可能有關於自動掛載的選項。它們在啟動時將檢查所有可掛載的設備。

若設備沒有出現在文件管理器中,則可能缺少 #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 連接將其成功掛載。

創建一個 udev 規則配置文件並使用 vendorId:productID 模式的 ID 編號:

/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

若受 #libmtp 支持,支持 gvfs英語gvfs 的文件管理器能夠顯示並掛載 MTP 設備。若不受支持且無法打開,請在手機上更改至 PTP 並安裝 gvfs-gphoto2 以獲取(至少)對照片的訪問,通過命令行掛載 PTP 與掛載 MTP 設備類似:gio mount gphoto2://[usb:002,019]/

注意: 若訪問設備受限,且無法通過命令行使用標準命令,例如 cpls,請查找 gvfs英語gvfs 的自身替代品:ls -1 /usr/bin/gvfs-*

故障排除

libmtp(gvfs-mtp):使用文件管理器(nautilus、pcmanfm、vifm 等)訪問安卓設備上的相機相冊時掛起

症狀:一切正常,直到進入相機相冊目錄。此時文件管理器凍結,甚至在命令行下也無法 ls 該目錄。

這極有可能是 libmtp 的問題。

該症狀可能由類似 20180915_180351(0).jpg 的文件名引起。例如,三星手機傾向於創建此類名稱的文件。

參見相關問題報告([1][2])和問答([3][4])。

該問題可能的解決方法是使用與 #FUSE 文件系統不同的 mtp 選項(例如 go-mtpfs)或更改手機相機的文件命名策略(或切換至其他相機應用,如 Open Camera)。

jmtpfs:首次訪問設備時出現輸入輸出錯誤

症狀:jmtpfs 成功掛載,但當嘗試訪問設備上的文件時(例如,通過 ls 訪問),會產生以下報錯:

 cannot access <mount-point>: Input/output error

這可能是一個安全特性:手機屏幕鎖定時,MTP 不能正常運作。解鎖手機後,只要保持連接,MTP 應正常生效。

kio-mtp: 無法使用「用文件管理器打開」操作

若無法使用「用文件管理器打開(Open with File Manager)」,可能需要編輯文件 /usr/share/solid/actions/solid_mtp.desktop 以解決此問題。

Exec=kioclient exec mtp:udi=%i/ 這一行更改為 Exec=dolphin "mtp:/"

kio-mtp 被不同的服務同時調用

根據此帖內容,應避免同時使用 mtpfs 和 kio-mtp,或是使用與 kio-mtp 衝突的服務(包括音樂播放服務)。

例如,Amarok 的 MTP 服務插件,可能會阻止 Dolphin(plasma)訪問不同型號手機的文件。對於至少一位用戶,解決方案是將其關閉。