Sto scrivendo uno script initramfs e voglio rilevare le chiavette USB il più velocemente possibile.
Quando inserisco una chiavetta usb 2.0, il rilevamento di idVendor, idProduct e classe USB avviene entro 100 ms. Ma il sottosistema scsi non si "attacca" fino a quando non è trascorso circa 1 s e sono necessari altri 500 ms prima che la partizione venga completamente riconosciuta.
Presumo che il driver debba leggere la tabella delle partizioni per rilevare le partizioni. Perchè ci mette tanto? Non mi aspetto che il tempo di invio/ricezione urb sia così lungo o che il tempo di accesso del flash richieda così tanto tempo.
Ho provato 5 stick di diversi fornitori e il risultato è più o meno lo stesso.
[ 5731.097540] usb 2-1.2: new high-speed USB device number 7 using ehci-pci
[ 5731.195360] usb 2-1.2: New USB device found, idVendor=0951, idProduct=1643
[ 5731.195368] usb 2-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 5731.195372] usb 2-1.2: Product: DataTraveler G3
[ 5731.195376] usb 2-1.2: Manufacturer: Kingston
[ 5731.195379] usb 2-1.2: SerialNumber: 001CC0EC32BCBBB04712022C
[ 5731.196942] usb-storage 2-1.2:1.0: USB Mass Storage device detected
[ 5731.197193] scsi host9: usb-storage 2-1.2:1.0
[ 5732.268389] scsi 9:0:0:0: Direct-Access Kingston DataTraveler G3 PMAP PQ: 0 ANSI: 0 CCS
[ 5732.268995] sd 9:0:0:0: Attached scsi generic sg2 type 0
[ 5732.883939] sd 9:0:0:0: [sdb] 7595520 512-byte logical blocks: (3.88 GB/3.62 GiB)
[ 5732.884565] sd 9:0:0:0: [sdb] Write Protect is off
[ 5732.884568] sd 9:0:0:0: [sdb] Mode Sense: 23 00 00 00
[ 5732.885178] sd 9:0:0:0: [sdb] No Caching mode page found
[ 5732.885181] sd 9:0:0:0: [sdb] Assuming drive cache: write through
[ 5732.903834] sdb: sdb1
[ 5732.906812] sd 9:0:0:0: [sdb] Attached SCSI removable disk
Modifica
Quindi ho trovato il parametro del modulo delay_use che per impostazione predefinita è impostato su 1 secondo, il che spiega il ritardo che vedo. Ma mi chiedo se qualcuno può fornire un contesto sul perché quel parametro è necessario? Un commento ha suggerito che per le chiavette USB più vecchie, delay_use potrebbe dover essere impostato fino a 5 secondi. Cosa c'è dentro la chiavetta USB che richiede così tanto tempo; inizializzazione del firmware; legge dal flash? Trovo difficile credere che abbiamo bisogno di ritardi fino a 1 secondo o più quando la latenza per l'accesso alla flash è dell'ordine di decine di microsecondi.
Mi rendo conto che questo potrebbe essere leggermente fuori tema per questo canale, in tal caso, andrò su electronics.stackexchange.com
Risposta accettata:
Puoi modificare il timeout scrivendo in /sys/module/usb_storage/parameters/delay_use
.
Per i dischi USB meno recenti, potrebbe essere necessario un ritardo di stabilizzazione di 5 secondi o anche di più (e 5 era l'impostazione predefinita fino a quando non è stato ridotto a 1 secondo nel 2010), presumibilmente perché il controller è privo di alimentazione durante l'inizializzazione dei motori del disco. O forse perché il firmware SCSI interno richiede tempo per avviarsi prima che sia reattivo (puoi dire che sto solo speculando qui?).
Correlati:la differenza tra gli operatori Bash [[ vs [ vs ( vs ((?Per i moderni dispositivi di archiviazione a stato solido, probabilmente non è affatto necessario e molte persone lo impostano su 0. Sfortunatamente, è un parametro globale che si applica a tutti i dispositivi, quindi se hai dispositivi lenti, devi sopportare il ritardo per ogni dispositivo USB di archiviazione di massa che utilizzi. Sarebbe bello se potesse essere impostato per dispositivo da udev, ma non è così.