媒體傳輸協議(Media Transfer Protocol MTP)可用於在行動裝置(所有的 Windows Phone 7/8/10 設備,大部分新的 Android 設備)以及媒體播放器(如 Creative Zen)之間傳輸媒體文件。
連接
要通過 MTP 將計算機連接至一台設備:
- 該設備需要通過 USB 連接至計算機
- 需要啟用設備上的 MTP
- 設備需要解鎖屏幕(安全原因)
FUSE 文件系統
下列程序允許通過 FUSE 文件系統訪問 MTP 設備。
對基於 FUSE 的文件系統,可能需要先創建掛載點目錄。以下示例中使用了 ~/mnt
目錄。
掛載的 FUSE 一般可用 fusermount -u mountpoint
卸載。
Android File Transfer
Android File Transfer — 帶有 CLI、Qt 界面 和 FUSE 封裝器的 MTP 客戶端,使用自定義 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(上傳文件)。後兩項不必解釋。Upload album 選項將在源目錄內搜索並設置一個最佳的專輯封面。
MTPfs
MTPfs — 一個基於 libmtp 的 FUSE 文件系統,支持讀寫任意 MTP 設備。
首先編輯 /etc/fuse.conf
,取消該行的注釋:
user_allow_other
然後將設備掛載至 ~/mnt
:
$ mtpfs -o allow_other ~/mnt
jmtpfs
jmtpfs — 基於 libmtp,用於訪問 MTP(Media Transfer Protocol)設備。
將設備掛載至 ~/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 設備上的文件進行操作。
運行 simple-mtpfs -l
以列出探測到的設備。
要將列表中的第一個設備掛載至 ~/mnt
,請運行 simple-mtpfs --device 1 ~/mnt
。
go-mtpfs
go-mtpfs — 使用自定義 MTP 實現的 FUSE 文件系統,用 Go 語言編寫。
安裝 android-udev包,之後可編輯 /etc/udev/rules.d/51-android.rules
並應用至 idVendor
和 idProduct
,運行 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
列出)。
運行 mtp-detect
以探測設備。
若返回錯誤,請確認當前用戶在 adbusers
用戶組內。
可使用 mtp-connect
命令傳輸文件。
前端
gMTP — libmtp 的一個圖形前端。允許用戶連接安卓設備,並使用與桌面無關的圖形用戶界面管理文件。
媒體播放器
要在音樂播放器(如 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 的文件管理器能夠顯示並掛載 MTP 設備。若不受支持且無法打開,請在手機上更改至 PTP 並安裝 gvfs-gphoto2包 以獲取(至少)對照片的訪問,通過命令行掛載 PTP 與掛載 MTP 設備類似:gio mount gphoto2://[usb:002,019]/
。
故障排除
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)訪問不同型號手機的文件。對於至少一位用戶,解決方案是將其關閉。