为什么 Linux 将 NVMe 驱动器列为 /dev/nvme0 而不是 /dev/sda?

为什么 Linux 将 NVMe 驱动器列为 /dev/nvme0 而不是 /dev/sda?

最近,我在 Linux 计算机中安装了一个 NVMe 驱动器,我注意到它被列为,/dev/nvme0其分区为/dev/nvme0p1。我知道它与 SATA 驱动器的接口不同,但为什么会这样列出呢?似乎调用驱动器/dev/sd$LETTER$PARTITIONNUMBER是标准,即使有其他标准,如 SCSI,这打破了这一标准,因为它使用数字而不是字母来表示驱动器,并在分区号前加上 ap,此外还有不同的名称。

答案1

/dev/sd最初用于使用sd-bus驱动程序的设备,该驱动程序是 SCSI 设备的驱动程序(sd字面意思是 SCSI 磁盘)。现在它用于 SCSI 磁盘、SATA 磁盘和 USB 磁盘。原因似乎是现在几乎所有设备都在非 SCSI 总线上使用 SCSI 命令协议(内核使用 libata 平等对待所有 ATA 设备,并假装它们是 SCSI 设备 - 感谢 @grawity),因此我们将所有这些设备视为/dev/sd

但并非所有存储设备都是/dev/sd/dev/hd并且/dev/xvd仍在使用 - 前者用于 PATA/IDE 磁盘,后者用于云存储设备(虚拟磁盘等),它们都有不同的驱动程序和命名。您看不到它们,因为虚拟存储仅存在于云/虚拟机管理程序上(您可能不使用任何虚拟存储),并且因为 PATA/IDE 磁盘越来越少见,并且在大多数现代机器上,内核实际上使用ide-scsi驱动程序将其转换为 SCSI 协议(感谢@Wumpus Q. Wumbley)。

其他示例包括/dev/mmcblkXpY用于 SD/eMMC/裸 NAND/NOR 设备且具有与云存储中的虚拟磁盘相同的命名方案/dev/nvme/dev/vd感谢@Jan Dorniak 提供的额外示例)。


在你的情况下,之所以这样称呼,是/dev/nvme因为磁盘通过 NVME 端口连接并使用nvmeLinux 上的驱动程序。您可以将其视为/dev/<something>使用驱动程序的设备<something>。所有设备驱动程序和命名都有自己的标准,并不是所有设备都有一个标准,因此如果 NVME 设备的命名是那样的,那是完全可以的。而为什么nvme没有翻译成scsi,是因为这两个协议太不一样了,这样的实现会太复杂(有关更多详细信息,请参阅 @grawity 和 @Vality 的评论)。

答案2

除了其他答案之外,请注意,NVMe 具有命名空间的概念,它不适合/dev/sd<字母><数字>模式。例如,在我的系统上:

$ ls -1 /dev/nvme*
/dev/nvme0
/dev/nvme0n1
/dev/nvme0n1p1
/dev/nvme0n1p2

相关内容