为什么CentOS将ATA总线转换为scsi总线?

JM *_* D. 5 centos qemu

我使用 libvirt + qemu 来启动带有 IDE 总线磁盘的虚拟机

libvirt 中的设备:

<disk type='network' device='disk'>
  <driver name='qemu' type='raw' cache='none' io='native'/>
  <source protocol='iscsi' name='xxx'>
    <host name='127.0.0.1' port='xxx'/>
  </source>
  <target dev='hdb' bus='ide'/>
  <boot order='3'/>
  <alias name='ide0-0-1'/>
  <address type='drive' controller='0' bus='0' target='0' unit='1'/>
</disk>
Run Code Online (Sandbox Code Playgroud)

在 qemu 中:

-drive file.driver=iscsi,file.portal=127.0.0.1:xxx,file.target=xxx,file.lun=xxx,file.transport=tcp,format=raw,if=none,id=drive-ide0-0-1,cache=none,aio=native
-device ide-hd,bus=ide.0,unit=1,drive=drive-ide0-0-1,id=ide0-0-1,bootindex=3,write-cache=on
Run Code Online (Sandbox Code Playgroud)

来宾操作系统是 CentOS-7.9-x86_64-DVD-2009

启动后,dmesg 中显示

May 18 06:07:37 localhost kernel: ata1: PATA max MWDMA2 cmd 0x1f0 ctl 0x3f6 bmdma 0xd120 irq 14
May 18 06:07:37 localhost kernel: ata2: PATA max MWDMA2 cmd 0x170 ctl 0x376 bmdma 0xd128 irq 15
May 18 09:15:54 localhost kernel: ata1.00: ATAPI: QEMU DVD-ROM, 2.5+, max UDMA/100
May 18 09:15:54 localhost kernel: ata1.01: ATA-7: QEMU HARDDISK, 2.5+, max UDMA/100
May 18 09:15:54 localhost kernel: ata1.01: 6291456 sectors, multi 16: LBA48
May 18 09:15:54 localhost kernel: ata1.00: configured for MWDMA2
May 18 09:15:54 localhost kernel: ata1.01: configured for MWDMA2
May 18 09:15:54 localhost kernel: scsi 0:0:0:0: CD-ROM            QEMU     QEMU DVD-ROM     2.5+ PQ: 0 ANSI: 5
May 18 09:15:54 localhost kernel: scsi 0:0:1:0: Direct-Access     ATA      QEMU HARDDISK    2.5+ PQ: 0 ANSI: 5
May 18 09:15:54 localhost kernel: sr 0:0:0:0: [sr0] scsi3-mmc drive: 4x/4x cd/rw xa/form2 tray
May 18 09:15:54 localhost kernel: cdrom: Uniform CD-ROM driver Revision: 3.20
May 18 09:15:54 localhost kernel: sd 0:0:1:0: [sda] 6291456 512-byte logical blocks: (3.22 GB/3.00 GiB)
May 18 09:15:54 localhost kernel: sd 0:0:1:0: [sda] Write Protect is off
May 18 09:15:54 localhost kernel: sd 0:0:1:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
May 18 09:15:54 localhost kernel: sd 0:0:1:0: [sda] Attached SCSI disk
Run Code Online (Sandbox Code Playgroud)

并在 lshw 中显示

[root@localhost ~]# lshw -class disk
  *-cdrom                   
       description: DVD reader
       product: QEMU DVD-ROM
       vendor: QEMU
       physical id: 0.0.0
       bus info: scsi@0:0.0.0
       logical name: /dev/cdrom
       logical name: /dev/sr0
       version: 2.5+
       capabilities: removable audio dvd
       configuration: ansiversion=5 status=ready
     *-medium
          physical id: 0
          logical name: /dev/cdrom
          capabilities: partitioned partitioned:dos
          configuration: signature=6b8b4567
  *-disk
       description: ATA Disk
       product: QEMU HARDDISK
       physical id: 0.1.0
       bus info: scsi@0:0.1.0
       logical name: /dev/sda
       version: 2.5+
       serial: 918a6997-1928-38a1-9
       size: 3GiB (3221MB)
       configuration: ansiversion=5 logicalsectorsize=512 sectorsize=512
Run Code Online (Sandbox Code Playgroud)

为什么CentOS要将ATA总线转换为scsi总线?在哪里可以看到更相关的描述?

Ste*_*itt 8

这就是 Linux 内核处理并行 ATA (IDE) 和串行 ATA (SATA) 的方式。最初,有一套 IDE 专用的驱动程序,IDE 驱动程序出现了诸如此类。hda但是当 Serial ATA 出现时,Jeff Garzik 决定使用内核中现有的 SCSI中间层;给出了很多理由,特别是:

\n
\n
    \n
  • 许多优点都源于scsi中间层的存在。它代表我们做了很多工作,让我能够\n完全专注于 ATA 命令协议(PIO 输入、PIO 输出、DMA 等)\n。
  • \n
\n

[\xe2\x80\xa6]

\n
    \n
  • 串行 ATA 即将出现。设备和主机控制器 SATA 实现确实适合
    SCSI 中已经存在一段时间的行为。SATA 甚至定义了 SCSI\n机箱服务的使用。

    \n
  • \n
  • Linux SCSI 层处理热插拔,并且更加模块化。它已经重新计数了设备和 sysfs 等。从头开始创建新的块设备驱动程序意味着处理所有这些小细节。

    \n
  • \n
  • SCSI 做基本的错误恢复和队列控制已经有一段时间了。
    即将推出的 SATA2 以及ATA TCQ(如果我有时间实现后者)都将从中受益匪浅。

    \n
  • \n
  • ATAPI 类似于 SCSI。

    \n
  • \n
\n
\n

结果是libata,它提供了对 ATA 设备的支持,并通过 SCSI 中间层将它们呈现为 SCSI 驱动器。最初,这涵盖了 SATA 设备和一些 Intel PATA 控制器(尽管据我所知,后者仍然默认使用旧的 IDE 设备驱动程序)。

\n

几年后,libata 得到扩展以支持大多数 PATA 控制器,并且大多数 IDE 设备最终被作为 SCSI 设备处理。旧版 IDE 驱动程序已于 2021 年删除

\n