Il s'avère qu'il y a un délai d'attente de 1 seconde int drivers/usb/storage/usb.c. J'ai activé plus de journaux de débogage en tapant les deux commandes suivantes :
echo 8 > /proc/sys/kernel/printk
echo "module usb_storage +p" > /sys/kernel/debug/dynamic_debug/control
echo 0xFFFFFF > /proc/sys/dev/scsi/logging_level
Le sous-système scsi a une façon étrange (par rapport au reste des fonctionnalités de journalisation Linux) de spécifier les niveaux de journalisation ; ce sont des bits décalés d'un pas pour chaque niveau, voir drivers/scsi/scsi_logging.h
Voir la ligne starting scan
dessous. Le noyau attend 1 seconde avant de faire le scan.
[21960.837879 < 23.040778>] usb 2-1.2: USB disconnect, device number 18
[21960.838263 < 0.000384>] sd 20:0:0:0: [sg2] sg_remove_device
[21960.838888 < 0.000625>] sd 20:0:0:0: [sg2] sg_device_destroy
[21966.157918 < 5.319030>] usb 2-1.2: new high-speed USB device number 19 using ehci-pci
[21966.251625 < 0.093707>] usb 2-1.2: New USB device found, idVendor=0781, idProduct=5530
[21966.251634 < 0.000009>] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[21966.251638 < 0.000004>] usb 2-1.2: Product: Firebird USB Flash Drive
[21966.251641 < 0.000003>] usb 2-1.2: Manufacturer: SanDisk
[21966.251644 < 0.000003>] usb 2-1.2: SerialNumber: 4C532000001215110130
[21966.252184 < 0.000540>] usb-storage 2-1.2:1.0: USB Mass Storage device detected
[21966.252307 < 0.000123>] scsi host21: usb-storage 2-1.2:1.0
[21966.252439 < 0.000132>] usb-storage 2-1.2:1.0: waiting for device to settle before scanning
[21967.250018 < 0.997579>] usb-storage 2-1.2:1.0: starting scan
[21967.250242 < 0.000224>] usb-storage 2-1.2:1.0: scan complete
[21967.250295 < 0.000053>] scsi host21: scsi_scan_host_selected: <4294967295:4294967295:18446744073709551615>
[21967.250354 < 0.000059>] scsi 21:0:0:0: scsi scan: INQUIRY pass 1 length 36
[21967.251717 < 0.001363>] scsi 21:0:0:0: scsi scan: INQUIRY successful with code 0x0
[21967.251738 < 0.000021>] scsi 21:0:0:0: Direct-Access SanDisk Cruzer 1.26 PQ: 0 ANSI: 5
[21967.251745 < 0.000007>] scsi target21:0:0: scsi scan: Sequential scan
[21967.251776 < 0.000031>] scsi 21:0:0:1: scsi scan: INQUIRY pass 1 length 36
[21967.251907 < 0.000131>] scsi 21:0:0:1: scsi scan: INQUIRY failed with code 0x40000
[21967.252282 < 0.000375>] sd 21:0:0:0: sg_alloc: dev=2
[21967.252366 < 0.000084>] sd 21:0:0:0: Attached scsi generic sg2 type 0
[21967.253703 < 0.001337>] sd 21:0:0:0: [sdb] 7821312 512-byte logical blocks: (4.00 GB/3.72 GiB)
[21967.255324 < 0.001621>] sd 21:0:0:0: [sdb] Write Protect is off
[21967.255334 < 0.000010>] sd 21:0:0:0: [sdb] Mode Sense: 43 00 00 00
[21967.258145 < 0.002811>] sd 21:0:0:0: [sdb] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[21967.272208 < 0.014063>] sdb: sdb1
[21967.276433 < 0.004225>] sd 21:0:0:0: [sdb] Attached SCSI removable disk
Linus Torvalds a changé le délai par défaut de 5 à 1 seconde dans le délai de stabilisation du stockage USB inférieur en quelque chose de plus raisonnable. Il ne fournit aucun contexte sur les raisons techniques pour lesquelles le retard a été fixé si haut, mais laisse entendre qu'il a peut-être simplement masqué certains bogues du noyau.
Vous pouvez modifier le délai d'attente en écrivant à /sys/module/usb_storage/parameters/delay_use
.
Pour les disques USB plus anciens, un délai de réglage de 5 secondes ou même plus peut être nécessaire (et 5 était la valeur par défaut jusqu'à ce qu'il soit réduit à 1 seconde en 2010), probablement parce que le contrôleur est privé d'alimentation pendant que les moteurs de disque s'initialisent. Ou peut-être parce que le micrologiciel SCSI interne met du temps à démarrer avant de répondre (pouvez-vous dire que je ne fais que spéculer ici ?).
Pour le stockage à semi-conducteurs moderne, ce n'est probablement pas nécessaire du tout, et beaucoup de gens le définissent sur 0. Malheureusement, c'est un paramètre global qui s'applique à tous les appareils, donc si vous avez des appareils lents, vous devez supporter le retard pour chaque périphérique USB de stockage de masse que vous utilisez. Ce serait bien si cela pouvait être défini par appareil par udev, mais ce n'est pas le cas.