Cómo montar dispositivos USB más rápidamente en Linux

marzo 23, 2010

¿Has notado que cuando conectas un dispositivo USB a Linux tarda un buen rato en montarlo? ¿Qué está haciendo exactamente y por qué tarda tanto?
La cruda realidad es que, en mi sistema, una memoria USB tarda 5,4 segundos, de los cuales 5 segundos los pasa ¡sin hacer nada!

Este es el resultado del comando dmesg (mensajes del kernel) la primera vez que se conecta una memoria USB:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[    73.700024] usb 1-8: new high speed USB device using ehci_hcd and address 17
[    73.835190] usb 1-8: configuration #1 chosen from 1 choice
[    73.851602] Initializing USB Mass Storage driver...
[    73.851842] scsi15 : SCSI emulation for USB Mass Storage devices
[    73.852223] usbcore: registered new interface driver usb-storage
[    73.852232] USB Mass Storage support registered.
[    73.852681] usb-storage: device found at 17
[    73.852686] usb-storage: waiting for device to settle before scanning
[    78.852166] usb-storage: device scan complete
[    78.853148] scsi 15:0:0:0: Direct-Access     USB      Flash Disk       3000 PQ: 0 ANSI: 0 CCS
[    78.853873] sd 15:0:0:0: Attached scsi generic sg4 type 0
[    78.863448] sd 15:0:0:0: [sdd] 506880 512-byte logical blocks: (259 MB/247 MiB)
[    78.865145] sd 15:0:0:0: [sdd] Write Protect is off
[    78.865153] sd 15:0:0:0: [sdd] Mode Sense: 43 00 00 00
[    78.865158] sd 15:0:0:0: [sdd] Assuming drive cache: write through
[    78.870765] sd 15:0:0:0: [sdd] Assuming drive cache: write through
[    78.870777]  sdd: sdd1
[    78.958132] sd 15:0:0:0: [sdd] Assuming drive cache: write through
[    78.958144] sd 15:0:0:0: [sdd] Attached SCSI removable disk

Vamos a verlas con detalle (el número entre [] son los segundos desde el arranque del sistema):

  • Las líneas 1 y 2 son la detección e inicialización del dispositivo USB.
  • El sistema lo identifica como un dispositivo de almacenamiento masivo y carga el módulo kernel correspondiente usb-storage en las líneas 3 a 6.
  • Las líneas 7 a 9 son la dectección del dispositivo USB por parte de este driver.
  • Las demás líneas describen la creación del dispositivo o dispositivos SCSI correspondientes. Los dispositivos de almacenamiento masivos USB utilizan emulación SCSI, así que se presentan al sistema como tales. sdd es el dispositivo entero y sdd1 la primera y única partición.

Todos esos pasos son bastante rápidos excepto entre las líneas 8 y 9 (dectección del dispositivo USB), que se queda parado nada menos que 5 segundos, según el comentario “esperando a que el dispositivo se asiente antes de analizarlo”.
En realidad no es más que una pausa, probablemente porque algunos dispositivos no funcionan sin ella. Es un parámetro del módulo, por lo que se puede ajustar al mínimo que funcione con todos tus dispositivos. Personalmente, he probado todas las memorias y discos USB que he encontrado con la pausa desactivada, y ninguno ha dado problemas.
Puedes probarlo con los tuyos haciendo como root:

# echo 0 > /sys/module/usb_storage/parameters/delay_use

O si no eres root, con sudo:

$ echo 0 | sudo tee /sys/module/usb_storage/parameters/delay_use

NOTA: estos comandos solo funcionan cuando el módulo usb_storage ya está cargado.

Si no funcionase con 0 puedes probar con otro valor (en segundos). El valor por defecto es 5.
Una vez hayas encontrado tu valor ideal puedes hacer la configuración permanente añadiendo la siguiente línea a la configuración de modprobe:

options usb_storage delay_use=0

A qué fichero se añade depende de la distribución Linux que utilices. Si ésta es reciente probablemente exista un directorio /etc/modprobe.d/. En ese caso debes crear un fichero .conf a ese directorio, llamémosle por ejemplo usb-nodelay.conf, con la línea en cuestión.
Si en tu sistema no existe el directorio /etc/modprobe.d/, añade la línea al final del fichero /etc/modprobe.conf.

Así, la próxima vez que reinicies el sistema se aplicará esta opción automáticamente.
Si no quieres reiniciar para probar si funciona, desconecta todos tus dispositivos de almacenamiento masivo USB y ejecuta el comando:

$ sudo modprobe -r usb_storage

La próxima vez que conectes un dispositivo se volverá a cargar el módulo.

Artículos relacionados:

  1. Jugando con device-mapper y loop Hace unos días tuve que mover un archivo grande de...

Deja un comentario