10

如何判断磁盘是SSD还是HDD

 3 years ago
source link: https://www.lujun9972.win/blog/2020/04/18/%E5%A6%82%E4%BD%95%E5%88%A4%E6%96%AD%E7%A3%81%E7%9B%98%E6%98%AFssd%E8%BF%98%E6%98%AFhdd/index.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

如何判断磁盘是SSD还是HDD

https://www.ostechnix.com/how-to-find-if-the-disk-is-ssd-or-hdd-in-linux/ 上学到的技巧,记录一下。

磁盘速度越来越称为限制系统性能的重要因素,目前家用计算机中的磁盘一般分两类,SSD和HDD,且两类磁盘的读写速度相差巨大。 那么在Linux下要如何判断磁盘是SSD还是HDD的呢?

我们知道,传统的HDD磁盘与SSD很大一个不同就在于传统的HDD磁盘是通过磁盘旋转来将磁头转到指定磁道上来实现读写的,而SSD将数据存储在可即使访问的闪存芯片上的。 因此只要直到了磁盘是否需要旋转就能区分磁盘为SSD还是HDD了。

解决方案一:使用lsblk命令

涉及到的命令: lsblk

本部分以archlinux系统为例

lsblk命令是属于 util-linux 包中,一般在大多数的Linux发行版中都会预先安装。 若未预安装则需要手工进行安装,在Archlinux中运行下面命令安装:

sudo pacman -S util-linux --noconfirm

lsblk命令会读取 sysfs 文件系统和 udev 配置来获取块设备(磁盘就是一种块设备)的信息。

我们可以通过下面命令来查看磁盘是否会旋转:

lsblk -d -o name,rota

这里 -d 选项是 --nodeps 的缩写,表示只输出磁盘信息,而不输出磁盘上分区的信息。 -o 选项是 --output 的缩写,可以用来指定输出的列,我们这里只让它输出磁盘名和是否旋转

该命令在我电脑上运行的结果如下:

NAME ROTA
sda     0
sdb     1

也就是说,我这台机上装了两块磁盘,其中 sdaSSD 磁盘, sdbHDD 磁盘。

解决方案二:借助/sys

涉及到的命令: bash

本部分以archlinux系统为例

事实上 lsblk 命令正是读取 /sys 中的文件内容来给出某个磁盘是否旋转的信息来的。 你可以通过 strace lsblk -d -o name,rota 来进行验证,其输出中会包含类似这样的输出:

..... 省略 .....
openat(AT_FDCWD, "/sys/block/sdb/dev", O_RDONLY|O_CLOEXEC) = 5
fstat(5, {st_mode=S_IFREG|0444, st_size=4096, ...}) = 0
read(5, "8:16\n", 4096)                 = 5
close(5)                                = 0
..... 省略 .....
openat(AT_FDCWD, "/sys/block/sda/dev", O_RDONLY|O_CLOEXEC) = 5
fstat(5, {st_mode=S_IFREG|0444, st_size=4096, ...}) = 0
read(5, "8:0\n", 4096)                  = 4
close(5)                                = 0
..... 省略 .....
openat(AT_FDCWD, "/sys/dev/block/8:16", O_RDONLY|O_CLOEXEC) = 3
openat(3, "queue/rotational", O_RDONLY|O_CLOEXEC) = 4
read(4, "1\n", 8191)                    = 2
read(4, "", 8189)                       = 0
close(4)                                = 0
close(3)                                = 0
openat(AT_FDCWD, "/sys/dev/block/8:0", O_RDONLY|O_CLOEXEC) = 3
openat(3, "queue/rotational", O_RDONLY|O_CLOEXEC) = 4
read(4, "0\n", 8191)                    = 2
read(4, "", 8189)                       = 0
close(4)                                = 0
close(3)                                = 0

因此,我们也可以按照这一过程,自己从 /sys 中获取信息。

比如,我们要查看 sda 是否为SSD磁盘可以这样操作

DISKID=$(cat /sys/block/sda/dev)
cat /sys/dev/block/${DISKID}/queue/rotational
0

不过,由于 /sys/block/sda/sys/dev/block/$(cat /sys/block/sda/dev) 指向的是同一个目录,所以其实上面的操作可以简化为:

cat /sys/block/sda/queue/rotational
0

Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK