媒体传输协议

出自 ArchWiki

媒体传输协议 (MTP) 可以用于在许多手机(所有 Windows Phone 7/8/10 设备,大多数较新的 Android 设备)和媒体播放器(例如 Creative Zen)之间传输媒体文件。

连接

要通过 MTP 将您的计算机连接到设备

  • 设备需要通过 USB 连接到您的计算机
  • 需要在设备上启用 MTP
  • 设备屏幕需要解锁(出于安全原因)

FUSE 文件系统

以下程序允许您通过 FUSE 文件系统访问 MTP 设备。

注意: MTP 很混乱,其实现因设备而异。尝试以下客户端,看看哪个最适合您的设备。
提示: 建议在安装 MTP 相关软件包后重启您的计算机。

对于基于 FUSE 的文件系统,您可能需要先创建挂载点目录。以下示例中使用目录 ~/mnt

FUSE 挂载通常可以使用 fusermount -u mountpoint 卸载。

Android 文件传输

Android 文件传输 — MTP 客户端,带有 CLI、Qt UI 和 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 应用程序,选择目标文件夹并单击工具栏上的任何按钮。可用选项有:上传专辑上传目录上传文件。后两个是不言自明的。上传专辑 搜索源目录以查找专辑封面,并设置最佳可用封面。

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 (媒体传输协议) 设备

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

将设备挂载到 ~/mnt

$ jmtpfs ~/mnt

通过执行以下两个步骤,使其与 Linux 的其余部分保持一致(使用常规的 mount/umount 命令)

$# ln -s <actual mount command's path/name>  <a name consistent with Linux's mount convention>
$  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,简单媒体传输协议文件系统,是一个能够对通过 USB 连接到本地计算机的 MTP 设备上的文件进行操作的文件系统

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

运行 simple-mtpfs -l 以列出检测到的设备。

要将列表中的第一个设备挂载到 ~/mnt,请运行 simple-mtpfs --device 1 ~/mnt

go-mtpfs

go-mtpfs — FUSE 文件系统,具有自定义 MTP 实现,用 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 标志来指定设备(可以通过运行 mtp-detect 找到 id)
  • 如果存在外部 SD 卡,则使用 go-mtpfs 挂载可能会失败。如果您在有 SD 卡的情况下尝试访问您的设备,并且 go-mtpfs 抱怨,请尝试移除 SD 卡并再次挂载。)
  • 此软件包自 2020 年以来未维护。

libmtp

libmtp 是一个库 MTP 实现,它还附带了一些示例命令行工具(您可以使用 pacman -Ql libmtp 列出它们)。

安装 libmtp 软件包。

运行 mtp-detect 以检测您的设备。

如果返回错误,请确保您的用户在 adbusers 用户组 中。

libmtp 旨在用作库,而不是由最终用户使用。除了 mtp-detect 命令之外,其他命令行工具可能不必要地容易出错,不适合日常工作。上游作者将它们称为示例。截至 2025 年 1 月,请参阅 README 文件的第 115-139 行。有关更具体的示例,请参阅旧的但具有演示性的 使用 libmtp (通过 USB) 从 MTP 设备复制文件 的建议。建议使用前端。

前端

gMTP — libmtp 的图形前端。它允许您连接到 Android 设备并使用桌面无关的 GUI 管理文件。

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 文件) 的文件管理器,请安装 gvfs-mtp 以获得 MTP 支持,或安装 gvfs-gphoto2 以获得 PTP 支持。
  • 对于使用 KIO (KDE 的 Dolphin) 的文件管理器,MTP 支持包含在 kio-extras 中(dolphin 的依赖项)。

安装所需的软件包后,设备应自动显示在文件管理器中,并通过 URL 访问,例如 mtp://[usb:002,013]/

gvfs-mtp

本文或章节可能需要与 udev 合并。

注意: 请使用模板的第二个参数来提供更详细的指示。 (在 Talk:Media_Transfer_Protocol 中讨论)

gvfs-mtp 在官方仓库中可用。

使用 lsusb,您可以获取有关您设备的信息,其中 Bus 和 Device 编号可以与 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 编号,例如,要挂载 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]/

注意: 如果您获得对设备的有限访问权限并且无法使用命令行中的标准命令(例如 cp,ls),请查找 gvfs 自己的替代方案,ls -1 /usr/bin/gvfs-*

故障排除

libmtp (gvfs-mtp): 文件管理器 (nautilus, pcmanfm, vifm 等) 在访问 Android 设备的 DCIM/Camera 时挂起

症状:一切正常,直到进入 DCIM/Camera 目录。在这种情况下,文件管理器冻结,即使在命令行中,您也无法在该目录上运行 ls

可能且非常可能的原因是 libmtp 的错误。

似乎是由名称类似于 20180915_180351(0).jpg 的文件引起的。例如,三星手机喜欢创建具有此类名称的文件。

有几个工单 (一个, 两个 等) 和问题 (一个, 两个) 关于它。

因此,可能的解决方法是使用来自 #FUSE 文件系统 的不同 mtp 选项,例如 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 的冲突服务(包括音乐播放器),正如在 此论坛 中提到的那样。

例如,Amarok 的 MTP 服务插件可能会阻止 Dolphin (plasma) 访问不同手机型号的文件。关闭它是至少一位用户的解决方案。