【问题标题】:How does a rescan LUN on Linux worksLinux 上的重新扫描 LUN 如何工作
【发布时间】:2016-12-19 07:05:40
【问题描述】:

我们可以在 Linux 主机上发出主机总线扫描以获取主机上的 /dev/sd* 设备。
使用此命令发出扫描:
echo "- - -" > /sys/class/scsi_host/host0/scan

有人可以告诉我 Linux 用户空间/内核代码中导致在 scsi 扫描后形成 /dev/sd* 设备的事件流吗?

这是发送到存储控制器的 PCI 总线扫描或 SCSI 命令还是新的东西?

【问题讨论】:

    标签: linux linux-kernel storage scsi


    【解决方案1】:

    查看了 iscsid 扫描如何工作的代码。 __scsi_scan_target 是进行 SCSI 扫描的关键函数。 此函数首先尝试使用 scsi_probe_and_add_lun 函数探测和添加 LUN 0。

    Dec 24 03:24:28 localhost kernel: [<ffffffff813e8c94>] scsi_probe_and_add_lun+0x3f4/0xc80
    Dec 24 03:24:28 localhost kernel: [<ffffffff815e5a51>] ? printk+0x77/0x8e
    Dec 24 03:24:28 localhost kernel: [<ffffffff813e9a0e>] __scsi_scan_target+0x13e/0x270
    Dec 24 03:24:28 localhost kernel: [<ffffffff813e9c30>] scsi_scan_target+0xf0/0x110
    Dec 24 03:24:28 localhost kernel: [<ffffffffa050eedf>] iscsi_user_scan_session.part.13+0x10f/0x150 [scsi_transport_iscsi]
    Dec 24 03:24:28 localhost kernel: [<ffffffffa050ef20>] ? iscsi_user_scan_session.part.13+0x150/0x150 [scsi_transport_iscsi]
    Dec 24 03:24:28 localhost kernel: [<ffffffffa050ef41>] iscsi_user_scan_session+0x21/0x30 [scsi_transport_iscsi]
    Dec 24 03:24:28 localhost kernel: [<ffffffff813b1b63>] device_for_each_child+0x53/0x90
    Dec 24 03:24:28 localhost kernel: [<ffffffffa050cb6c>] iscsi_user_scan+0x3c/0x60 [scsi_transport_iscsi]
    Dec 24 03:24:28 localhost kernel: [<ffffffff813eb835>] store_scan+0xa5/0x100
    Dec 24 03:24:28 localhost kernel: [<ffffffff813b1138>] dev_attr_store+0x18/0x30
    Dec 24 03:24:28 localhost kernel: [<ffffffff81225686>] sysfs_write_file+0xc6/0x140
    Dec 24 03:24:28 localhost kernel: [<ffffffff811afa7d>] vfs_write+0xbd/0x1e0
    Dec 24 03:24:28 localhost kernel: [<ffffffff811b04c8>] SyS_write+0x58/0xb0
    Dec 24 03:24:28 localhost kernel: [<ffffffff815fc9d9>] system_call_fastpath+0x16/0x1b
    



    scsi_probe_and_add_lun 函数将:
    1.分配scsi_device数据结构
    2. 调用 scsi_probe_lun 并将 SCSI 查询发送到 LUN 0。
    3. 调用 scsi_add_lun 来填充完成查询的 scsi_device 数据结构。
    此数据结构是使用 scsi_sysfs_add_sdev 函数添加的。

    然后它尝试发送 SCSI 报告 LUN 命令以获取函数 scsi_report_lun_scan 中的 LUN 数量。此函数查找 LUN 的数量并再次尝试使用 scsi_probe_and_add_lun 函数添加所有 LUN。

    scsi_sysfs_add_sdev函数通过为scsi_device调用scsi_target_add和device_add来添加设备。

    此 device_add 调用驱动程序的探测函数 (sd_probe)

    Dec 24 03:24:28 localhost kernel: [<ffffffffa01d77d0>] sd_probe+0x320/0x380 [sd_mod]
    Dec 24 03:24:28 localhost kernel: [<ffffffff813b6917>] driver_probe_device+0x87/0x390
    Dec 24 03:24:28 localhost kernel: [<ffffffff813b6c20>] ? driver_probe_device+0x390/0x390
    Dec 24 03:24:28 localhost kernel: [<ffffffff813b6c5b>] __device_attach+0x3b/0x40
    Dec 24 03:24:28 localhost kernel: [<ffffffff813b477b>] bus_for_each_drv+0x6b/0xb0
    Dec 24 03:24:28 localhost kernel: [<ffffffff813b6818>] device_attach+0x88/0xa0
    Dec 24 03:24:28 localhost kernel: [<ffffffff813b5b18>] bus_probe_device+0x98/0xc0
    Dec 24 03:24:28 localhost kernel: [<ffffffff813b3584>] device_add+0x4c4/0x7a0
    Dec 24 03:24:28 localhost kernel: [<ffffffff813c2ebc>] ? __pm_runtime_resume+0x5c/0x80
    Dec 24 03:24:28 localhost kernel: [<ffffffff813eba9c>] scsi_sysfs_add_sdev+0xac/0x320
    Dec 24 03:24:28 localhost kernel: [<ffffffff813e9317>] scsi_probe_and_add_lun+0xa77/0xc80
    Dec 24 03:24:28 localhost kernel: [<ffffffff815eceff>] scsi_report_lun_scan+0x39a/0x5f1
    Dec 24 03:24:28 localhost kernel: [<ffffffff813e9a24>] __scsi_scan_target+0x154/0x270
    Dec 24 03:24:28 localhost kernel: [<ffffffff813e9c30>] scsi_scan_target+0xf0/0x110
    Dec 24 03:24:28 localhost kernel: [<ffffffffa050eedf>] iscsi_user_scan_session.part.13+0x10f/0x150 [scsi_transport_iscsi]
    Dec 24 03:24:28 localhost kernel: [<ffffffffa050ef20>] ? iscsi_user_scan_session.part.13+0x150/0x150 [scsi_transport_iscsi]
    Dec 24 03:24:28 localhost kernel: [<ffffffffa050ef41>] iscsi_user_scan_session+0x21/0x30 [scsi_transport_iscsi]
    Dec 24 03:24:28 localhost kernel: [<ffffffff813b1b63>] device_for_each_child+0x53/0x90
    Dec 24 03:24:28 localhost kernel: [<ffffffffa050cb6c>] iscsi_user_scan+0x3c/0x60 [scsi_transport_iscsi]
    Dec 24 03:24:28 localhost kernel: [<ffffffff813eb835>] store_scan+0xa5/0x100
    Dec 24 03:24:28 localhost kernel: [<ffffffff813b1138>] dev_attr_store+0x18/0x30
    Dec 24 03:24:28 localhost kernel: [<ffffffff81225686>] sysfs_write_file+0xc6/0x140
    Dec 24 03:24:28 localhost kernel: [<ffffffff811afa7d>] vfs_write+0xbd/0x1e0
    Dec 24 03:24:28 localhost kernel: [<ffffffff811b04c8>] SyS_write+0x58/0xb0
    Dec 24 03:24:28 localhost kernel: [<ffffffff815fc9d9>] system_call_fastpath+0x16/0x1b
    

    linux-3.14.69\drivers\scsi\sd.c

    这个 sd_probe 函数分配磁盘并启动线程 sd_probe_async

    async_schedule_domain(sd_probe_async, sdkp, &scsi_sd_probe_domain);
    

    sd_probe_async 调用 add_disk 并打印消息: "附加的 SCSI %sdisk"

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    相关资源
    最近更新 更多