Tại sao phải mất một thời gian dài để phát hiện một thanh usb?


7

Tôi đang viết một tập lệnh initramfs và muốn phát hiện các thanh USB càng nhanh càng tốt.

Khi tôi cắm một thanh USB 2.0, việc phát hiện lớp idVendor, idSản phẩm và USB xảy ra trong vòng 100 ms. Nhưng hệ thống con scsi không "đính kèm" cho đến khi khoảng 1 giây trôi qua và phải mất thêm 500 ms trước khi phân vùng được nhận diện đầy đủ.

Tôi giả sử rằng trình điều khiển cần phải đọc bảng phân vùng để phát hiện các phân vùng. Tại sao phải mất quá lâu? Tôi không hy vọng thời gian gửi / nhận của bạn sẽ dài như vậy hoặc thời gian truy cập của đèn flash sẽ mất rất nhiều thời gian.

Tôi đã thử 5 gậy từ các nhà cung cấp khác nhau và kết quả là như nhau.

[ 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

Chỉnh sửa Vì vậy, tôi đã tìm thấy tham số mô-đun delay_use theo mặc định được đặt thành 1 giây, điều này giải thích cho độ trễ mà tôi thấy. Nhưng tôi tự hỏi nếu ai đó có thể cung cấp bối cảnh như tại sao tham số đó là cần thiết? Một nhận xét gợi ý rằng đối với các thanh USB cũ hơn, delay_use có thể cần được đặt tối đa 5 giây. Những gì bên trong thanh usb mất rất nhiều thời gian; khởi tạo phần sụn; đọc từ đèn flash? Tôi thấy khó tin rằng chúng ta cần độ trễ miễn là 1 giây trở lên khi độ trễ để truy cập flash theo thứ tự hàng chục micro giây.

Tôi nhận ra rằng điều này có thể hơi lạc đề đối với kênh này, nếu vậy, tôi sẽ truy cập trang điện tử.stackexchange.com

Câu trả lời:


5

Bạn có thể thay đổi thời gian chờ bằng cách viết vào /sys/module/usb_storage/parameters/delay_use.

Đối với các đĩa usb cũ hơn, có thể cần độ trễ giải quyết trong 5 giây hoặc thậm chí nhiều hơn (và 5 là mặc định cho đến khi giảm xuống còn 1 giây vào năm 2010), có lẽ là do bộ điều khiển bị thiếu điện trong khi động cơ đĩa đang khởi động. Hoặc có thể vì phần sụn SCSI bên trong cần có thời gian để khởi động trước khi nó phản hồi (bạn có thể nói tôi chỉ đang suy đoán ở đây không?).

Đối với lưu trữ trạng thái rắn hiện đại, có lẽ hoàn toàn không cần thiết và nhiều người đặt nó thành 0. Thật không may, đó là thông số toàn cầu áp dụng cho tất cả các thiết bị, vì vậy nếu bạn có bất kỳ thiết bị chậm nào, bạn phải chịu đựng sự chậm trễ cho mọi thiết bị USB lưu trữ lớn mà bạn sử dụng. Sẽ thật tuyệt nếu nó có thể được đặt trên mỗi thiết bị bởi udev, nhưng thực tế không phải vậy.


9

Hóa ra là có một trình điều khiển int / usb / Storage / usb.c hết thời gian 1 giây . Tôi đã kích hoạt thêm ghi nhật ký gỡ lỗi bằng cách nhập hai lệnh sau:

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

Hệ thống con scsi có một cách kỳ lạ (so với phần còn lại của khả năng ghi nhật ký linux) để chỉ định mức độ nhật ký; bit của chúng thay đổi một bước cho mỗi cấp độ, xem trình điều khiển / scsi / scsi_logging.h

Xem dòng starting scandưới đây. Nhân đợi 1 giây trước khi thực hiện quét.

[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 đã thay đổi độ trễ mặc định từ 5 thành 1 giây trong độ trễ giải quyết lưu trữ USB thành một cái gì đó hợp lý hơn . Anh ta không cung cấp bất kỳ bối cảnh nào về lý do kỹ thuật tại sao độ trễ được đặt quá cao, nhưng gợi ý rằng nó có thể vừa giả mạo một số lỗi kernel.


2
Không chỉ vậy, nhưng bạn có thể thay đổi thời gian chờ (bằng cách viết thành /sys/module/usb_storage/parameters/delay_use). Đối với các đĩa USB cũ hơn, có thể cần độ trễ giải quyết tối đa 5 giây, nhưng đối với lưu trữ trạng thái rắn hiện đại, có lẽ không cần thiết chút nào. Thật không may, kernel không thể biết rằng cho đến khi quá muộn để có ích!
Toby Speight

@TobySpeight Nếu bạn cung cấp câu trả lời riêng biệt với một số bối cảnh khác về lý do tại sao việc giải quyết có thể cần theo thứ tự vài giây, thì tôi sẽ vui vẻ chấp nhận câu trả lời của bạn. Xem chỉnh sửa tôi đã làm cho câu hỏi yêu cầu thêm bối cảnh.
Daniel Näslund

@dannas bạn có chấp nhận câu trả lời như bạn nói không? Bạn đang khiến tất cả chúng tôi hồi hộp :).
msouth
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.