web-dev-qa-db-ja.com

USBスティックの検出に時間がかかるのはなぜですか?

私はinitramfs-scriptを書いていますが、USBスティックをできるだけ早く検出したいと思っています。

USB 2.0スティックを挿入すると、idVendor、idProduct、およびUSBクラスの検出が100ミリ秒以内に発生します。ただし、scsiサブシステムは約1秒が経過するまで「接続」せず、パーティションが完全に認識されるまでにさらに500ミリ秒かかります。

パーティションを検出するには、ドライバーがパーティションテーブルを読み取る必要があると思います。なぜそんなに時間がかかるのですか? urbの送信/受信時間がそれほど長くなったり、フラッシュのアクセス時間がそれほど長くかかるとは思いません。

異なるベンダーの5本のスティックを試しましたが、結果はほぼ同じです。

[ 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

Editそれで、 delay_use モジュールパラメータがデフォルトで1秒に設定されていることがわかりました。これは、遅延を説明しています。 m見て。しかし、なぜそのパラメータが必要なのかについて誰かがコンテキストを提供できるかどうか疑問に思っていますか?コメントによると、古いUSBスティックの場合、delay_useを最大5秒に設定する必要があります。非常に時間がかかるUSBスティックの内部は何ですか。ファームウェアの初期化;フラッシュから読み取りますか?フラッシュにアクセスするための待ち時間が数十マイクロ秒のオーダーである場合、1秒以上の遅延が必要であるとは信じがたいです。

これはこのチャネルでは少しトピックから外れている可能性があることを認識しています。その場合は、electronics.stackexchange.comにアクセスします。

7
Daniel Näslund

/sys/module/usb_storage/parameters/delay_useに書き込むことで、タイムアウトを変更できます。

古いUSBディスクの場合、5秒以上のセトリング遅延が必要になる場合があります(2010年に1秒に短縮されるまでは5がデフォルトでした)。おそらく、ディスクモーターの初期化中にコントローラーの電力が不足しているためです。または、内部SCSIファームウェアが応答するまでに起動に時間がかかるためかもしれません(ここで推測しているだけだとわかりますか?)。

最新のソリッドステートストレージの場合、おそらくまったく必要なく、多くの人が0に設定します。残念ながら、これはすべてのデバイスに適用されるグローバルパラメータであるため、低速のデバイスがある場合は、遅延に耐える必要があります。使用するすべての大容量ストレージUSBデバイス用。 udevによってデバイスごとに設定できればいいのですが、そうではありません。

5
Toby Speight

1秒のタイムアウトintがあることがわかりました drivers/usb/storage/usb.c 。次の2つのコマンドを入力して、より多くのデバッグログを有効にしました。

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

Scsiサブシステムには、ログレベルを指定する奇妙な方法があります(他のLinuxロギング機能と比較して)。レベルごとに1ステップずつビットシフトされます。 drivers/scsi/scsi_logging.h を参照してください。

以下の行starting scanを参照してください。カーネルはスキャンを実行する前に1秒待機します。

[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は、デフォルトの遅延を5秒から1秒に変更しました SBストレージのセトリング遅延をより合理的なものに下げました 。彼は、遅延が非常に高く設定された理由の技術的な理由については何も説明していませんが、カーネルのバグを偽装した可能性があることを示唆しています。

9
Daniel Näslund