关于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




