SDB:SCSI 调试提示
SCSI 调试
关于 SCSI 调试的一些有用信息可以在这里找到。
scsi_logging_level
SCSI 子系统有一个通用的日志记录机制,可以通过写入以下地址来启用:
/proc/sys/dev/scsi/logging_level
这是一个_通用_日志记录机制,即无法将其限制到单个设备或 HBA。但是,它有几个不同的日志记录区域,可以单独选择。这些区域中的每一个都跨越日志级别值中的 3 位字段。
定义可以在以下位置找到:
drivers/scsi/scsi_logging.h
可能的区域是:
- ERROR
- 由任何需要通过 SCSI 错误处理机制重试/恢复的命令使用
- TIMEOUT
- 由 drivers/scsi/sg.c 使用
- SCAN
- 在设备扫描期间使用,即每当初始化新设备/HBA 时
- MLQUEUE
- 中间层队列;请求正在从块层队列中提取并提交到 HBA
- MLCOMPLETE
- 中间层队列;请求正在由 HBA 完成,结果正在推回块层
- LLQUEUE
- 低层队列;未使用
- LLCOMPLETE
- 低层队列;未使用
- HLQUEUE
- 高层队列;drivers/scsi/sd.c 中的命令准备
- HLCOMPLETE
- 高层队列;drivers/scsi/sd.c 中的命令完成
- IOCTL
- SCSI IOCTL 日志记录
详细的错误级别描述
ERROR
当命令通过 SCSI 错误处理机制恢复时,记录错误。使用以下级别:
- 错误处理程序线程统计信息
- 错误处理程序命令统计信息
- 错误处理程序命令日志记录
- 未使用
- 错误处理程序命令详细信息
- 以及更高:未使用
SCAN
在 HBA/目标扫描期间的日志记录。使用以下级别:
- 记录不寻常的设备,其中 LUN 0 的 pqual 为 3
- 记录 pqual 为 3 的设备
- 记录在扫描期间发送的 SCSI 命令
- 以及更高:未使用。
MLQUEUE
MLQUEUE 区域用于命令从块层队列中提取并发送到 HBA 时。它具有以下级别:
- 无 (匹配完成)
- 记录所有命令的操作码 + 命令
- 与 2 相同,以及转储 cmd 地址
- 与 3 相同,以及转储额外的垃圾数据
- 以及更高:未使用
MLCOMPLETE
记录来自 HBA 的命令完成情况,在为块层请求调用完成情况之前。它具有以下级别:
- 记录 disposition、结果、操作码 + 命令,以及对于失败或非 SUCCESS disposition,有条件地记录 sense 数据。
- 与 1 相同,但适用于所有命令完成情况。
- 与 2 相同,以及转储 cmd 地址
- 与 3 相同,以及转储额外的垃圾数据
- 以及更高:未使用
从 SLES10 SP2 开始,有一个命令 'scsi_logging_level',允许您设置区域和级别,而无需手动计算位偏移量,如果您想启用 0xffffffff 以外的日志级别,这将非常方便。
不陷入日志记录细节的日志级别的一个有用设置是 ERROR=3, SCAN=3, MLQUEUE=2, MLCOMPLETE=2,其计算结果为:
echo 9411 > /proc/sys/dev/scsi/logging_level
光纤通道上的 SCSI 重新扫描
SCSI 总线上的设备检测在两个级别上工作;在第一个级别,HBA 检测目标(使用 HBA/传输特定的方法),之后 SCIS 中间层扫描每个目标以获取呈现的 LUN。在光纤通道上,(SCSI) 目标映射到 FC 端口。因此,目标的扫描实际上是扫描可见的 FC 端口。
光纤通道拓扑
连接到光纤通道 SAN 的 HBA 设备可能以两种不同的模式运行:仲裁环 (AL) 或 交换结构 (SW)。SW 模式专为交换机到交换机的通信而设计,因此它了解 NameServers 等。SW 模式下的扫描需要查询织物名称服务器,解析结果,检查每个结果端口等。另一方面,AL 模式是一种简化,因为它假定所有远程端口都在一个环中,因此通过查询每个可能的环 ID,将检测环中的所有设备。此初始化例程称为 环初始化过程 (LIP)。
由于 SW 模式在互操作性方面存在一些问题,所有 linux FC 驱动程序(zfcp 驱动程序除外)都以 AL 模式运行。
环初始化过程 (LIP)
每当需要更新现有的 SAN 信息时,就会触发 LIP。最明显的情况是在启动期间,因为那时驱动程序需要检测可用的端口。
在操作过程中,应在 SAN 配置发生更改时触发 LIP。但是,具体取决于交换机配置,情况可能并非如此。原因是触发 LIP 是一项破坏性操作,会导致所有远程端口重新配置。在此期间,连接到 HBA 的端口上的所有 I/O 都会暂停。LIP 完成后,I/O 将恢复(如果端口仍然存在)或如果远程端口不再可见,则 I/O 将保持暂停。在这种情况下,将启动 dev_loss_tmo 定时器和 fast_io_fail_tmo 定时器(如果存在)。它们负责将远程端口从系统中删除或停止远程端口上的所有 I/O。由于这是一个完整的初始化,远程端口将被重置。
由于此原因,大多数 FC 交换机允许进行配置,在这种配置中,当 SAN 配置发生更改时,不会自动启动 LIP。
rescan-scsi-bus.sh
由于通常不会在 SAN 配置发生更改时触发 LIP,因此 rescan-scsi-bus.sh 具有一个开关 -i|--issue-lip,该开关将在指定的 HBA 上触发 LIP。必须注意此选项的后果,最重要的是设备重置。