可通过读取 /sys/class/block/*/size 文件并乘以 512 字节计算逻辑分区容量,结合 device/partition 值为 1 判断是否为分区,同时需排除 loop、zram、sr、md 等非硬盘设备。

直接查看 /sys/class/block 下各设备的 size 文件,再乘以 512 字节(扇区大小),就能得到每个逻辑分区的字节数。
确认设备是否为逻辑分区
/sys/class/block/ 目录下既有物理磁盘(如 sda、nvme0n1),也有其上的分区(如 sda1、nvme0n1p2)。逻辑分区通常表现为父设备名后带数字或 p数字 的子项。可通过检查 device/partition 文件判断:值为 1 表示该条目是一个分区;若不存在或读取失败,则大概率是主设备(非分区)。
读取 size 并换算为常用单位
每个分区目录下都有 size 文件,内容为扇区数量(默认 512 字节/扇区)。计算公式为:
字节数 = $(cat size) × 512
可进一步转换为 KiB、MiB 或 GiB:
cat /sys/class/block/sda1/size | awk '{printf "%.2f MiB ", $1 * 512 / 1024 / 1024}'find /sys/class/block -maxdepth 1 -name "*" -exec sh -c 'if [ -f "{}/size" ] && [ "$(cat {}/device/partition 2>/dev/null)" = "1" ]; then echo -n "{}/: "; cat {}/size | awk "{printf "%.1f GiB\n", $1 * 512 / 1024 / 1024 / 1024}"; fi' ;
注意多路径与 NVMe 设备命名差异
NVMe 设备分区名为 nvme0n1p1 而非 nvme0n1-1,p 是必须的分隔符;多路径设备(如 dm-0)虽在 /sys/class/block/ 中可见,但其 size 反映的是映射后的逻辑大小,需结合 /dev/mapper/ 名称交叉验证。不建议仅依赖名称猜测,应始终以 device/partition 和 ro(只读标志)、removable 等属性辅助判断。
避免误读隐藏或伪设备
部分设备如 loop0、zram0、sr0(光驱)也出现在该目录,但不属于硬盘逻辑分区。过滤时可排除:
– 名称含 loop、zram、sr、md(除非明确使用软 RAID)
– ro 值为 1 且 size 很小(常见于虚拟设备)
– device/type 文件存在且内容非 disk











