媒体传输协议
媒体传输协议 (MTP) 可用于在许多手机(所有 Windows Phone 7/8/10 设备、大多数较新的 Android 设备)和媒体播放器(例如 Creative Zen)之间传输媒体文件。
连接
要通过 MTP 将您的计算机连接到设备
- 设备需要通过 USB 连接到您的计算机
- 需要在设备上启用 MTP
- 设备屏幕需要解锁(出于安全原因)
FUSE 文件系统
以下程序允许您通过 FUSE 文件系统访问 MTP 设备。
对于基于 FUSE 的文件系统,您可能需要首先创建挂载点目录。以下示例中使用目录 ~/mnt
。
FUSE 挂载通常可以使用 fusermount -u mountpoint
来卸载。
Android 文件传输
Android 文件传输 — MTP 客户端,带有 CLI、Qt UI 和 FUSE 包装器,使用自定义 MTP 实现
将您的设备挂载到 ~/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 设备读取和写入
首先编辑您的 /etc/fuse.conf
并取消注释以下行
user_allow_other
将您的设备挂载到 ~/mnt
$ mtpfs -o allow_other ~/mnt
jmtpfs
jmtpfs — 基于 libmtp,用于访问 MTP(媒体传输协议)设备
将设备挂载到 ~/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 设备上的文件的文件系统
运行 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
标志来指定设备(可以通过运行mtp-detect
找到 id) - 如果存在外部 SD 卡,则使用
go-mtpfs
挂载可能会失败。如果您在有 SD 卡的情况下尝试访问您的设备,并且 go-mtpfs 报错,请尝试移除 SD 卡并重新挂载。) - 此软件包自 2020 年以来未维护。
libmtp
libmtp 是一个库 MTP 实现,它还附带了一些示例命令行工具(您可以使用 pacman -Ql libmtp
列出它们)。
运行 mtp-detect
以检测您的设备。
如果返回错误,请确保您的用户在 adbusers
用户组中。
libmtp
旨在用作库,而不是供最终用户使用。除了 mtp-detect
命令之外,其他命令行工具在日常工作中可能容易出现不必要的错误。上游作者将它们称为示例。截至 2025 年 1 月,请参阅 README 文件的第 115-139 行。有关更具体的示例,请参阅旧的但具有示范意义的关于使用 libmtp(通过 USB)从 MTP 设备复制文件的建议。建议使用前端。
前端
gMTP — libmtp 的图形前端。它允许您连接到 Android 设备并使用与桌面无关的 GUI 管理文件。
媒体播放器
您还可以在 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
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]/
。
故障排除
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) 访问不同手机型号的文件。关闭它是至少一位用户的解决方案。