¿Cómo deshabilitar la suspensión automática de USB en el kernel 3.7.10 o superior?

38

He actualizado mi HTPC del kernel 3.7.10 a 3.10.7 y parece que CONFIG_USB_SUSPEND ahora ha desaparecido de las opciones del kernel e incluido en PM.

El principal problema al que me enfrento es que tengo un HDD externo y cuando suspendo y activa el HTPC, no está disponible para el sistema. El HDD se activa (puede escucharlo girar de nuevo), pero cuando intenta acceder al punto de montaje, obtiene el siguiente error:

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

Y en dmesg:

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

En núcleos anteriores, establecer CONFIG_USB_SUSPEND = N resolvería el problema, ya que el HDD manejaría su hibernación por sí mismo y el punto de montaje siempre era accesible. Cuando el HDD estaba en reposo y el HTPC necesitaba algo del punto de montaje del HDD, el HDD se despertaba y funcionaba sin problemas.

En este momento he intentado lo siguiente sin éxito:

  1. Cambie manualmente / sys / bus / usb / devices / usb * / power / control a "on" en lugar de "auto" .
  2. Cambie manualmente / sys / bus / usb / devices / usb * / power / autosuspend a "-1" en lugar de "0" .

Pero al volver a activar el HTPC, el punto de montaje vuelve a ser inaccesible. Como alternativa, puedo desmontar y volver a montar el punto de montaje y funciona de nuevo sin problemas, pero estoy seguro de que debería haber una manera de evitar que el sistema operativo maneje la suspensión automática del usb.

¿Alguna idea de cómo deshabilitar la suspensión automática de USB en el núcleo 3.7.10 o superior?

Peter
fuente
¿La cola /sys/bus/usb/devices/<BUS>-<DEVPATH>/power/persistte da 1? No grep CONFIG_PM_RUNTIME /boot/config-$(uname -r)le dará y? power-management.txt
Runium
1
power/persistda 1y no tengo ningún archivo de configuración /boot. CONFIG_PM_RUNTIME=yestá configurado en el .configarchivo del kernel .
Peter

Respuestas:

33

Para Ubuntu y Debian , usbcoreestá compilado en el núcleo, por lo que crear entradas en la /etc/modprobe.dvoluntad NO trabajo: necesitamos cambiar los parámetros de arranque del núcleo.

Edite el /etc/default/grubarchivo y cambie la GRUB_CMDLINE_LINUX_DEFAULTlínea para agregar la usbcore.autosuspend=-1opción:

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

Tenga en cuenta que quit splashya estaban presentes las opciones. Así que mantenga otras opciones que tenga también.

Después de guardar el archivo, actualice grub:

sudo update-grub

Y reiniciar .

Ahora verifique el autosuspendvalor:

cat /sys/module/usbcore/parameters/autosuspend

Y debería mostrarse -1.

En la documentación del kernel se indica que algún día en el futuro este parámetro cambiará a autosuspend_delay_ms(en lugar de autosuspend).

Rael Gugelmin Cunha
fuente
1
Esto parece ser cierto también para Debian.
Benjamin Trent
2
Rael, muchas gracias por esto. Lo mismo es cierto para la versión más reciente de Kali. Agregué lo anterior y mi USB IRToy (v2) ahora funciona correctamente.
Joat
1
Tengo una tarjeta USB en una de las ranuras mPCIE y simplemente no quería la verdad. Ejecutando Debian Jessie. Esto ha resuelto mi problema resolviendo un gran dolor de cabeza, ¡GRACIAS!
xebo
Intenté esto en Ubuntu 15.10 pero el valor no se aplica (el valor es 2). ¿Hay algo más que pueda probar?
Jonas Adler
Todavía estoy en 14.04. Pero afaik, en las últimas versiones del kernel, el parámetro para cambiar es autosuspend_delay_ms.
Rael Gugelmin Cunha
20

De acuerdo con la documentación del árbol de kernel , el tiempo de retraso de inactividad del autosuspend se controla mediante el autosuspendparámetro del módulo en usbcore. Establecer el retraso de inactividad predeterminado inicial en -1 evitará la suspensión automática de cualquier dispositivo USB. Aún debería poder habilitar la suspensión automática para los dispositivos seleccionados.

El usbcore.autosuspendparámetro del núcleo se puede configurar cuando el módulo se carga manualmente:

$ modprobe usbcore autosuspend=-1

o agregando la siguiente línea a un archivo de configuración en /etc/modprobe.d:

options usbcore autosuspend=-1

Si usbcorese compila en el núcleo, el parámetro se puede ajustar agregando lo siguiente a la línea de comando del núcleo:

usbcore.autosuspend=-1

Por último, la opción se puede ajustar en tiempo de ejecución haciendo:

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

El cambio afectará a todos los dispositivos USB nuevos. Los dispositivos ya existentes no se verán afectados.

Thomas Nyman
fuente
2
He usbcorecompilado en el kernel, pero el uso de la modprobe.dopción no parece funcionar. A pesar de que lo modprobe -c usbcore | grep autosuspendmuestra como -1, cat /sys/module/usbcore/parameters/autosuspendobteniendo2
Peter
1
@Peter: autosuspendestá en desuso. El nuevo archivo es el autosuspend_delay_msque lleva ms en lugar de segundos. ref . Pero power/controlestablecer a ondebería tener el mismo efecto.
Runium
@Sukminder, ¿qué debo configurar para mantener la suspensión automática deshabilitada para siempre? He intentado usar autosuspend=-1ambos parámetros modprobe.dy kernel, pero el HDD aún se suspende y no se despierta bien.
Peter
1
@Peter: Si supiera te lo diré :). Solo estoy citando qué doc. dice. Su pt. 1 en su publicación debería haberlo hecho hasta donde puedo decir, no tengo idea de por qué no lo hace. ¿Ha intentado ajustar autosuspend_delay_msa -1? (In /sys/bus/usb/devices/<device>/power/autosuspend_delay_ms)
Runium
1
Estoy en el kernel 4.4 y autosuspend_delay_msno está allí. Pero autosuspendes.
Mariano Dupont el
3

Tengo un problema similar con un USB Microsoft Wheel Mouse Optical USB y PS / 2 compatible desde que actualicé un sistema Linux Mint Debian Edition a kernel 3.10-2-amd64. Se sospechaba una suspensión automática inadecuada por parte de la administración de energía USB del núcleo . En Debian, esto se compila como el usbcoremódulo en el núcleo.

Puede cambiar esto permanentemente emitiendo en la línea de comando:

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

Sin autosuspend=0embargo, algunos núcleos pueden requerir .

Si su sistema usa initrd(lo más probable es que lo haga), reconstruya el initrdpara su núcleo.

Por ejemplo:

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

Reiniciar y verificar con:

cat /sys/module/usbcore/parameters/autosuspend

que debería rendir -1ahora.

Serge Stroobandt
fuente
No uso initrdy las acciones descritas aquí no funcionan en este caso, ya que nos respondieron antes.
Peter