云盘容量与购买容量不一致的问题排查

Linux系统的ECS实例中,使用df命令查看到的云盘容量可能与您购买的云盘容量不一致。这通常不是因为实际云盘空间不足,而是由于文件系统的元数据、Inode节点占用以及系统保留空间等因素占用了部分空间。

问题描述

Linux实例中的云盘容量为200 GiB,但是在系统初始化后,使用df -h命令查看云盘容量时只显示197 GiB。

  1. df -h命令显示的总容量(Size)与控制台购买容量不一致。

  2. 已用空间(Used)加上可用空间(Avail)之和与总容量(Size)不同。

image

说明

由于您在阿里云控制台购买的云盘以GiB为单位,因此本文以df -h命令为例,展示云盘分区的使用情况。如果您使用df -H命令,则返回的云盘分区使用情况将以GB为单位。

  • df -h使用1024作为基数(如KiB、MiB、GiB等),属于基于二进制的单位。

  • df -H则使用1000作为基数(如KB、MB、GB等),属于基于十进制的单位。

假设某分区的实际大小为40 GiB,使用df -h命令可能显示为40G,而使用df -H命令则可能显示为42G。这是因为40 * 1024^3字节除以1000^3约等于42.95亿字节。

原因分析

问题一:df -h命令显示的总容量(Size)与控制台购买容量不一致

文件系统开销

如果您购买了一个200GiB的云盘,在Linux系统中格式化并挂载后,你可能会看到总容量只有约197GiB。这是因为创建文件系统时会产生额外的数据结构,这些也会占用一定的云盘空间。虽然这部分空间一般较小,但确实会对总容量造成影响。

问题二:已用空间(Used)加上可用空间(Avail)之和与总容量(Size)不同

这种差异通常是由两个因素造成的:Inode节点占用的空间和系统保留空间。计算占用空间请参见排查方法

Inode节点占用

文件系统为每个文件分配一个Inode节点来记录文件属性(如权限、所有者等)。这些Inode节点本身需要占用一定的云盘空间,Inode节点占用的云盘空间不会被df -h命令统计。

系统保留空间

除了Inode节点外,Linux文件系统还会预留一部分云盘空间作为系统保留空间,以防止根目录被完全填满,从而保证系统的稳定性和安全性。这部分空间也不会出现在df -h命令的已用空间(Used)加上可用空间(Avail)的总和中。

排查方法

查看详细的分区信息

执行如下命令,查看该云盘对应的分区信息。

sudo tune2fs -l /dev/[$Partition] | grep -E "count|size:"
说明

其中/dev/[$Partition]是云盘对应的分区名称,例如/dev/vdb1。请根据实际情况替换分区名称。

系统返回类似如下信息。

image

计算Inode节点占用的空间

执行以下命令,直接得出Inode占用的空间总量。

sudo tune2fs -l /dev/[$Partition] | awk '/Inode count:/{c=$3} /Inode size:/{split($0,a,":"); s=a[2]} END{if(c && s) printf "Inode space: %.2f GiB\n", c*strtonum(s)/(1024^3); else print "Error: Could not find Inode information."}'
说明

其中/dev/[$Partition]是云盘对应的分区名称,例如/dev/vdb1。请根据实际情况替换分区名称。

返回如下:

image

您也可以使用下面的公式计算Inode节点占用的空间:

计算系统保留空间

执行以下命令,直接得出系统保留空间总量。

sudo tune2fs -l /dev/[$Partition] | awk '/Reserved block count:/{r=$4} /Block size:/{b=$3} END{if(r && b) printf "Reserved space: %.2f GiB\n", r*b/(1024^3); else print "Error: Could not find reserved block or block size information."}'
说明

其中/dev/[$Partition]是云盘对应的分区名称,例如/dev/vdb1。请根据实际情况替换分区名称。

返回如下:

image

您也可以使用下面的公式计算系统保留空间占用的磁盘空间: