如何判断磁盘是 SSD 还是 HDD

发布于 2023-03-19 23:19:56 字数 2758 浏览 95 评论 0

磁盘速度越来越称为限制系统性能的重要因素,目前家用计算机中的磁盘一般分两类,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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

明月松间行

暂无简介

文章
评论
821 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文