How to Check Disk Type in Linux: HDD, SSD, NVMe and SATA

Deepak Prasad
Tested on RHEL 10.2 (Coughlan)
Package util-linux 2.40.2-18.el10 (lsblk)
pciutils 3.13.0-6.el10 (lspci)
parted 3.6-7.el10
hdparm 9.65-6.el10
smartmontools 7.4-9.el10 (smartctl)
nvme-cli 2.16-2.el10 (nvme)
Applies to RHEL, Rocky Linux, AlmaLinux, Oracle Linux, CentOS Stream, Fedora, Debian, Ubuntu, and other Linux distributions with util-linux
Privilege Normal user for lsblk and sysfs reads; sudo for fdisk, parted, lshw, hdparm, and smartctl
Scope Check whether a disk is HDD or SSD, identify NVMe/SATA/SAS/USB transport, read model and serial, and spot when VMs, RAID, or SAN hide physical media. Short notes on partition table and filesystem type only. Does not cover performance tuning or SMART remediation.
Related guides Disk interface types in Linux
Check filesystem type
parted command
Backup partition table with sfdisk
Change I/O scheduler

Linux exposes several layers of storage information — media type, transport, model, partition table, and filesystem — and they are easy to mix up. This guide focuses on the commands that answer whether a disk is HDD or SSD, whether it is NVMe or SATA, and what model Linux actually sees.

The examples below were run on a VirtualBox VM on RHEL 10.2. Disk names, models, and ROTA values on your host will differ on bare metal, cloud instances, hardware RAID, or SAN storage.


Quick reference: check disk type in Linux

Task Command
HDD vs SSD and transport lsblk -d -e 7 -o NAME,TYPE,SIZE,ROTA,TRAN,MODEL,SERIAL
Rotational flag (sysfs) cat /sys/block/sda/queue/rotational
udev bus and model udevadm info --query=property --name=/dev/sda
Stable disk IDs ls -l /dev/disk/by-id
Storage controllers lspci | grep -Ei 'sata|scsi|raid|nvme|storage|ide|fibre'
Hardware storage tree sudo lshw -class storage -class disk -short
ATA identify data sudo hdparm -I /dev/sda
NVMe namespaces nvme list
Partition table (if needed) sudo fdisk -l /dev/sda

Read the output like this:

  • TYPE disk — block devices to use for HDD vs SSD checks (ignore rom and other non-disk types)
  • ROTA 1 on a disk — kernel reports rotational (normally HDD)
  • ROTA 0 on a disk — kernel reports non-rotational (normally SSD or flash-backed storage)
  • TRAN — transport when exposed (sata, sas, nvme, usb, and others)

ROTA describes the kernel's rotational classification, not a guaranteed physical media label. Optical drives can show ROTA=0, and virtual disks, RAID, and SAN volumes can hide the real media underneath.


Disk type terms you should know

Term What it tells you Example
Disk device Linux block device name /dev/sda, /dev/nvme0n1
Media type Rotational vs non-rotational HDD vs SSD (from ROTA / sysfs)
Interface or transport How the disk is attached SATA, SAS, NVMe, USB
Controller PCI or virtual storage controller SATA AHCI, NVMe, RAID HBA
Partition table GPT or MBR layout Separate from HDD vs SSD
Filesystem Format inside a partition ext4, XFS — see check filesystem type

For a longer explanation of SATA, SAS, NVMe, and Fibre Channel, see disk interface types in Linux.


Check if a disk is HDD or SSD with lsblk

lsblk is the best first command because it combines the kernel's block-device information with udev metadata, letting you see rotational status, transport, model, and device type in one output. -d lists top-level devices only; -e 7 excludes loop devices.

bash
lsblk -d -e 7 -o NAME,TYPE,SIZE,ROTA,TRAN,MODEL
output
NAME TYPE  SIZE ROTA TRAN   MODEL
sda  disk   30G    1 sata   VBOX HARDDISK
sdb  disk   10G    1 sata   VBOX HARDDISK
sr0  rom  1024M    0 ata    VBOX CD-ROM

How to read the columns:

  • For HDD/SSD classification, concentrate on rows where TYPE is disk
  • ROTA 1 on a disk — kernel reports rotational storage; normally HDD
  • ROTA 0 on a disk — kernel reports non-rotational storage; normally SSD or flash-backed storage
  • TRAN — transport when Linux exposes it (sata, nvme, usb, and others)

The flag itself only reports the kernel's rotational classification. sr0 is an optical drive with ROTA=0 — not flash storage. Virtual disks on this VM report ROTA=1 even when the host may use SSD storage underneath; see the VM/RAID section below.

Add SERIAL when you need identifiers in the same pass:

bash
lsblk -d -e 7 -o NAME,TYPE,SIZE,ROTA,TRAN,MODEL,SERIAL

Check HDD or SSD from /sys/block/.../rotational

The ROTA column comes from the kernel block-device rotational attribute:

bash
cat /sys/block/sda/queue/rotational
output
1
  • 0 — device reported as non-rotational
  • 1 — device reported as rotational

To compare several disks at once:

bash
for disk in sda sdb sr0; do printf "%s=%s\n" "$disk" "$(cat /sys/block/$disk/queue/rotational)"; done
output
sda=1
sdb=1
sr0=0

The limitation is the same as with lsblk: the value is only as accurate as the storage layer presented to the kernel. For a disk device, ROTA=1 normally indicates an HDD and ROTA=0 normally indicates SSD or flash-backed storage — but optical, virtual, RAID, and other block devices can make that shorthand misleading.


Check NVMe, SATA, SAS, or USB interface type

Start with TRAN from lsblk:

bash
lsblk -d -o NAME,ROTA,TRAN,MODEL

NVMe namespaces usually appear as nvme0n1, nvme1n1, and similar names with TRAN nvme. SATA and SAS disks often show up as sdX with TRAN sata or sas.

When TRAN is empty or you need udev properties, filter udevadm output:

bash
udevadm info --query=property --name=/dev/sda | grep -E '^(DEVTYPE|ID_BUS|ID_MODEL|ID_SERIAL|ID_ATA|ID_TYPE|ID_PATH)='
output
DEVTYPE=disk
ID_ATA=1
ID_TYPE=disk
ID_BUS=ata
ID_MODEL=VBOX_HARDDISK
ID_SERIAL=VBOX_HARDDISK_VBa05c0dfc-76f70818
ID_PATH=pci-0000:00:0d.0-ata-1.0

ID_BUS=ata identifies the ATA device family; it is not by itself proof that the physical interface is SATA. Prefer lsblk TRAN or controller information when you specifically need SATA versus another ATA transport. On NVMe systems, install nvme-cli and list namespaces:

bash
nvme list

On this test host there are no NVMe devices, so nvme list prints only the header row. On a machine with NVMe drives, the same command shows device node, serial, model, and namespace size.


Check disk model and serial number

lsblk already exposes model and serial on many systems:

bash
lsblk -d -e 7 -o NAME,SIZE,TRAN,MODEL,SERIAL

/dev/disk/by-id also exposes persistent identifiers when you need to match the model or serial to a stable device path:

bash
ls -l /dev/disk/by-id | sed -n '1,6p'
output
total 0
lrwxrwxrwx. 1 root root  9 Aug 16 13:49 ata-VBOX_CD-ROM_VB0-01f003f6 -> ../../sr0
lrwxrwxrwx. 1 root root  9 Aug 16 13:49 ata-VBOX_HARDDISK_VBa05c0dfc-76f70818 -> ../../sda
lrwxrwxrwx. 1 root root 10 Aug 16 13:49 ata-VBOX_HARDDISK_VBa05c0dfc-76f70818-part1 -> ../../sda1
lrwxrwxrwx. 1 root root 10 Aug 16 13:49 ata-VBOX_HARDDISK_VBa05c0dfc-76f70818-part2 -> ../../sda2
lrwxrwxrwx. 1 root root 10 Aug 16 13:49 ata-VBOX_HARDDISK_VBa05c0dfc-76f70818-part3 -> ../../sda3

The ata- prefix identifies the ATA-style persistent ID exported for these virtual disks; use TRAN, controller data, or the sysfs path when you specifically need the physical transport.


Check storage controller and physical hardware

When lsblk TRAN is missing or storage sits behind a controller, inspect PCI devices:

bash
lspci | grep -Ei 'sata|scsi|raid|nvme|storage|ide|fibre'
output
00:01.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
00:0d.0 SATA controller: Intel Corporation 82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [AHCI mode] (rev 02)

lspci identifies storage controllers present in the machine, but by itself does not map a particular /dev/sdX device to one controller. Use udevadm, lshw, or the device's sysfs path when that mapping matters.

lshw adds a hardware-oriented view of controllers and disks:

bash
sudo lshw -class storage -class disk -short
output
H/W path          Device      Class       Description
=====================================================
/0/100/1.1        scsi2       storage     82371AB/EB/MB PIIX4 IDE
/0/100/1.1/0.0.0  /dev/cdrom  disk        CD-ROM
/0/100/d          scsi0       storage     82801HM/HEM (ICH8M/ICH8M-E) SATA Controller [AHCI mode]
/0/100/d/0        /dev/sda    disk        32GB VBOX HARDDISK
/0/100/d/1        /dev/sdb    disk        10GB VBOX HARDDISK

lshw may show scsi in the path for SATA controllers because Linux presents many ATA/SATA disks through the SCSI disk layer — that path label is not proof of physical SCSI media.


Check disk details with smartctl, hdparm, or nvme

Pick a tool by device type:

Storage Useful tool
ATA/SATA hdparm -I, smartctl -a
SAS/SCSI smartctl -a
NVMe nvme list, nvme id-ctrl, smartctl -a
Generic or virtual lsblk, sysfs, udevadm

hdparm -I reads ATA IDENTIFY data when the device and driver expose it, which commonly includes SATA disks and some virtual ATA devices:

bash
sudo hdparm -I /dev/sda
output
/dev/sda:

ATA device, with non-removable media
	Model Number:       VBOX HARDDISK
	Serial Number:      VBa05c0dfc-76f70818
	Firmware Revision:  1.0
Standards:
	Used: ATA/ATAPI-6 published, ANSI INCITS 361-2002

On physical SATA disks, smartctl -a can also show a Rotation Rate line (Solid State Device or an RPM value). VirtualBox disks on this host lack SMART support, so smartctl exits with a mandatory-command error — that is expected on many VMs. hdparm is for ATA/SATA devices and should not be used for NVMe. For NVMe, nvme-cli provides the most complete controller and namespace information, while smartctl -a can also read NVMe identification and SMART/health data.


Why disk type can be misleading on VMs, RAID, and SAN

Linux can only report what the storage layer exposes. Common cases where ROTA, MODEL, or TRAN mislead:

  • VirtualBox, VMware, KVM, and cloud volumes that present a generic virtual disk
  • Hardware RAID logical volumes that hide individual spindles
  • SAN or iSCSI LUNs seen as a single block device
  • USB enclosures that do not pass through rotational information

ROTA=0 means the kernel classifies the device as non-rotational — not that every physical drive underneath is flash. Likewise, ROTA=1 on a VM does not prove the host uses HDDs. Combine lsblk, sysfs, udevadm, and controller tools, and treat the answer as what the guest OS can see.

For abstraction examples, see software RAID and iSCSI target and initiator guides when disks are layered behind RAID or network storage.


Check filesystem or partition table type if needed

Partition table type (GPT vs MBR) and filesystem type (ext4 vs XFS) are separate from HDD vs SSD or SATA vs NVMe.

To see mount points and filesystem types briefly:

bash
lsblk -f -e 7

For full filesystem identification, use commands to check filesystem type in Linux. When you only need the partition table label:

bash
sudo fdisk -l /dev/sda
output
Disk /dev/sda: 30.01 GiB, 32223150080 bytes, 62935840 sectors
Disk model: VBOX HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 8738C2F4-5788-48F7-9DDC-5A3B38B5DAEC

parted shows the same GPT layout and illustrates the SCSI presentation quirk:

bash
sudo parted -s /dev/sda print
output
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 32.2GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

The Model: ATA … (scsi) line is normal for SATA disks accessed through the SCSI layer — it does not change the GPT vs MBR question. For partition edits, see parted command in Linux; for partition-table backup, see sfdisk dump and restore.


Summary

To check disk type in Linux, start with lsblk -d -e 7 -o NAME,TYPE,SIZE,ROTA,TRAN,MODEL. Read ROTA on TYPE=disk rows for rotational vs non-rotational and TRAN for NVMe, SATA, SAS, or USB when the kernel exposes it. Confirm with cat /sys/block/<disk>/queue/rotational when you want the raw sysfs value behind ROTA.

Use udevadm, lspci, and lshw when transport or model data is missing. Use hdparm or smartctl on ATA/SATA disks; on NVMe, prefer nvme list and nvme id-ctrl, with smartctl -a as an additional option for NVMe SMART/health data. Expect VMs and RAID controllers to hide the physical media. ROTA=0 means non-rotational in kernel terms, not a guaranteed SSD label.

Partition table and filesystem checks belong in a separate step when that is what you need; they do not answer HDD vs SSD on their own.


References


Frequently Asked Questions

1. What is the fastest way to check if a Linux disk is HDD or SSD?

Run lsblk -d -e 7 -o NAME,TYPE,SIZE,ROTA,TRAN,MODEL and read ROTA on rows where TYPE is disk. ROTA 1 means the kernel reports rotational storage, which normally indicates HDD. ROTA 0 on a disk normally indicates SSD or flash-backed storage. Optical drives, virtual disks, RAID, and SAN volumes can also show ROTA 0 without being SSDs.

2. What does ROTA mean in lsblk?

ROTA mirrors /sys/block//queue/rotational. A value of 1 means rotational; 0 means non-rotational. It describes what the storage layer exposes to Linux, not a guaranteed physical media label.

3. How do I check disk interface type in Linux?

Start with lsblk TRAN for values such as sata, sas, nvme, or usb. Use udevadm ID_BUS when TRAN is empty, lspci for the storage controller, or nvme list for NVMe namespaces when nvme-cli is installed.

4. Why does parted show scsi for a SATA disk?

Many SATA disks are handled through the Linux SCSI disk layer, so tools may show a SCSI path even when the physical or virtual disk transport is ATA or SATA.

5. Why does Linux show VBOX HARDDISK or LOGICAL VOLUME instead of the real disk model?

Virtual machines and hardware RAID controllers often expose a virtual disk or logical volume to Linux, so the guest OS may not see the real physical drive model.

6. Can lsblk detect NVMe disks?

Yes. NVMe namespaces usually appear as names such as nvme0n1, and lsblk shows TRAN nvme when the kernel exposes it. For controller and namespace details, install nvme-cli and run nvme list.
Omer Cakmak

Linux Administrator

Highly skilled at managing Debian, Ubuntu, CentOS, Oracle Linux, and Red Hat servers. Proficient in bash scripting, Ansible, and AWX central server management, he handles server operations on OpenStack, KVM, Proxmox, and VMware.

  • Debian
  • Ubuntu
  • Linux
  • Red Hat Enterprise Linux
  • Shell Script
  • System Administration