我正在编写一个 initramfs 脚本,并希望尽快检测 USB 记忆棒。
当我插入 USB 2.0 棒时,会在 100 毫秒内检测到 idVendor、idProduct 和 USB 类别。但 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
编辑 所以我找到了延迟使用模块参数默认设置为 1 秒,这解释了我看到的延迟。但我想知道是否有人可以提供上下文来说明为什么需要该参数?评论建议,对于较旧的 USB 记忆棒,delay_use 可能需要设置为最多 5 秒。 U盘里面到底是什么东西,需要这么长时间?固件初始化;从闪存读取?当访问闪存的延迟在数十微秒量级时,我很难相信我们需要长达 1 秒或更长的延迟。
我意识到这对于这个频道来说可能有点偏离主题,如果是这样,我会去 electronics.stackexchange.com
答案1
结果发现有1秒的超时int驱动程序/usb/存储/usb.c。我通过键入以下两个命令启用了更多调试日志记录:
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 日志功能相比)指定日志级别的方式;对于每一级,它们都会移动一步,请参阅驱动程序/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 秒将 USB 存储稳定延迟降低到更合理的水平。他没有提供任何有关延迟设置如此之高的技术原因的背景信息,但暗示它可能只是掩盖了一些内核错误。
答案2
您可以通过写入来更改超时/sys/module/usb_storage/parameters/delay_use
。
对于较旧的 USB 磁盘,可能需要 5 秒甚至更长的稳定延迟(默认为 5 秒,直到 2010 年减少到 1 秒),大概是因为磁盘电机初始化时控制器缺电。或者可能是因为内部 SCSI 固件需要一些时间才能启动才能响应(你能看出我只是在这里推测吗?)。
对于现代固态存储来说,它可能根本不需要,很多人将其设置为 0。不幸的是,它是一个适用于所有设备的全局参数,因此如果您有任何速度较慢的设备,您就必须忍受延迟适用于您使用的每个大容量 USB 设备。如果 udev 可以针对每个设备进行设置,那就太好了,但事实并非如此。