媒体传输协议

来自 ArchWiki
(重定向自 Mtp

媒体传输协议 (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 — 具有自定义 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 标志来指定设备(可以通过运行 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 Files) 的文件管理器,请安装 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,您可以获取有关您设备的信息,其中总线和设备编号可用于 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 的命令挂载或卸载,请使用总线和设备编号,例如,要挂载 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 连接来挂载它。

使用 ID 号,该 ID 号以 vendorId:productID 模式表示,例如 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

可能且非常可能的原因是 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) 访问不同手机型号的文件。关闭它是至少一位用户的解决方案。