Why does Linux list NVMe drives as /dev/nvme0 instead of /dev/sda?

/dev/sd was originally used for devices using the sd-bus driver, which is the driver for SCSI devices (and sd literally stands for SCSI disk). Nowadays it is used for SCSI disks, SATA disks, and USB disks. The reason seems to be that now almost all devices use the SCSI command protocol on top of non-SCSI bus (the kernel treats all ATA-devices equally using libata and it pretends they're SCSI devices - credit to @grawity), and therefore we see all of these devices as /dev/sd.

But not all storage devices are /dev/sd. /dev/hd and /dev/xvd are still used - the former for PATA/IDE disks and the latter for cloud storage devices (virtual disks and etc.) and they all have different drivers and naming. You don't see them because virtual storage is only on clouds / hypervisors (and you probably don't use any) and because PATA/IDE disks are becoming more and more rare and on most modern machines the kernel actually uses ide-scsi driver to translate it to SCSI protocol (credit to @Wumpus Q. Wumbley).

Other examples include /dev/mmcblkXpY which is for SD/eMMC/bare NAND/NOR devices and has the same naming scheme as /dev/nvme and /dev/vd which is again used for virtual disks in cloud storage (credit to @Jan Dorniak for the extra examples).


In your case, it is called /dev/nvme because the disk is connected through an NVME port and uses the nvme driver on Linux. You can just think of /dev/<something> as a device that uses <something> driver. All device drivers and namings have their own standards, it's not one standard for all of them, so it's completely okay if the naming for NVME devices is like that. And the reason why nvme isn't translated to scsi as well is that the two protocols are too different and such an implementation would be too complex (refer to the comments by @grawity and @Vality for more detailed info).


In addition to the other answer, note that NVMe has the concept of namespaces that would not fit in the /dev/sd<letter(s)><number> pattern. For example, on my system:

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