更新一

更新一

我希望这里有人可以帮助我了解 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 源。

相关内容