在Linux系统的ECS实例中,使用df
命令查看到的云盘容量可能与您购买的云盘容量不一致。这通常不是因为实际云盘空间不足,而是由于文件系统的元数据、Inode节点占用以及系统保留空间等因素占用了部分空间。
问题描述
Linux实例中的云盘容量为200 GiB,但是在系统初始化后,使用df -h
命令查看云盘容量时只显示197 GiB。
df -h
命令显示的总容量(Size)与控制台购买容量不一致。已用空间(Used)加上可用空间(Avail)之和与总容量(Size)不同。
由于您在阿里云控制台购买的云盘以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
。请根据实际情况替换分区名称。
系统返回类似如下信息。
计算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
。请根据实际情况替换分区名称。
返回如下:
您也可以使用下面的公式计算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
。请根据实际情况替换分区名称。
返回如下:
您也可以使用下面的公式计算系统保留空间占用的磁盘空间: