我希望这里有人可以帮助我了解 Ubuntu 12.04.3 如何定期扫描 SCSI 总线。
我已通过以下命令启用了 SCSI 日志记录:
scsi_logging_level -E 3 -S 3 -M 2
当我插入我的 BlackBerry 9800 时,我会定期看到以下一组消息(充电模式,而非 UMASS 模式):
[102356.446327] sd 32:0:0:1: Done: SUCCESS
[102356.446331] sd 32:0:0:1: Result: hostbyte=DID_OK driverbyte=DRIVER_OK
[102356.446335] sd 32:0:0:1: CDB: Test Unit Ready: 00 20 00 00 00 00
[102356.446343] sd 32:0:0:1: Sense Key : Not Ready [current]
[102356.446347] sd 32:0:0:1: Add. Sense: Medium not present
[102356.446358] sd 32:0:0:0: Send:
[102356.446361] sd 32:0:0:0: CDB: Test Unit Ready: 00 00 00 00 00 00
[102356.447168] sd 32:0:0:0: Done: SUCCESS
[102356.447172] sd 32:0:0:0: Result: hostbyte=DID_OK driverbyte=DRIVER_OK
[102356.447176] sd 32:0:0:0: CDB: Test Unit Ready: 00 00 00 00 00 00
[102356.447183] sd 32:0:0:0: Sense Key : Not Ready [current]
[102356.447188] sd 32:0:0:0: Add. Sense: Medium not present
最后,当我切换到 UMASS 模式时,检测到介质存在并sd
创建相应的设备节点。
一切都按预期运行,但我想了解此功能。那么,是什么触发了总线的定期扫描?是否有服务触发了此操作,还是由内核直接完成?
更新一
这些消息肯定来自内核,所以我相信内核负责扫描 SCSI 设备。但是,我仍然不清楚是什么触发了 BlackBerry 设备的定期重新扫描。
答案1
好的。我终于明白了。
轮询由内核直接处理。它不是像我最初想的那样发生在 SCSI 层,而是在块设备层处理。这已添加几次内核版本之前,然而它在 kernel.org 源中默认是禁用的。
您可以使用以下命令更改默认轮询间隔(您必须是 root 用户):
echo 2000 > /sys/module/block/parameters/events_dfl_poll_msecs
或者 sudo 友好版本:
echo 2000 | sudo tee -a /sys/module/block/parameters/events_dfl_poll_msecs
我假设在 Ubuntu 初始化期间已经设置了这一点,或者他们可能直接用他们自己的默认值修补 kernel.org 源。