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

61 linux hard-drive partitioning

最近我在我的 Linux 计算机上安装了一个 NVMe 驱动器,我注意到它被列为/dev/nvme0并且它的分区是/dev/nvme0p1. 我知道它与 SATA 驱动器的接口不同,但它以这种方式列出的原因是什么?似乎调用驱动器/dev/sd$LETTER$PARTITIONNUMBER是标准,即使事物具有不同的标准,例如 SCSI,这通过使用数字而不是字母来表示驱动器和分区号之前的 ap 以及不同的名称来打破这一点。

Fan*_*que 75

/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 的评论以获取更多详细信息)。


Rom*_*sky 11

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

$ ls -1 /dev/nvme*
/dev/nvme0
/dev/nvme0n1
/dev/nvme0n1p1
/dev/nvme0n1p2
Run Code Online (Sandbox Code Playgroud)

  • @Criggie确实有可能,找到这样的设置真的很少见。也就是说,虽然它_可以_表示为另一个磁盘,但这增加了其他更复杂的问题(即,将这些磁盘映射回实际的 NVMe 设备,以及某些 NVMe 设备可以在线重新配置命名空间的事实)。 (2认同)