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 von idVendor, idProduct und USB-Klasse innerhalb von 100 ms. Aber das SCSI-Subsystem „bindet“ sich erst nach ca. 1 s an 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 Urb so lange ist oder die Zugriffszeit des Flashs 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 dafür liefern kann, warum dieser Parameter benötigt wird? Ein Kommentar schlug vor, dass delay_use für ältere USB-Sticks möglicherweise auf bis zu 5 Sekunden eingestellt werden muss. Was ist im USB-Stick, das so viel Zeit in Anspruch nimmt; Firmware-Initialisierung; liest aus dem Flash? Ich finde es schwer zu glauben, dass wir Verzögerungen von 1 Sekunde oder mehr brauchen, wenn die Latenz für den Zugriff auf Flash in der Größenordnung von mehreren 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
Akzeptierte Antwort:
Sie können die Zeitüberschreitung ändern, indem Sie in /sys/module/usb_storage/parameters/delay_use
schreiben .
Bei älteren USB-Festplatten kann eine Einschwingverzögerung von 5 Sekunden oder mehr erforderlich sein (und 5 war die Standardeinstellung, bis sie 2010 auf 1 Sekunde reduziert wurde), vermutlich weil der Controller während der Initialisierung der Festplattenmotoren nicht mit Strom versorgt wird. Oder möglicherweise, weil die interne SCSI-Firmware einige Zeit braucht, um hochzufahren, bevor sie reagiert (merken Sie, dass ich hier nur spekuliere?).
Verwandter:der Unterschied zwischen den Bash-Operatoren [[ vs [ vs ( vs ((?Für moderne Solid-State-Speicher wird es wahrscheinlich überhaupt nicht benötigt, und viele Leute setzen es auf 0. Leider ist es 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 USB-Massenspeichergerät, das Sie verwenden. Es wäre schön, wenn es per udev pro Gerät eingestellt werden könnte, aber das ist nicht der Fall.