Warum dauert es so lange, einen USB-Stick zu erkennen?

7

Ich schreibe ein Initramfs-Skript und möchte USB-Sticks so schnell wie möglich erkennen.

Wenn ich einen USB 2.0-Stick einstecke, erfolgt die Erkennung der IDVendor-, IDProduct- und USB-Klasse innerhalb von 100 ms. Das scsi-Subsystem "verbindet" sich jedoch erst nach Ablauf von ca. 1 s und es dauert weitere 500 ms, bis die Partition vollständig erkannt wird.

Ich gehe davon aus, dass der Treiber die Partitionstabelle lesen muss, um Partitionen zu erkennen. Warum dauert es so lange? Ich erwarte nicht, dass die Sende- / Empfangszeit der Stadt so lang ist oder dass die Zugriffszeit des Blitzes so lange dauert.

Ich habe 5 Sticks von verschiedenen Anbietern ausprobiert und das Ergebnis ist ungefähr gleich.

[ 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

Bearbeiten Also habe ich den Modulparameter delay_use gefunden, der standardmäßig auf 1 Sekunde eingestellt ist, was die Verzögerung erklärt, die ich sehe. Aber ich frage mich, ob jemand einen Kontext angeben kann, warum dieser Parameter benötigt wird. Ein Kommentar deutete darauf hin, dass für ältere USB-Sticks delay_use möglicherweise auf bis zu 5 Sekunden eingestellt werden muss. Was ist es im USB-Stick, das so viel Zeit in Anspruch nimmt? Firmware-Initialisierung; liest aus dem Blitz? Es fällt mir schwer zu glauben, dass wir Verzögerungen von mindestens 1 Sekunde benötigen, wenn die Latenz für den Zugriff auf Flash in der Größenordnung von zehn Mikrosekunden liegt.

Mir ist klar, dass dies für diesen Kanal möglicherweise etwas vom Thema abweicht. Wenn ja, gehe ich zu electronic.stackexchange.com

Daniel Näslund
quelle

Antworten:

5

Sie können das Zeitlimit ändern, indem Sie an schreiben /sys/module/usb_storage/parameters/delay_use.

Bei älteren USB-Festplatten ist möglicherweise eine Einschwingverzögerung von 5 Sekunden oder mehr erforderlich (und 5 war die Standardeinstellung, bis sie 2010 auf 1 Sekunde reduziert wurde), vermutlich weil der Controller während der Initialisierung der Festplattenmotoren keinen Strom mehr hat. Oder möglicherweise, weil die interne SCSI-Firmware einige Zeit zum Starten benötigt, bevor sie reagiert (können Sie sagen, dass ich hier nur spekuliere?).

Für modernen Solid-State-Speicher wird er wahrscheinlich überhaupt nicht benötigt, und viele Leute setzen ihn auf 0. Leider ist er ein globaler Parameter, der für alle Geräte gilt. Wenn Sie also überhaupt langsame Geräte haben, müssen Sie die Verzögerung ertragen für jedes Massenspeicher-USB-Gerät, das Sie verwenden. Es wäre schön, wenn es von udev pro Gerät eingestellt werden könnte, aber das ist nicht der Fall.

Toby Speight
quelle
9

Es stellt sich heraus, dass es eine Zeitüberschreitung von 1 Sekunde in den Treibern / usb / storage / usb.c gibt . Ich habe mehr Debug-Protokollierung aktiviert, indem ich die folgenden zwei Befehle eingegeben habe:

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

Das scsi-Subsystem verfügt über eine seltsame Methode (im Vergleich zu den übrigen Linux-Protokollierungsfunktionen) zum Angeben von Protokollstufen. Die Bits werden für jede Ebene um einen Schritt verschoben, siehe drivers / scsi / scsi_logging.h

Siehe die Zeile starting scanunten. Der Kernel wartet 1 Sekunde, bevor er den Scan ausführt.

[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 hat die Standardverzögerung von 5 auf 1 Sekunden in der Einschwingverzögerung für den unteren USB-Speicher auf einen vernünftigeren Wert geändert . Er gibt keinen Kontext zu den technischen Gründen an, warum die Verzögerung so hoch eingestellt wurde, deutet jedoch an, dass sie möglicherweise nur einige Kernel-Fehler maskiert hat.

Daniel Näslund
quelle
2
Darüber hinaus können Sie das Zeitlimit ändern (indem Sie an schreiben /sys/module/usb_storage/parameters/delay_use). Bei älteren USB-Festplatten ist möglicherweise eine Einschwingverzögerung von bis zu 5 Sekunden erforderlich, bei modernen Solid-State-Speichern ist diese wahrscheinlich überhaupt nicht erforderlich. Leider kann der Kernel das erst wissen, wenn es zu spät ist, um nützlich zu sein!
Toby Speight
@TobySpeight Wenn Sie dies als separate Antwort mit etwas mehr Kontext angeben, warum die Abwicklung möglicherweise in der Größenordnung von Sekunden erfolgen muss, akzeptiere ich Ihre Antwort gerne. Siehe die Bearbeitung, die ich an der Frage vorgenommen habe, um mehr Kontext zu erhalten.
Daniel Näslund
@dannas wolltest du die Antwort akzeptieren, wie du gesagt hast? Du lässt uns alle in Atem :).
msouth