如何防止“无法打开 MTP 设备”弹出窗口打开?

Mic*_*yan 13 linux gnome automount ubuntu nemo

我经常将我的 Android 设备插入 USB 驱动器只是为了充电目的而无意使用文件系统(并且屏幕关闭或 USB 设置处于“仅充电”模式,这两种情况都会阻止手机允许数据连接被制造)。但是,当我这样做时,我经常会看到大量烦人的弹出窗口,看起来像下图所示的弹出窗口:

在此处输入图片说明

理想情况下,有一些方法可以将窗口管理器配置为首先不显示这些弹出窗口(不禁用自动挂载,以便我仍然可以 - 偶尔 - 将设备用作文件系统而无需手动挂载,即当手机的 USB 设置处于“MTP”模式且屏幕解锁时)。否则,如果有一个简单的命令可以用来杀死此弹出窗口的所有实例(而不同时杀死窗口管理器的其余部分),那将是理想的。否则,禁用此特定设备的自动挂载(不禁用所有自动挂载)的解决方案将是可接受的解决方案。

关于如何首先防止此弹出窗口发生或在单个命令中杀死多个弹出窗口实例的任何建议?

有关更多上下文,我使用的是 Ubuntu 14.04 LTS;我不确定这个错误是 Gnome 还是 Nemo 造成的(我知道我的“Home”目录快捷方式图标调用了“nemo”,但我很确定系统上也有基于 Gnome 的应用程序,有一个~/.gnome~/.gnome2目录等,所以它可能是 Gnome)。

Del*_*tik 12

所以你有这个:

无法安装像素

文件管理器正在显示那些错误消息,它们来自GVfs,它正在中继来自libmtp 的信息。

防止文件管理器错误弹出窗口

不幸的是,我还没有找到一种方法来抑制 GNOME/MATE/Cinnamon 文件管理器中的错误弹出窗口。也许有一天,我会查看源代码,看看哪里可以关闭或拦截错误。

由于我对此没有答案,让我们继续讨论您的下一个最佳可接受选项,即……

通过命令关闭文件管理器弹出窗口

这是一个可用于清除 GNOME、MATE 和 Cinnamon 上的弹出窗口的脚本:

#!/bin/bash

function list_empty_windows() {
  wmctrl -lp | awk "{if(\$5==\"\"){print\$3,\$1}}"
}

function list_wm_pids() {
  ps aux | grep cinnamon | perl -pe 's/.*\+\s+(\d+)\s+.*/\1/'
  pidof nautilus | tr ' ' '\n'
  pidof caja | tr ' ' '\n'
  pidof nemo | tr ' ' '\n'
}

function list_popup_windows() {
  local empty_window_file=$(mktemp)
  local window_manager_pid_file=$(mktemp)
  list_empty_windows > "$empty_window_file"
  list_wm_pids | sort > "$window_manager_pid_file"
  join "$empty_window_file" "$window_manager_pid_file"
}

function main() {
  list_popup_windows | cut -d ' ' -f 2 | xargs -n1 -P100 wmctrl -ic
}

main
Run Code Online (Sandbox Code Playgroud)

如果您想记住一个简单的命令,这些命令将关闭文件管理器中的所有窗口,并使桌面重新启动文件管理器:

  • 侏儒: killall nautilus
  • 伴侣: killall caja
  • 肉桂: killall nemo

禁用自动挂载 Google Pixel

似乎没有办法记住只忽略 Google Pixel。

我不推荐这个,我自己也没有测试过,但要挑出 Google Pixel,你可能需要在 udev 中注释掉 vendor 18d1 product 4ee1 (Google Pixel) 和 vendor 18d1 product 4ee2 (Google Pixel debug)规则和 hwdb。

您可以使用以下命令查找记录:

grep -ri '18d1.*4ee[12]' /lib/udev
Run Code Online (Sandbox Code Playgroud)

注释掉 Google Pixel 的 udev 记录后,您可能需要重新启动桌面环境、重新启动和/或运行以下命令的某些组合:

sudo udevadm hwdb --update
sudo udevadm control --reload-rules
sudo udevadm trigger
Run Code Online (Sandbox Code Playgroud)

同样,这是未经测试的,我不建议这样做,特别是因为为了再次安装 Google Pixel,您必须撤消手动 udev 更改。


解释

根据/var/log/syslog,GNOME 之所以出现错误,是因为 USB 设备在第二次尝试初始化时消失了:

Jan 24 01:32:41 node51 kernel: [613604.065259] usb 3-2: new SuperSpeed USB device number 96 using xhci_hcd
Jan 24 01:32:41 node51 kernel: [613604.082734] usb 3-2: New USB device found, idVendor=18d1, idProduct=4ee1
Jan 24 01:32:41 node51 kernel: [613604.082739] usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Jan 24 01:32:41 node51 kernel: [613604.082741] usb 3-2: Product: Pixel
Jan 24 01:32:41 node51 kernel: [613604.082743] usb 3-2: Manufacturer: Google
Jan 24 01:32:41 node51 kernel: [613604.082745] usb 3-2: SerialNumber: XXXXXXXXXXXX
Jan 24 01:32:41 node51 kernel: [613604.083855] usb 3-2: Enable of device-initiated U1 failed.
Jan 24 01:32:41 node51 kernel: [613604.084154] usb 3-2: Enable of device-initiated U2 failed.
Jan 24 01:32:42 node51 org.gtk.vfs.Daemon[4988]: Device 0 (VID=18d1 and PID=4ee1) is a Google Inc (for LG Electronics/Samsung) Nexus 4/5/7/10 (MTP).
Jan 24 01:32:43 node51 org.gtk.vfs.GPhoto2VolumeMonitor[4988]: (process:5256): GVFS-GPhoto2-WARNING **: device (null) has no BUSNUM property, ignoring
Jan 24 01:33:34 node51 org.gtk.vfs.Daemon[4988]: PTP_ERROR_IO: failed to open session, trying again after resetting USB interface
Jan 24 01:33:34 node51 org.gtk.vfs.Daemon[4988]: LIBMTP libusb: Attempt to reset device
Jan 24 01:33:34 node51 org.gtk.vfs.Daemon[4988]: inep: usb_get_endpoint_status(): No such device
Jan 24 01:33:34 node51 org.gtk.vfs.Daemon[4988]: outep: usb_get_endpoint_status(): No such device
Jan 24 01:33:34 node51 org.gtk.vfs.Daemon[4988]: libusb_open() failed!: No such device
Jan 24 01:33:34 node51 org.gtk.vfs.Daemon[4988]: LIBMTP PANIC: Could not init USB on second attempt
Jan 24 01:33:34 node51 org.gtk.vfs.Daemon[4988]: ** (gvfsd:5151): WARNING **: dbus_mount_reply: Error from org.gtk.vfs.Mountable.mount(): Unable to open MTP device '[usb:003,096]'
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,GVfs 通过 libmtp 将 USB 总线 003 设备 096 识别为 Google Pixel 设备,但 Google Pixel 设备已经断开连接。下次 Google Pixel 重新连接时,Linux 将分配一个新的设备 ID。

libmtp 出错,因为它仍在尝试使用消失的设备。GVfs 接收错误并将其转发到 GNOME Files 或其他一些基于 GNOME 的文件管理器。

谁有错?

根据我的发现,这些还有改进的余地:

libmtp

libmtp 可能是导致此问题的最主要原因。

当 MTP 设备连接并突然断开连接时,它应该改进错误处理。仅当设备仍然存在时才应传递错误。如果 USB 设备不存在,尝试重置它是没有意义的。

向 libmtp 报告问题

安卓

Android 可以改进其 MTP 实现,以便在连接到计算机时不会立即断开连接。

向 Android 报告问题

鹦鹉螺 / Caja / Nemo

如果这些软件提供了抑制错误消息或以不那么弹出的方式显示它们的偏好,那就太好了。

向 GNOME
报告问题 向 MATE Caja
报告问题 向 Linux Mint Nemo 报告问题


小智 6

我在Nemo上有一个解决方法:

转到“编辑”>“首选项”>“行为”,然后在“媒体处理”上取消选中“插入和启动时自动安装可移动媒体”。

完成手机充电后,您可以重新启用该选项以恢复默认行为。

  • 谢谢你。使用 caja (Ubuntu MATE),您可以执行以下操作:编辑 -> 首选项 -> 媒体 -> 取消选中“插入时浏览媒体” (2认同)