新工具:lsds - 一站式列出所有 Linux 块设备及其配置
New Tool: lsds - List All Linux Block Devices and Settings in One Place
2025-05-09
在 Linux 上处理磁盘和 I/O 相关问题时,你经常会运行 lsblk
、lsscsi
、nvme 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。 玩得开心!
- _即将宣布更新的视频课程材料:Linux Performance & Troubleshooting training, Advanced Oracle SQL Tuning training, Advanced Oracle Troubleshooting training. 在这里查看当前版本! ^^^ _ _
- 通过电子邮件获取随机定时更新或关注 Social/RSS _
_ © Tanel Põder 2007-2038 _