df
コマンドを実行してLinux Elastic Compute Service (ECS) インスタンスのクラウドディスクの容量を照会すると、照会された容量がディスク用に購入した容量と異なる場合があります。 ほとんどの場合、問題は不十分なディスク容量が原因ではありません。 この問題は、ディスク領域の一部がシステムによって予約されているか、またはinodeとファイルシステムのメタデータによって占有されているために発生します。
問題の内容
Linux ECSインスタンス用の200-GiBクラウドディスクを購入し、ディスクを初期化します。 df -h
コマンドを実行してディスク容量を照会197と、GiBの代わりにGiBが返され200。
df -h
コマンドの出力には、ECSコンソールでクラウドディスク用に購入した容量とは異なる合計容量 (Size) が表示されます。使用済みスペース (used) と使用可能スペース (Avail) の合計は、総容量 (Size) とは異なります。
ECSコンソールで購入したディスクの容量は、GiBで測定されます。 次の例では、df -h
コマンドを実行して、ディスクパーティションの使用状況を照会します。 df -H
コマンドを実行すると、コマンド出力のディスクパーティション使用率はGB単位で測定されます。
df -h
は1,024をベースとして使用し、ディスクパーティションの使用率はKiB、MiB、GiBなどのバイナリ単位で測定されます。df -H
コマンドは1,000をベースとして使用し、ディスクパーティションの使用率はKB、MB、GBなどの小数単位で測定されます。
たとえば、パーティションの実際のサイズは40 GiBです。 df -h
コマンドを実行すると、パーティション容量として40G
が返される場合があります。 df -H
コマンドを実行すると、パーティション容量として42G
が返される場合があります。 これは、40 × 1024 ^ 3バイトを1000 ^ 3で割った値が約42.95 GBに等しいためである。
原因
問題1: df -h
コマンドの出力に表示される合計容量 (サイズ) は、ECSコンソールでディスク用に購入した容量と異なります
ファイルシステムのオーバーヘッド
200 GiBクラウドディスクを購入し、そのディスクをフォーマットした後、そのディスクをLinux ECSインスタンスに接続した場合、合計容量は約197 GiBにすぎないことがわかります。 この問題は、ファイルシステムの作成時に追加のデータ構造が生成されるために発生します。 データ構造はディスク領域を占有します。 データ構造が少量のディスク領域を占有する場合でも、データ構造は総容量に影響を与えます。
問題2: 使用済みスペース (used) と使用可能スペース (Avail) の合計は、総容量 (Size) とは異なります
ほとんどの場合、inodeがディスク領域を占有するか、ディスク領域の量がシステムによって予約されているために問題が発生します。 inodeによって占有されるディスク容量またはシステムによって予約された容量を計算する方法については、このトピックのトラブルシューティング方法のセクションを参照してください。
ノードの消費量
ファイルシステムは、各ファイルにiノードを割り当てて、許可や所有者などのファイル属性を記録します。 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
などの実際のパーティション名に置き換えます。
次のコマンド出力が返されます。
次の式を使用して、システムが予約しているディスク容量を計算することもできます。