USB 스틱을 감지하는 데 왜 그렇게 오랜 시간이 걸리나요?

USB 스틱을 감지하는 데 왜 그렇게 오랜 시간이 걸리나요?

저는 initramfs 스크립트를 작성 중이며 가능한 한 빨리 USB 스틱을 감지하고 싶습니다.

USB 2.0 스틱을 연결하면 idVendor, idProduct 및 USB 카테고리가 100ms 이내에 감지됩니다. 그러나 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초로 설정해야 할 수도 있습니다. 이렇게 오래 걸리는 USB 플래시 드라이브에는 무엇이 들어있나요? 플래시에서 펌웨어 초기화? 플래시 메모리에 액세스하기 위한 대기 시간이 수십 마이크로초 정도일 때 최대 1초 이상의 대기 시간이 필요하다는 것을 믿기 어렵습니다.

이 채널의 주제와 조금 다를 수 있다는 것을 알고 있습니다. 그렇다면 Electronics.stackexchange.com으로 이동하겠습니다.

답변1

1초의 시간 초과가 있는 것으로 나타났습니다.드라이버/usb/storage/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초 이상의 안정화 지연이 필요할 수 있습니다(2010년에 1초로 줄어들 때까지 기본값은 5초였습니다). 이는 아마도 디스크 모터가 초기화되는 동안 컨트롤러에 전원이 부족하기 때문일 것입니다. 아니면 내부 SCSI 펌웨어가 응답하기 전에 부팅하는 데 시간이 걸리기 때문일 수도 있습니다(여기서는 단지 추측일 뿐이라는 것을 알 수 있습니까?).

최신 솔리드 스테이트 스토리지의 경우 전혀 필요하지 않을 수 있으며 많은 사람들이 이를 0으로 설정합니다. 안타깝게도 이는 모든 장치에 적용되는 전역 매개변수이므로 속도가 느린 장치가 있는 경우 사용하는 모든 대형 USB 장치에 적용되는 지연을 감수해야 합니다. udev를 기기별로 설정할 수 있으면 좋겠지만 그렇지 않습니다.

관련 정보