pvs -o dev_size 不能直接显示硬盘总容量与pv分配有效容量的差值,因dev_size仅表示内核可见设备大小,而非厂商标称容量或未分配空间;真实差值需用blockdev --getsize64获取整盘大小,再减去pv_size。

你提到的命令 pvs -O Dev_Size 并不能直接显示“物理硬盘总容量”和“PV分配有效容量”之间的差值,因为 pvs 查看的是 LVM 物理卷(PV)的元数据信息,而 Dev_Size 字段仅表示该 PV 所在设备的**内核可见大小**(即设备节点如 /dev/sdb 的大小),它本身**不等于原始硬盘的物理容量**(比如厂商标称的 TB 数),也不反映未被 PV 占用的设备空间。
一、明确几个关键概念
要算出“物理硬盘总容量”与“PV 已分配有效容量”的差值,需分清以下三层:
- 硬盘标称容量:厂商标注的容量(如 1TB = 10004 字节),但操作系统识别时按 10244 计算,存在“缩水”;
-
设备节点大小(Dev_Size):Linux 内核读取的块设备容量(单位为字节),可通过
blockdev --getsize64 /dev/sdX或pvs -o +pv_size,dev_size查看; -
PV 有效容量(PV_Size):LVM 初始化 PV 时实际使用的空间,通常略小于
Dev_Size(因对齐、元数据保留等);PV_Size才是真正可用于创建 VG/LV 的空间。
二、查看 Dev_Size 和 PV_Size 的正确方法
运行以下命令对比:
pvs -o pv_name,dev_size,pv_size,pe_count,pe_size --units g
输出示例:
PV Dev_Size PV_Size PE Total PE Size /dev/sdb 931.51g 931.48g 237459 4.00m
这里 Dev_Size 和 PV_Size 的微小差异(如 0.03GB)就是 LVM 初始化时预留的元数据/对齐空间 —— 这才是你要的“PV 分配有效容量与设备大小的物理差值”。
三、若想确认整块硬盘是否完全被 PV 占用
检查 PV 是否覆盖整个设备:
- 用
fdisk -l /dev/sdX或lsblk /dev/sdX看是否有其他分区(如/dev/sdb1)存在; - 若设备是裸盘(如
/dev/sdb)且无分区表,Dev_Size ≈ PV_Size表示基本全用; - 若设备有分区(如
/dev/sdb1),则Dev_Size是分区大小,不是硬盘总容量;此时需用blockdev --getsize64 /dev/sdb获取整盘大小再减去PV_Size。
四、计算真实“未被 PV 使用的物理空间”
假设硬盘设备为 /dev/sdb,执行:
echo $(( $(blockdev --getsize64 /dev/sdb) - $(pvs --noheadings -o pv_size --units b /dev/sdb 2>/dev/null | awk '{print $1}') )) | numfmt --to=iec-i --suffix=B
该命令输出类似 33554432B = 32MiB,即整块硬盘中未被 PV 利用的字节数(含 MBR/GPT、未对齐空隙、或人为留白)。











