我经常将我的 Android 设备插入 USB 驱动器只是为了充电,而无意使用文件系统(并且屏幕关闭或 USB 设置处于“仅充电”模式,这两种情况都会阻止手机允许建立数据连接)。但是,当我这样做时,我经常会收到大量烦人的弹出窗口,看起来像下图所示的弹出窗口:
理想情况下,应该有某种方法可以配置窗口管理器,使其首先不显示这些弹出窗口(无需禁用自动挂载,这样我仍然可以偶尔将设备用作文件系统,而无需手动挂载,即当手机的 USB 设置处于“MTP”模式且屏幕解锁时)。除此之外,如果有一个简单的命令可以用来关闭此弹出窗口的所有实例(而不必同时关闭窗口管理器的其余部分),那就太理想了。除此之外,禁用此特定设备的自动挂载(而不禁用所有自动挂载)的解决方案将是一个可接受的解决方案。
关于如何首先防止此弹出窗口的发生或者在单个命令中终止弹出窗口的多个实例,有什么建议吗?
为了获得更多背景信息,我使用的是 Ubuntu 14.04 LTS;我不确定 Gnome 还是 Nemo 导致了这个错误(我知道我的“Home”目录快捷方式图标调用了“nemo”,但我很确定系统上也有基于 Gnome 的应用程序,有一个~/.gnome
和~/.gnome2
目录等,所以可能是 Gnome)。
答案1
因此你有这个:
文件管理器显示这些错误消息,它们来自生长因子,它正在传递来自库。
防止文件管理器错误弹出
不幸的是,我还没有找到一种方法来抑制 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
如果您想要一个容易记住的命令,这些命令将关闭文件管理器中的所有窗口并导致桌面重新启动文件管理器:
- 侏儒:
killall nautilus
- 伴侣:
killall caja
- 肉桂:
killall nemo
禁用 Google Pixel 的自动安装
似乎没有办法记住仅忽略 Google Pixel。
我不推荐这样做,而且我自己也没有测试过,但是为了单独列出 Google Pixel,您可能必须在 udev 规则和 hwdb 中注释掉供应商 18d1 产品 4ee1(Google Pixel)和供应商 18d1 产品 4ee2(Google Pixel 调试)。
您可以使用以下命令查找记录:
grep -ri '18d1.*4ee[12]' /lib/udev
注释掉 Google Pixel 的 udev 记录后,您可能需要重新启动桌面环境、重新启动和/或运行以下命令的组合:
sudo udevadm hwdb --update
sudo udevadm control --reload-rules
sudo udevadm trigger
再次强调,这是未经测试的,我不推荐这样做,特别是因为为了再次安装 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]'
在上面的示例中,GVfs 通过 libmtp 将 USB 总线 003 设备 096 标识为 Google Pixel 设备,但 Google Pixel 设备已自行断开连接。下次 Google Pixel 重新连接时,Linux 将分配一个新的设备 ID。
libmtp 出错,因为它仍在尝试使用消失的设备。GVfs 会发现错误并将其转发给 GNOME Files 或其他基于 GNOME 的文件管理器。
谁的错?
根据我的发现,这些还有改进的空间:
库
libmtp 可能是造成此问题的最大原因。
它应该改进 MTP 设备连接后突然断开时的错误处理。只有当设备仍然存在时才应传递错误。如果 USB 设备不存在,则尝试重置它是没有意义的。
安卓
Android 可以改进其 MTP 实现,以便它在连接到计算机时不会立即断开连接。
鹦鹉螺 / 卡哈 / 尼莫
如果这些软件提供隐藏错误消息或以不太弹出的方式显示错误消息的偏好设置,那就太好了。
答案2
我有一个解决方法尼莫:
去编辑 > 首选项 > 行为以及介质处理取消选中“插入并启动时自动安装可移动媒体”。
当您完成手机充电后,您可以重新启用该选项以恢复默认行为。
答案3
sudo apt-get install mtp-tools mtpfs
执行此命令将安装必要的工具,并且不会出现错误。可能需要完全重启。
答案4
您可以尝试更改 Android 处理设备上 USB 端口的方式。从 Marshmallow(Android 6.0)开始,USB 端口的默认设置仅用于充电,要更改该设置,您必须点击通知栏,然后点击通知以将其更改为其他用途。
您要做的第一件事是启用开发者模式。
为此,打开“设置 - 关于手机”,然后向下滚动直到看到版本号,然后点击 7 次以启用开发者模式。
按正确顺序完成步骤后,您将看到一条小消息,提示您现在是开发者。
现在启用开发者模式后,您将在设置菜单中看到一个名为“开发者选项”的新菜单项,点击它,然后向下滚动直到看到 USB 配置,然后点击它。然后,
您将看到一个窗口,您可以在其中指定将电缆连接到 USB 端口时的默认行为。您可以选择充电、MTP、PTP 以及您的设备支持的任何其他协议。