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

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

我已经从内核更新了我的 HTPC3.7.103.10.7看来CONFIG_USB_SUSPEND现在已从内核选项中消失并包含在 PM 中。

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

ZOTAC ~ # ls /media
ls: reading directory /media: Input/output error

在 dmesg 上:

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

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

现在我已经尝试了以下方法但没有成功:

  1. 手动更改/sys/总线/USB/设备/USB*/电源/控制“在”代替“汽车”
  2. 手动更改/sys/bus/usb/devices/usb*/power/autosuspend“-1”代替“0”

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

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

答案1

为了乌班图德班usbcore被编译到内核中,因此在/etc/modprobe.dwill创建条目不是工作。相反,我们需要更改内核启动参数。

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

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash usbcore.autosuspend=-1"

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

保存文件后,更新grub:

sudo update-grub

重启

现在检查autosuspend值:

cat /sys/module/usbcore/parameters/autosuspend

它应该显示-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.

答案2

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

usbcore.autosuspend可以在手动加载模块时设置内核参数:

$ modprobe usbcore autosuspend=-1

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

options usbcore autosuspend=-1

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

usbcore.autosuspend=-1

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

echo -1 >/sys/module/usbcore/parameters/autosuspend

此更改将影响所有新的 USB 设备。现有设备不会受到影响。

答案3

我有一个类似的问题兼容 Microsoft 滚轮鼠标光学 USB 和 PS/2自从升级了Linux Mint Debian 版系统到内核3.10-2-amd64。内核的不适当的自动挂起USB电源管理被怀疑。在 Debian 中,它被编译为usbcore内核中的模块。

您可以通过在命令行发出以下命令来永久更改此设置:

sudo echo "options usbcore autosuspend=-1" | sudo tee /etc/modprobe.d/disable-usb-autosuspend.conf > /dev/null

不过,某些内核可能需要autosuspend=0

如果您的系统使用initrd(很可能是),则为您的内核重建initrd

例如:

uname -r
sudo dpkg-reconfigure linux-image-3.10-2-amd64

重新启动并检查:

cat /sys/module/usbcore/parameters/autosuspend

现在应该会产生结果-1

相关内容