Linux系统中如何计算磁盘总大小?技术实现相关疑问
Linux磁盘总大小计算相关问题解答
一、直接求和df -h第二列的问题
你提到的把df -h输出里第二列(排除最后一行NFS挂载)数值相加的方式,不能代表物理磁盘的总大小,原因如下:
df展示的是挂载的文件系统/逻辑卷的大小,不是物理磁盘。比如输出里的devtmpfs、tmpfs都是内存虚拟文件系统,它们的大小来自内存分配,不属于物理磁盘空间;- 同一个物理磁盘可能被划分成多个逻辑卷(比如你的
rootvg下的多个_lv),直接相加会重复计算物理磁盘的实际容量; - 最后一行的NFS挂载是远程服务器的磁盘,确实应该排除,但前面的虚拟文件系统也必须排除。
二、是否存在未显示的隐藏磁盘空间?
是的,存在几种常见情况:
- 未挂载的磁盘/分区:
df仅显示已挂载的文件系统,未挂载的物理分区或逻辑卷不会出现在输出中; - 文件系统预留空间:ext系列等文件系统默认会预留约5%的空间给root用户,用于系统紧急维护,这部分空间不会在
Avail列显示,但包含在Size列里; - 未初始化的磁盘:新磁盘如果还没分区、创建文件系统,
df完全不会展示。
三、按物理磁盘/文件系统拆分显示总大小的命令
1. 查看物理磁盘整体信息
使用lsblk命令,它会按物理磁盘、分区、逻辑卷的层级展示:
lsblk -b -d -o NAME,SIZE
参数说明:
-b:以字节为单位显示(避免G/M单位换算误差);-d:仅显示物理磁盘,不展示分区;-o NAME,SIZE:只输出磁盘名称和大小。
示例输出:
NAME SIZE sda 214748364800 sdb 107374182400
2. 查看已挂载的非虚拟文件系统大小
如果只想统计物理磁盘上的已挂载文件系统,过滤掉tmpfs/devtmpfs:
df -h -x tmpfs -x devtmpfs
这个命令会排除内存虚拟文件系统,只显示物理磁盘相关的挂载点,此时求和第二列会更接近实际物理使用的文件系统总大小,但仍需注意同一物理盘下多个逻辑卷的重复计算问题。
3. 查看LVM卷组/逻辑卷信息
你的系统使用了LVM(/dev/mapper/rootvg-*),可以用vgs查看卷组总容量:
vgs
输出里的VG Size就是卷组对应的物理磁盘总容量;用lvs可查看每个逻辑卷的大小:
lvs
四、Java程序实现思路
如果要编写Java程序获取磁盘信息,推荐两种方式:
- 执行系统命令解析输出:
- 通过
ProcessBuilder调用lsblk -b -d -o NAME,SIZE或df -h -x tmpfs -x devtmpfs,读取命令输出流并解析; - 注意处理不同Linux发行版的输出格式差异,优先使用标准化参数(比如
-b用字节避免单位解析错误);
- 通过
- 使用Java NIO API:
- Java 7+的
FileSystem和FileStore类可直接获取本地文件系统信息,无需执行系统命令:import java.nio.file.FileSystems; import java.nio.file.FileStore; import java.io.IOException; public class DiskInfo { public static void main(String[] args) throws IOException { for (FileStore store : FileSystems.getDefault().getFileStores()) { // 过滤虚拟文件系统 if (!store.name().contains("tmpfs") && !store.name().contains("devtmpfs")) { System.out.println("文件系统: " + store.name()); System.out.println("总大小(字节): " + store.getTotalSpace()); System.out.println("可用大小(字节): " + store.getUsableSpace()); System.out.println("------------------------"); } } } } - 这种方式跨平台,但无法直接获取物理磁盘信息,只能获取已挂载的文件系统信息。
- Java 7+的
内容的提问来源于stack exchange,提问作者fatherazrael
相关产品推荐
相关产品推荐

