How to know if a disk is an SSD or an HDD
Solution 1
Linux automatically detects SSD, and since kernel version 2.6.29, you may verify sda
with:
cat /sys/block/sda/queue/rotational
You should get 1
for hard disks and 0
for a SSD.
It will probably not work if your disk is a logical device emulated by hardware (like a RAID controller).
See this answer for more information about SSD partitioning, filesystem...
Solution 2
With lsblk
(part of the util-linux
package):
lsblk -d -o name,rota
NAME ROTA
sda 0
sdb 0
sdc 1
where ROTA
means rotational device
(1
if true, 0
if false)
Solution 3
Use smartctl
(install by installing smartmontools
) to retrieve vendor information,
sudo smartctl -a /dev/sdb
If you see a line like this,
Rotation Rate: Solid State Device
That would be a SSD drive.
Solution 4
I needed to do this on the VPS and none of the provided solutions worked for me, but this answer did the trick:
This just reads random data from the drive and assesses the time.
time for i in `seq 1 1000`; do
dd bs=4k if=/dev/sda count=1 skip=$(( $RANDOM * 128 )) >/dev/null 2>&1;
done
NOTE: You may need sudo
before the dd
command, depending on your permissions.
Here are my results for an SSD:
real 0m1.375s
user 0m0.285s
sys 0m0.944s
And a HDD:
real 0m14.249s
user 0m0.752s
sys 0m6.284s
As you can see, the HDD takes about 10x the duration. This may not be reliable for some very fast HDD's, but in general, it will give you a good idea.
Solution 5
The other answers already tell you how to get this information in a number of ways , including /proc
. But you must expect all these mechanisms to lie if there's any virtualisation in the way, such as a hybrid SAN array with multiple tiers, or if the Linux machine is a virtual machine (where Linux will probably report the disk as a basic SCSI rotating disk, regardless of what the hardware really is)
user2935706
Updated on September 18, 2022Comments
-
user2935706 over 1 year
I want to know whether a disk is a solid-state drive or hard disk.
lshw
is not installed. I doyum install lshw
and it says there is no package named lshw. I do not know which version of http://pkgs.repoforge.org/lshw/ is suitable for my CentOS.I search the net and there is nothing that explain how to know whether a drive is SSD or HDD. Should I just format them first?
Result of
fdisk -l
:Disk /dev/sda: 120.0 GB, 120034123776 bytes 255 heads, 63 sectors/track, 14593 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00074f7d Device Boot Start End Blocks Id System /dev/sda1 * 1 14 103424 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 14 536 4194304 82 Linux swap / Solaris Partition 2 does not end on cylinder boundary. /dev/sda3 536 14594 112921600 83 Linux Disk /dev/sdc: 120.0 GB, 120034123776 bytes 255 heads, 63 sectors/track, 14593 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/sdb: 128.0 GB, 128035676160 bytes 255 heads, 63 sectors/track, 15566 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/sdd: 480.1 GB, 480103981056 bytes 255 heads, 63 sectors/track, 58369 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000
-
phuclv over 7 years
-
-
Matt about 11 years
dmesg
will contain the same info.dmesg | grep -i -e scsi -e ata
-
PythoNic almost 10 yearsOn Stackoverflow somebody found this sys-info didn't work.
-
Totor over 9 years@PythoNic please file a kernel bug report about this.
-
PythoNic over 9 years@totor Better add this comment on the other post. I don't know his/her kernel version :)
-
haridsv over 8 yearsNice! Works without having sudo privileges.
-
dma_k over 8 yearsThe method does not work for USB sticks – they are certainly not rotational drives (see Doesn't detect USB flash drive as SSD).
-
dma_k over 8 yearsThat utility seems to report the same information as in
/sys/block/.../rotational
. -
CMCDragonkai over 8 yearsWhat about hybrid drives?
-
Totor about 8 years@CMCDragonkai They propably appear as rotational since the flash memory is mostly an "improved cache". You tell us...
-
the_nuts about 8 yearsI have a non-ssd, RAID10, and my results are: real 0m1.351s - user: 0m0.307s - sys: 0m0.560s
-
user almost 8 years@dma_k Little wonder, considering it appears to use that one. Try it yourself:
strace lsblk -d -o name,rota /dev/sda 2>&1 | grep --context=3 --color rotational
-
dma_k almost 8 yearsActually I was looking into various ways because some USB controllers don't tell that drive is actually non-rotational (for example, USB flash) and there is no way in Linux to tell the truth. At the end of the day I have fixed that by creating the explicit rule in
/etc/udev/rules.d/90-non-rotational.rules
:ACTION=="add|change", SUBSYSTEMS=="usb", ENV{ID_SERIAL}=="SanDisk_Ultra_Fit_*-0:0", ATTR{queue/rotational}="0", ATTR{queue/scheduler}="deadline"
-
itoctopus almost 8 yearsThis is a good answer and it does work across the board. The thing is some HDDs are quite fast and the results can be similar to those of SSDs. Still, this answer provides a good metric.
-
Terrance almost 8 years@Totor You are correct in the "hybrid" drives. However, dual-drive hybrids show up as two individual drives, where SSHD (Solid-State Hybrid Drive) shows up as a single drive. So, the SSHD would show rotational of 1.
-
Alessio almost 8 years+1. nice, but running that on my (aging and soon to be replaced) WD Greens says
Medium rotation rate is not reported
.hdparm
andsmartmonctl
say the same. I guess WD don't want to tell. -
trr over 7 yearsOn my VPS without an SSD this provides results like your SSD example. I believe this may be fooled by "hybrid" (SSD cached HDD) setups.
-
tuk0z over 7 years
lsblk
reports "0" for all my good old SATA spinning HDDs here (ASROCK mobo). « some USB controllers don't tell that drive is actually non-rotational (for example, USB flash) » @dma_k this is so true --and better this way than the other way for USB wired external spinning HDDs IMHA. -
user2241406 over 7 yearsOn virtual servers, you may need to fetch
/sys/block/vda/queue/rotational
-
ron over 5 yearsthis may be one of the more important responses... and also within the BIOS, or EFI/UEFI one may need to set the SATA controller mode to AHCI and then also mark each disk as SSD within the bios. My Asrock board on home pc is like this, can't remember if there was a similiar thing on server boards (supermicro) I have at work but i don't use SSD at work.
-
Toby over 5 yearsdoesn't work for me. I find SSD and HDD produce similar result.
-
Ferrybig over 5 yearsOn certain computers, you need to run
cat /sys/block/nvme0n1/queue/rotational
instead,sda
does not exist on my laptop -
Motivated over 5 years@ron - What do you mean by setting the SATA controller mode to AHCI? How does it affect the ability to accurately report if the device is a SSD or not?
-
ron over 5 yearslook up AHCI vs IDE, wording from first web search: IDE is considered adequate for the average computer user, and is the most compatible with other technology, particularly older devices. However, it lacks support for new technologies...AHCI provides a standard system that designers and developers can use to configure, detect, or program SATA/AHCI adapters.*
-
ron over 5 yearsthat is a basic settings in the BIOS, somewhere under Storage, the choices are IDE, AHCI, and also depending on make/model/year of motherboard can also offer RAID. SSD's came out long after IDE basically went obsolete and the standard became AHCI, For example installing Windows95 on a computer today it would not recognize any hardware... being in IDE mode certainly would not help communication with a SSD not so much accuracy but simply being able to communicate with a SATA controller which is based on AHCI protocols.
-
vidarlo about 5 yearsOn a VPS hardware's virtualized. You can't really tell if your files are stored on a HDD, cached, or stored on a SSD.
-
Marki555 over 4 years@Ferrybig There are only SSDs in NVME format, not HDDs (unless you do have some strange breakout adapter from NVME slot to plain SATA cable). But not sure if even SATA SSD over NVME shows as NVME in linux or as plain sdX.
-
crysman over 4 yearsthis one is better than unix.stackexchange.com/posts/65602/revisions because it lists all devices
-
arielf over 4 yearsThis seems to show only ATA/SCSI block-devices, others such as NVMe SSDs do not show.
-
arielf over 4 yearsThis works best for me, but it includes redundant/unwanted loop devices (e.g. due to Ubuntu snaps). A slight improvement is:
lsblk -d -e 7 -o NAME,ROTA,DISC-MAX,MODEL
which excludes loop devices + adds the model name (manufacturer) and disk capacity. -
arielf over 4 yearsThis works if you know which device to show (e.g.
sda
) a-priori. If you want to discover disks + whether they are rotational, try @don_crissti answer. -
user515185 over 4 yearsajouté | grep -v 'loop' dans la commande pour ignorer les "block device" virtuel ex: for SsDrive in $(find /sys/block/* -maxdepth 1 -exec echo {} \; -exec grep '0' {}/queue/rotational \; | grep -v 'loop' | grep -B1 '^0' | grep '^/' | sed 's/^.*\///g') ; do find /dev/ -name $SsDrive[0-9] ; done
-
ron over 4 yearsif your disk is behind a raid controller, you will only see the raid controller such as
Vendor: LSI Model: SMC3108 Rev: 4.27
-
Jeff Schaller over 4 yearsI noticed after my translation yesterday that you've previously rolled back attempted translations. Please note that answers on this site should be in English. Thank you!
-
user515185 over 4 yearsAdd | grep -v 'loop' on the command line to forget the loop (virtual block device ) ex: for SsDrive in $(find /sys/block/* -maxdepth 1 -exec echo {} \; -exec grep '0' {}/queue/rotational \; | grep -v 'loop' | grep -B1 '^0' | grep '^/' | sed 's/^.*\///g') ; do find /dev/ -name $SsDrive[0-9] ; done
-
spacebiker over 3 yearsThis didn't work for me, both the hd and the ssd show 1
-
gavv about 2 yearsDescription does not always include "HDD" or "SSD".
-
Admin almost 2 yearsThis work for me, i got 0, my disk is SSD.