如何在内核 3.7.10 或更高版本上禁用 USB 自动挂起?

Pet*_*ter 47 kernel usb power-management suspend

我已经将我的 HTPC 从内核3.7.10更新到3.10.7,似乎CONFIG_USB_SUSPEND现在从内核选项中消失并包含在 PM 中。

我面临的主要问题是我有一个外置硬盘,当挂起和唤醒 HTPC 时,系统无法使用它。HDD 唤醒(您可以听到它再次旋转),但是当您尝试访问挂载点时,您会收到以下错误:

ZOTAC ~ # ls /media
ls: reading directory /media: Input/output error
Run Code Online (Sandbox Code Playgroud)

在 dmesg 上:

[  253.278260] EXT4-fs warning (device sdb1): __ext4_read_dirblock:908: error reading   directory block (ino 2, block 0)
Run Code Online (Sandbox Code Playgroud)

在以前的内核中,设置 CONFIG_USB_SUSPEND=N 可以解决这个问题,因为 HDD 会自行处理其休眠状态,并且挂载点始终是可访问的。当 HDD 处于睡眠状态并且 HTPC 需要 HDD 安装点的某些内容时,HDD 本身会唤醒并正常运行。

现在我尝试了以下但没有成功:

  1. 手动将/sys/bus/usb/devices/usb*/power/control更改为"on"而不是"auto"
  2. 手动将/sys/bus/usb/devices/usb*/power/autosuspend 更改"-1"而不是"0"

但是当再次唤醒HTPC时,挂载点再次无法访问。作为解决方法,我可以卸载并重新安装挂载点,它可以再次正常工作,但我确信应该有一种方法可以避免让操作系统处理 USB 自动挂起。

知道如何在内核 3.7.10 或更高版本上禁用 USB 自动挂起吗?

Rae*_*nha 47

对于Ubuntu的Debian的usbcore被编译到内核,所以在创建条目/etc/modprobe.d工作。相反,我们需要更改内核启动参数。

编辑/etc/default/grub文件并更改GRUB_CMDLINE_LINUX_DEFAULT行以添加usbcore.autosuspend=-1选项:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash usbcore.autosuspend=-1"
Run Code Online (Sandbox Code Playgroud)

请注意,quiet splash已经存在的选项。因此,请保留您拥有的其他选项。

保存文件后,更新grub:

sudo update-grub
Run Code Online (Sandbox Code Playgroud)

重启

现在检查autosuspend值:

cat /sys/module/usbcore/parameters/autosuspend
Run Code Online (Sandbox Code Playgroud)

它应该显示-1.

附加信息

在内核文档中声明,在未来的某一天这个参数将更改为autosuspend_delay_ms(而不是autosuspend),但到目前为止,仍然是相同的名称。

该值的文档-1可以在内核源文件中找到drivers/usb/core/hub.c

1808:    * - If user has indicated to prevent autosuspend by passing
1809:    *   usbcore.autosuspend = -1 then keep autosuspend disabled.
Run Code Online (Sandbox Code Playgroud)

  • 雷尔,非常感谢。最新版本的 Kali 也是如此。我添加了上述内容,我的 USB IRToy (v2) 现在可以正常工作了。 (2认同)

Tho*_*man 20

根据内核树文档,自动挂起空闲延迟时间由 中的autosuspend模块参数控制usbcore。将初始默认空闲延迟设置为 -1 将阻止任何 USB 设备的自动挂起。您应该仍然能够为选定的设备启用自动挂起。

usbcore.autosuspend当模块被手动加载的内核参数可设置为:

$ modprobe usbcore autosuspend=-1
Run Code Online (Sandbox Code Playgroud)

或者通过将以下行添加到配置文件中/etc/modprobe.d

options usbcore autosuspend=-1
Run Code Online (Sandbox Code Playgroud)

如果usbcore编译进内核,可以通过在内核命令行中添加以下内容来调整参数:

usbcore.autosuspend=-1
Run Code Online (Sandbox Code Playgroud)

最后,可以通过执行以下操作在运行时调整该选项:

echo -1 >/sys/module/usbcore/parameters/autosuspend
Run Code Online (Sandbox Code Playgroud)

此更改将影响所有新的 USB 设备。已经存在的设备不会受到影响。

  • 我已将 `usbcore` 编译到内核中,但是使用 `modprobe.d` 选项似乎不起作用。尽管`modprobe -c usbcore | grep autosuspend` 显示为`-1`,执行`cat /sys/module/usbcore/parameters/autosuspend` 我得到`2` (2认同)