Linux ECS インスタンスでは、df コマンドによって報告されるクラウドディスクの容量が、購入した容量と一致しない場合があります。この動作は想定どおりであり、エラーを示すものではありません。この差異は、ファイルシステムのメタデータ、inode、およびシステム予約領域によって消費される領域が原因で発生します。
問題の説明
200 GiB のクラウドディスクが Linux ECS インスタンスにアタッチされています。ディスクを初期化した後、df -h コマンドを実行すると、報告される容量が 197 GiB のみであることがわかります。
-
df -hコマンドで報告される合計容量 (Size) が、コンソールで購入した容量と一致しません。 -
使用済み領域 (
Used) と利用可能領域 (Avail) の合計が、合計容量 (Size) と等しくなりません。
[root@xxx]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 916M 0 916M 0% /dev
tmpfs 936M 12K 936M 1% /dev/shm
tmpfs 936M 536K 936M 1% /run
tmpfs 936M 0 936M 0% /sys/fs/cgroup
/dev/vda3 40G 4.1G 34G 11% /
/dev/vda2 200M 5.8M 195M 3% /boot/efi
tmpfs 188M 0 188M 0% /run/user/0
/dev/vdb1 197G 118M 189G 1% /mnt
Alibaba Cloud コンソールで購入したクラウドディスクの容量は、ギビバイト (GiB) で測定されます。この記事では、df -h コマンドを例として使用します。df -H コマンドを使用する場合、報告されるパーティション使用量はギガバイト (GB) 単位で測定されます。
-
df -hコマンドは 1024 を底として使用し、サイズを KiB、MiB、GiB などのバイナリ単位で表示します。 -
df -Hコマンドは 1000 を底として使用し、サイズを KB、MB、GB などの10進数単位で表示します。
たとえば、正確に 40 GiB のパーティションは、df -h コマンドでは 40G と表示される場合があります。同じパーティションが df -H コマンドでは 43G と表示される場合があります。これは、40 GiB (40 × 1024³ バイト) が約 43 GB に相当するためです。
原因
問題1: df -h コマンドで表示される合計容量 (Size) が、コンソールで購入した容量と一致しない
ファイルシステムのオーバーヘッド
Linux で 200 GiB のクラウドディスクをフォーマットしてマウントすると、報告される容量が 197 GiB にすぎない場合があります。これは、ファイルシステムがメタデータ用の領域を必要とし、データに利用可能な容量が減少するために発生します。
問題2: Used + Avail が Size と等しくない
この差異は通常、inode によって消費される領域とシステム予約領域の2つの要因によって発生します。この消費領域の計算方法については、「トラブルシューティング方法」をご参照ください。
inode の使用状況
ファイルシステムは、パーミッションや所有権などの属性を格納するために、各ファイルとディレクトリに inode を割り当てます。これらの inode 自体がディスク領域を消費しますが、これは df -h コマンドの Used または Avail フィールドには含まれません。
システム予約領域
Linux ファイルシステムは、ディスク領域の一部をシステム用に予約します。この予約領域は、ファイルシステムが完全に満杯になるのを防ぎ、システムの安定性とセキュリティを確保します。この領域は、df -h コマンドで報告される Used または Avail フィールドには含まれません。
トラブルシューティング方法
パーティション詳細の表示
次のコマンドを実行して、クラウドディスクのパーティション情報を表示します。
sudo tune2fs -l /dev/[$Partition] | grep -E "count|size:"
この場合、/dev/[$Partition] はクラウドディスクのパーティション名 (例: /dev/vdb1) です。実際の状況に応じてパーティション名を置き換えてください。
出力は次のようになります。
[root@xxx]# sudo tune2fs -l /dev/vdb1 | grep -E "count|size:"
Inode count: 13107200
Block count: 52428539
Reserved block count: 2199325
Block size: 4096
Fragment size: 4096
Group descriptor size: 64
Flex block group size: 16
Mount count: 1
Maximum mount count: -1
Inode size: 256
Required extra isize: 32
Desired extra isize: 32
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) です。実際の状況に応じてパーティション名を置き換えてください。
コマンドは次の出力を返します。
[root@ixxxxxxxxxxxx]# sudo tune2fs -l /dev/vdb1 | 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."}'
Reserved space: 8.39 GiB
または、次の式を使用してシステム予約領域を計算することもできます。