| 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.el10hdparm 9.65-6.el10smartmontools 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:
TYPEdisk— block devices to use for HDD vs SSD checks (ignoreromand other non-disk types)ROTA1on a disk — kernel reports rotational (normally HDD)ROTA0on 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.
lsblk -d -e 7 -o NAME,TYPE,SIZE,ROTA,TRAN,MODELNAME 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-ROMHow to read the columns:
- For HDD/SSD classification, concentrate on rows where
TYPEisdisk ROTA1on a disk — kernel reports rotational storage; normally HDDROTA0on a disk — kernel reports non-rotational storage; normally SSD or flash-backed storageTRAN— 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:
lsblk -d -e 7 -o NAME,TYPE,SIZE,ROTA,TRAN,MODEL,SERIALCheck HDD or SSD from /sys/block/.../rotational
The ROTA column comes from the kernel block-device rotational attribute:
cat /sys/block/sda/queue/rotational10— device reported as non-rotational1— device reported as rotational
To compare several disks at once:
for disk in sda sdb sr0; do printf "%s=%s\n" "$disk" "$(cat /sys/block/$disk/queue/rotational)"; donesda=1
sdb=1
sr0=0The 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:
lsblk -d -o NAME,ROTA,TRAN,MODELNVMe 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:
udevadm info --query=property --name=/dev/sda | grep -E '^(DEVTYPE|ID_BUS|ID_MODEL|ID_SERIAL|ID_ATA|ID_TYPE|ID_PATH)='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.0ID_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:
nvme listOn 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:
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:
ls -l /dev/disk/by-id | sed -n '1,6p'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 -> ../../sda3The 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:
lspci | grep -Ei 'sata|scsi|raid|nvme|storage|ide|fibre'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:
sudo lshw -class storage -class disk -shortH/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 HARDDISKlshw 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:
sudo hdparm -I /dev/sda/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-2002On 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:
lsblk -f -e 7For full filesystem identification, use commands to check filesystem type in Linux. When you only need the partition table label:
sudo fdisk -l /dev/sdaDisk /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-5A3B38B5DAECparted shows the same GPT layout and illustrates the SCSI presentation quirk:
sudo parted -s /dev/sda printModel: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 32.2GB
Sector size (logical/physical): 512B/512B
Partition Table: gptThe 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
- util-linux lsblk — block-device listing and column reference
- Queue sysfs: rotational —
/sys/block/<disk>/queue/rotational(RW) - smartmontools —
smartctlSMART and rotation-rate fields - nvme-cli — NVMe namespace and controller queries

