New Tool: lsds - List All Linux Block Devices and Settings in One Place

2025-05-09

在 Linux 上处理磁盘和 I/O 相关问题时,你经常会运行 lsblklsscsinvme list 等命令。但这些命令往往会报告不同的信息,所以我最终需要运行多个命令,并根据设备名或编号来关联它们的输出。

然后,我还需要运行类似以下的命令,以获取特定磁盘的当前操作系统级别配置设置的额外信息:

grep . /sys/class/block/sd*/device/queue_depth
grep . /sys/class/block/*/queue/nr_requests

上面的命令会显示硬件声明的设备队列深度以及操作系统块设备级别的(软件)队列深度。

我终于受够了,创建了一个单独的 Python 程序 lsds,用于在一个地方显示磁盘的所有有趣信息。lsds 工具不会在底层执行任何其他命令,它只是直接从 sysfs /sys/class/blocks/... 目录读取相关信息。

查看我的 0x.tools 工具集,了解更多 Linux 性能和故障排除工具。

以下是我的 机器上的输出,其中包含 21 个 SSD。你可能需要向右滚动才能看到完整的输出:

$ **lsds**
DEVNAME  MAJ:MIN SIZE    TYPE   SCHED ROT MODEL            QDEPTH NR_RQ WCACHE
nvme0n1  259:4  931.5 GiB  NVMeDisk none  0  Samsung SSD 9100 PRO 1TB  -    1023  write back
nvme10n1 259:21  465.8 GiB  NVMeDisk none  0  Samsung SSD 980 PRO 500GB  -    1023  write back
nvme11n1 259:22  465.8 GiB  NVMeDisk none  0  Samsung SSD 980 PRO 500GB  -    1023  write back
nvme12n1 259:9  931.5 GiB  NVMeDisk none  0  Samsung SSD 980 PRO 1TB   -    1023  write back
nvme13n1 259:16  931.5 GiB  NVMeDisk none  0  Samsung SSD 980 PRO 1TB   -    1023  write back
nvme14n1 259:8  931.5 GiB  NVMeDisk none  0  Samsung SSD 980 PRO 1TB   -    1023  write back
nvme15n1 259:15  931.5 GiB  NVMeDisk none  0  Samsung SSD 980 PRO 1TB   -    1023  write back
nvme16n1 259:12  1863.0 GiB NVMeDisk none  0  T-FORCE TM8FF1002T     -    1023  write back
nvme17n1 259:11  1863.0 GiB NVMeDisk none  0  T-FORCE TM8FF1002T     -    1023  write back
nvme18n1 259:13  1863.0 GiB NVMeDisk none  0  T-FORCE TM8FF1002T     -    1023  write back
nvme19n1 259:14  1863.0 GiB NVMeDisk none  0  T-FORCE TM8FF1002T     -    1023  write back
nvme1n1  259:1  931.5 GiB  NVMeDisk none  0  Samsung SSD 9100 PRO 1TB  -    1023  write back
nvme20n1 259:3  1863.0 GiB NVMeDisk none  0  Samsung SSD 990 PRO 2TB   -    1023  write back
nvme2n1  259:2  931.5 GiB  NVMeDisk none  0  Samsung SSD 9100 PRO 1TB  -    1023  write back
nvme3n1  259:0  931.5 GiB  NVMeDisk none  0  Samsung SSD 9100 PRO 1TB  -    1023  write back
nvme4n1  259:18  931.5 GiB  NVMeDisk none  0  Samsung SSD 980 PRO 1TB   -    1023  write back
nvme5n1  259:23  931.5 GiB  NVMeDisk none  0  Samsung SSD 980 PRO 1TB   -    1023  write back
nvme6n1  259:19  931.5 GiB  NVMeDisk none  0  Samsung SSD 980 PRO 1TB   -    1023  write back
nvme7n1  259:20  931.5 GiB  NVMeDisk none  0  Samsung SSD 980 PRO 1TB   -    1023  write back
nvme8n1  259:17  1788.5 GiB NVMeDisk none  0  SAMSUNG MZQL21T9HCJR-00A07 -    1023  write through
nvme9n1  259:10  1397.3 GiB NVMeDisk none  0  INTEL SSDPE21D015TA     -    1023  write through

以上所有磁盘都是 NVMe SSD,所以 I/O 调度器 (SCHED) 为 “none”,旋转标志 (ROT) 为 0。

如果你更喜欢更窄的透视输出,可以使用 --pivot 选项,如下所示。 我还添加了 --verbose 标志来 解释 此工具从何处获取其信息:

$ **lsds -pv**
DEVNAME   NAME     VALUE
nvme0n1   MAJ:MIN   259:4           /sys/class/block/nvme0n1/dev
nvme0n1   SIZE     931.5 GiB         /sys/class/block/nvme0n1/size * 512
nvme0n1   TYPE     NVMeDisk         devname, /sys/class/block/nvme0n1/partition
nvme0n1   SCHED    none           /sys/class/block/nvme0n1/queue/scheduler
nvme0n1   ROT     0             /sys/class/block/nvme0n1/queue/rotational
nvme0n1   MODEL    Samsung SSD 9100 PRO 1TB /sys/class/block/nvme0n1/device/model
nvme0n1   QDEPTH    -             /sys/class/block/nvme0n1/device/queue_depth (N/A for NVMe)
nvme0n1   NR_RQ    1023           /sys/class/block/nvme0n1/queue/nr_requests
nvme0n1   WCACHE    write back        /sys/class/block/nvme0n1/queue/write_cache
...
nvme9n1   MAJ:MIN   259:10          /sys/class/block/nvme9n1/dev
nvme9n1   SIZE     1397.3 GiB        /sys/class/block/nvme9n1/size * 512
nvme9n1   TYPE     NVMeDisk         devname, /sys/class/block/nvme9n1/partition
nvme9n1   SCHED    none           /sys/class/block/nvme9n1/queue/scheduler
nvme9n1   ROT     0             /sys/class/block/nvme9n1/queue/rotational
nvme9n1   MODEL    INTEL SSDPE21D015TA    /sys/class/block/nvme9n1/device/model
nvme9n1   QDEPTH    -             /sys/class/block/nvme9n1/device/queue_depth (N/A for NVMe)
nvme9n1   NR_RQ    1023           /sys/class/block/nvme9n1/queue/nr_requests
nvme9n1   WCACHE    write through       /sys/class/block/nvme9n1/queue/write_cache

这个工具也是可以自定义的,查看帮助部分:

$ **lsds -h**
usage: lsds [-h] [-c COLUMN [COLUMN ...]] [-a COL1,COL2,...] [-l] [-v] [-p] [-r]
lsds: List Linux block devices v1.0.0 by Tanel Poder [0x.tools]
options:
 -h, --help      show this help message and exit
 -c, --columns COLUMN [COLUMN ...]
            Specify which columns to display. Overrides defaults. Default: DEVNAME MAJ:MIN SIZE TYPE SCHED ROT MODEL QDEPTH NR_RQ
            WCACHE
 -a, --add COL1,COL2,...
            Comma-separated list of columns to add to the default list.
 -l, --list      List all available column names and exit.
 -v, --verbose     Show the source file path or derivation for each value.
 -p, --pivot      Pivot output: print each device/column value on a separate line.
 -r, --realpath    Show /sys source file real path instead of symlink.
Reads data directly from sysfs, does not execute external commands.

要查看所有当前可用的字段,可以使用 --list 选项:

$ **lsds -l**
CAP       DAX       DEVNAME     DISCARD     DISC_GRAN    DISC_MAX     DISC_MAXHW    FUA
HWSEC      INFLIGHT     IOPOLL      IOPOLL_DEL    IOSTATS     LOGSEC      MAJ:MIN     MODEL
NR_RQ      NVME_QDEPTH   P2P_QUEUES    PHYSEC      QDEPTH      RANDOM      REMOVABLE    RO
ROT       SCHED      SIZE       TIMEOUT     TYPE       VENDOR      WBT_LAT     WCACHE

你也可以将 pivot 和 verbose 标志添加到 --list 选项,以查看它将在何处查找每个字段的值:

$ **lsds -lpv**
CAP        {dev_path}/capability
DAX        {dev_path}/queue/dax
DEVNAME      {dev_path}
DISCARD      {dev_path}/queue/discard_granularity
DISC_GRAN     {dev_path}/queue/discard_granularity
DISC_MAX     {dev_path}/queue/discard_max_bytes
DISC_MAXHW    {dev_path}/queue/discard_max_hw_bytes
FUA        {dev_path}/queue/fua
HWSEC       {dev_path}/queue/hw_sector_size
INFLIGHT     {dev_path}/inflight
IOPOLL      {dev_path}/queue/io_poll
IOPOLL_DEL    {dev_path}/queue/io_poll_delay
IOSTATS      {dev_path}/queue/iostats
LOGSEC      {dev_path}/queue/logical_block_size
MAJ:MIN      {dev_path}/dev
MODEL       {dev_path}/device/model
NR_RQ       {dev_path}/queue/nr_requests
NVME_QDEPTH    {module_base}/nvme*/parameters/io_queue_depth
P2P_QUEUES    {dev_path}/device/num_p2p_queues
PHYSEC      {dev_path}/queue/physical_block_size
QDEPTH      {dev_path}/device/queue_depth (N/A for NVMe)
RANDOM      {dev_path}/queue/add_random
REMOVABLE     {dev_path}/removable
RO        {dev_path}/ro
ROT        {dev_path}/queue/rotational
SCHED       {dev_path}/queue/scheduler
SIZE       {dev_path}/size * {sector_size}
TIMEOUT      {dev_path}/queue/io_timeout
TYPE       devname, {dev_path}/partition
VENDOR      {dev_path}/device/vendor
WBT_LAT      {dev_path}/queue/wbt_lat_usec
WCACHE      {dev_path}/queue/write_cache

让我们使用另一台同时具有旋转磁盘和 NVMe SSD 的机器来报告硬件扇区大小和 NVMe 设备队列深度。 NVMe 队列深度与正常的 SCSI 设备声明的队列深度不同:

$ **lsds -a HWSEC,NVME_QDEPTH**
DEVNAME MAJ:MIN SIZE    TYPE   SCHED    ROT MODEL           QDEPTH NR_RQ WCACHE     HWSEC NVME_QDEPTH
nvme0n1 259:0  186.3 GiB  NVMeDisk none     0  Micron_7400_MTFDKBA960TDZ -    1023  write through 4096  1024
nvme0n2 259:6  200.0 GiB  NVMeDisk none     0  Micron_7400_MTFDKBA960TDZ -    1023  write through 4096  1024
nvme1n1 259:1  1863.0 GiB NVMeDisk none     0  Samsung SSD 990 PRO 2TB  -    1023  write back   512  1024
nvme2n1 259:2  260.8 GiB  NVMeDisk none     0  INTEL SSDPED1D280GA    -    1023  write through 512  1024
sda   8:0   3726.0 GiB Disk   mq-deadline 1  P9233           30   60   write back   4096  -
sdb   8:16   3726.0 GiB Disk   mq-deadline 1  P9233           30   60   write back   4096  -
sdc   8:32   3726.0 GiB Disk   mq-deadline 1  P9233           30   60   write back   4096  -
sdd   8:48   3726.0 GiB Disk   mq-deadline 1  P9233           30   60   write back   4096  -

如你所见,底部的 4 个 sd* 设备正在使用 mq-deadline I/O 调度器,“rotational” 标志为 1,并且这些磁盘能够在设备固件级别的硬件队列中保存 30 个正在进行的 I/O 请求。 NVMe I/O 处理的工作方式不同,当你向右滚动时,你会看到 NVME_QDEPTH 显示每个 SSD 最多可以在 SSD 设备控制器级别同时处理 1024 个正在进行的 I/O 请求。

对于具有 PLP(基于控制器 DRAM 的写入缓存具有断电保护)的企业级 SSD 或由于其低写入延迟甚至不需要写入缓存的 Optane 介质,你将看到一些磁盘处于 write through 写入缓存模式。 这通常是我放置 WAL、redo-logs 和任何其他需要低延迟 持久 写入的文件的位置。

$ **lsds -a FUA,HWSEC,NVME_QDEPTH**
DEVNAME MAJ:MIN SIZE    TYPE   SCHED    ROT MODEL           QDEPTH NR_RQ WCACHE     FUA HWSEC NVME_QDEPTH
nvme0n1 259:0  186.3 GiB  NVMeDisk none     0  Micron_7400_MTFDKBA960TDZ -    1023  write through 0  4096  1024
nvme0n2 259:6  200.0 GiB  NVMeDisk none     0  Micron_7400_MTFDKBA960TDZ -    1023  write through 0  4096  1024
nvme1n1 259:1  1863.0 GiB NVMeDisk none     0  Samsung SSD 990 PRO 2TB  -    1023  write back   1  512  1024
nvme2n1 259:2  260.8 GiB  NVMeDisk none     0  INTEL SSDPED1D280GA    -    1023  write through 0  512  1024
sda   8:0   3726.0 GiB Disk   mq-deadline 1  P9233           30   60   write back   0  4096  -
sdb   8:16   3726.0 GiB Disk   mq-deadline 1  P9233           30   60   write back   0  4096  -
sdc   8:32   3726.0 GiB Disk   mq-deadline 1  P9233           30   60   write back   0  4096  -
sdd   8:48   3726.0 GiB Disk   mq-deadline 1  P9233           30   60   write back   0  4096  -

我还列出了对 Force Unit Access (FUA) 标志的支持,该标志允许写入者指示磁盘控制器立即将 I/O 有效负载写入持久性 (NAND) 介质,而不让它停留在不受保护的写入缓存中,等待稍后可能发生的某些 fsync() 操作。

在上面的输出中,Micron SSD 具有 PLP 写入缓存,因此它们不必遵守任何 FUA 操作,因为它们的写入缓存是持久的(由于设备上的电容器,SSD 有足够的时间在断电时将写入缓存刷新到 NAND)。 当然,这假设硬件和固件工作正常,但这是你依赖的 一切 的情况。 以下的 SAMSUNG MZQL21T9HCJR-00A07 磁盘也是这种情况,它具有电容器和 PLP。 两个输出中的 INTEL SSD 都是 Optane SSD(可悲的是已停产) - 它们的 3D XPoint 介质非常快,甚至不需要任何写入缓存,每次写入都会立即写入持久介质,无需紧急缓存刷新。

因此,这两种类型的磁盘都处于 write through 缓存模式并且 FUA = 0,它们不支持 FUA 标志,它们不需要遵守它来实现操作系统角度的持久性:

$ **lsds -a FUA,HWSEC,NVME_QDEPTH**
DEVNAME  MAJ:MIN SIZE    TYPE   SCHED ROT MODEL            QDEPTH NR_RQ **WCACHE**     **FUA** HWSEC NVME_QDEPTH
nvme0n1  259:4  931.5 GiB  NVMeDisk none  0  Samsung SSD 9100 PRO 1TB  -    1023  write back   1  512  1024
nvme10n1 259:21  465.8 GiB  NVMeDisk none  0  Samsung SSD 980 PRO 500GB  -    1023  write back   1  512  1024
nvme11n1 259:22  465.8 GiB  NVMeDisk none  0  Samsung SSD 980 PRO 500GB  -    1023  write back   1  512  1024
nvme12n1 259:9  931.5 GiB  NVMeDisk none  0  Samsung SSD 980 PRO 1TB   -    1023  write back   1  512  1024
nvme13n1 259:16  931.5 GiB  NVMeDisk none  0  Samsung SSD 980 PRO 1TB   -    1023  write back   1  512  1024
nvme14n1 259:8  931.5 GiB  NVMeDisk none  0  Samsung SSD 980 PRO 1TB   -    1023  write back   1  512  1024
nvme15n1 259:15  931.5 GiB  NVMeDisk none  0  Samsung SSD 980 PRO 1TB   -    1023  write back   1  512  1024
nvme16n1 259:12  1863.0 GiB NVMeDisk none  0  T-FORCE TM8FF1002T     -    1023  write back   1  4096  1024
nvme17n1 259:11  1863.0 GiB NVMeDisk none  0  T-FORCE TM8FF1002T     -    1023  write back   1  4096  1024
nvme18n1 259:13  1863.0 GiB NVMeDisk none  0  T-FORCE TM8FF1002T     -    1023  write back   1  4096  1024
nvme19n1 259:14  1863.0 GiB NVMeDisk none  0  T-FORCE TM8FF1002T     -    1023  write back   1  4096  1024
nvme1n1  259:1  931.5 GiB  NVMeDisk none  0  Samsung SSD 9100 PRO 1TB  -    1023  write back   1  512  1024
nvme20n1 259:3  1863.0 GiB NVMeDisk none  0  Samsung SSD 990 PRO 2TB   -    1023  write back   1  512  1024
nvme2n1  259:2  931.5 GiB  NVMeDisk none  0  Samsung SSD 9100 PRO 1TB  -    1023  write back   1  512  1024
nvme3n1  259:0  931.5 GiB  NVMeDisk none  0  Samsung SSD 9100 PRO 1TB  -    1023  write back   1  512  1024
nvme4n1  259:18  931.5 GiB  NVMeDisk none  0  Samsung SSD 980 PRO 1TB   -    1023  write back   1  512  1024
nvme5n1  259:23  931.5 GiB  NVMeDisk none  0  Samsung SSD 980 PRO 1TB   -    1023  write back   1  512  1024
nvme6n1  259:19  931.5 GiB  NVMeDisk none  0  Samsung SSD 980 PRO 1TB   -    1023  write back   1  512  1024
nvme7n1  259:20  931.5 GiB  NVMeDisk none  0  Samsung SSD 980 PRO 1TB   -    1023  write back   1  512  1024
nvme8n1  259:17  1788.5 GiB NVMeDisk none  0  SAMSUNG MZQL21T9HCJR-00A07 -    1023  write through 0  4096  1024
nvme9n1  259:10  1397.3 GiB NVMeDisk none  0  INTEL SSDPE21D015TA     -    1023  write through 0  512  1024

以下是从一台具有一堆 NVMe SSD 和一个糟糕的(外部)USB 磁盘的机器的输出,即使在磁盘控制器级别,它一次也只能处理一个 I/O!

$ **lsds**
DEVNAME  MAJ:MIN SIZE    TYPE   SCHED    ROT MODEL             **QDEPTH** NR_RQ WCACHE
nvme0n1  259:3  110.3 GiB  NVMeDisk none     0  INTEL SSDPEK1A118GA      -    1023  write through
nvme10n1 259:4  894.3 GiB  NVMeDisk none     0  INTEL SSDPE21D960GA      -    1023  write through
nvme1n1  259:1  110.3 GiB  NVMeDisk none     0  INTEL SSDPEK1A118GA      -    1023  write through
nvme2n1  259:2  110.3 GiB  NVMeDisk none     0  INTEL SSDPEK1A118GA      -    1023  write through
nvme3n1  259:0  110.3 GiB  NVMeDisk none     0  INTEL SSDPEK1A118GA      -    1023  write through
nvme4n1  259:6  931.5 GiB  NVMeDisk none     0  Samsung SSD 970 EVO Plus 1TB -    1023  write back
nvme5n1  259:13  931.5 GiB  NVMeDisk none     0  Samsung SSD 970 EVO Plus 1TB -    1023  write back
nvme6n1  259:7  931.5 GiB  NVMeDisk none     0  Samsung SSD 970 EVO Plus 1TB -    1023  write back
nvme7n1  259:8  931.5 GiB  NVMeDisk none     0  Samsung SSD 970 EVO Plus 1TB -    1023  write back
nvme8n1  259:9  953.9 GiB  NVMeDisk none     0  Samsung SSD 970 PRO 1TB    -    1023  write back
nvme9n1  259:5  354.0 GiB  NVMeDisk none     0  INTEL SSDPEL1D380GA      -    1023  write through
sda    8:0   3726.0 GiB Disk   mq-deadline 1  My Book 25ED         1    2   write through

这是在 VMWare 虚拟机中运行的 Linux 的输出。 甚至显示了 CD-ROM 块设备:

$ **lsds**
DEVNAME MAJ:MIN SIZE   TYPE   SCHED    ROT MODEL       QDEPTH NR_RQ WCACHE
sda   8:0   58.6 GiB Disk   mq-deadline 1  VMware Virtual S 32   64   write through
sda1   8:1   1.0 GiB  Part   -      -  -         -    -   -
sda2   8:2   4.0 GiB  Part   -      -  -         -    -   -
sda3   8:3   53.6 GiB Part   -      -  -         -    -   -
sr0   11:0   1.0 GiB  BlockDev mq-deadline 1  VMware IDE CDR10 1    2   write through

我编制了 /sys 目录中一些有趣的字段列表,然后将其提供给 Gemini 以进行初始脚本创建。 然后我浏览了代码,修复了我发现的一些问题,然后使用良好的旧手动编码方法添加了一些改进。 你需要至少安装 Python 3.6,因为此程序使用 Python f-strings。 玩得开心!

  1. _即将宣布更新的视频课程材料:Linux Performance & Troubleshooting training, Advanced Oracle SQL Tuning training, Advanced Oracle Troubleshooting training. 在这里查看当前版本! ^^^ _ _
  2. 通过电子邮件获取随机定时更新或关注 Social/RSS _

_ © Tanel Põder 2007-2038 _