You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

关于Linux SCSI子系统驱动非关联硬件及NVMe、PATA未纳入该子系统的技术问询

Linux为何用SCSI子系统驱动SATA/USB存储,而NVMe、PATA却不在其中?

这个问题问到了Linux存储子系统设计的核心逻辑,咱们一步步拆解来看:

为什么SATA、USB Mass Storage会走SCSI子系统?

说白了就是不想重复造轮子。SCSI命令集早在上世纪就被设计得非常通用、灵活,能覆盖绝大多数块存储设备的读写、管理需求。Linux内核的SCSI子系统本身是分层架构的:

  • 上层是统一的块设备抽象层,负责和文件系统、用户空间交互;
  • 下层是各种“适配层”,把不同硬件的原生命令转换成SCSI命令。

SATA设备通过libata驱动层,把ATA命令转成SCSI兼容命令;USB存储设备则通过usb-storage驱动,把USB Mass Storage类的命令转成SCSI命令。这样一来,所有这些设备都能复用SCSI子系统成熟的上层逻辑——比如磁盘分区管理、I/O调度、错误处理这些,不用每个硬件类型都单独写一套,大大减少了代码冗余,也降低了维护成本。

为什么NVMe没纳入SCSI子系统?

NVMe是专门为PCIe接口的SSD量身定做的标准,它的命令集和SCSI完全不是一个路子:

  • NVMe的命令集更轻量化,针对闪存的随机读写特性做了深度优化,支持并行队列、低延迟操作,这些都是SCSI命令集没法原生支持的;
  • 而且NVMe本身的架构就是为高性能设计的,直接实现一套独立的子系统(nvme驱动),能更直接地利用PCIe的高速特性,不需要经过SCSI的适配层做转换,性能损耗更小。

简单说,SCSI那套老架构跟不上NVMe的性能需求,单独搞一套更划算。

为什么PATA也没在SCSI子系统里?

这是历史包袱+技术差异共同作用的结果:

  • PATA(也就是老IDE)比SCSI出现得更早,Linux内核一开始就有专门的IDE子系统来支持它,很多旧硬件的驱动逻辑已经沉淀了几十年;
  • 虽然后来libata也能支持PATA,把ATA命令转成SCSI命令,但PATA的命令集和SCSI差异不小,而且随着SATA普及,PATA逐渐被淘汰,内核开发者没必要花大力气把它完全整合进SCSI子系统,保留原有IDE驱动或者通过libata做兼容就足够了。

备注:内容来源于stack exchange,提问作者mcendu

火山引擎 最新活动