このトピックでは、Ext4 ファイルシステムのディスク使用率が低い場合に「デバイスに空き容量がありません」というエラーメッセージが表示される問題の原因と解決策について説明します。
問題の説明
Ext4 ファイルシステムでファイルを作成すると、ディスク使用率が低いか、ディスク容量が使用可能であるにもかかわらず、デバイスに空き容量がありません というエラーメッセージが表示されます。
使用率が 1% の
/dev/vdbディスクを/mntマウントポイントにマウントします。Filesystem Type Size Used Avail Use% Mounted on ... /dev/vdb ext4 100G 308K 95G 1% /mnt/mntディレクトリに移動し、次のコマンドを実行してファイルを作成します。sudo touch testfile.txt次のエラーメッセージが表示されます。
touch: cannot touch 'testfile.txt': No space left on device
原因
Ext4 ファイルシステムを作成すると、システムは内部的に inode テーブルを保持します。ファイルまたはディレクトリが作成されるたびに、inode が使用されます。ファイルが小さく、ストレージ容量をあまり占有しない場合でも、inode テーブルの inode が使い果たされると、デバイスに空き容量がありません というエラーメッセージが表示される場合があります。その結果、Ext4 ファイルシステムにファイルまたはディレクトリを作成できなくなります。この問題は、Ext4 ファイルシステムに多数の小さなファイルが存在するシナリオでよく発生します。
解決策
次のいずれかの解決策を使用して、問題を解決します。
不要なデータを削除する
未使用の小さなファイルを削除して inode を解放し、ファイルまたはディレクトリを作成できるようにします。
利点:この解決策は簡単です。
欠点:この解決策は問題を一時的に解決する回避策であり、リスクを伴います。
ファイルストレージ方法を最適化する
特定のアプリケーションでは、複数の小さなファイルを大きなファイルに結合して inode の使用量を減らすか、複数の小さなファイルを圧縮パッケージに圧縮してディスク容量と inode を節約することをお勧めします。
利点:この解決策は、
inodeの使用量を大幅に削減し、ファイル管理を簡素化できます。欠点:この解決策は、個々のファイルへのアクセスの複雑さを増す可能性があります。
ファイルシステムの inode 数を増やす
この解決策では、ファイルシステムを再作成するため、ディスク上の既存のデータが消去されます。データの損失を防ぐために、この解決策を使用する前にディスクデータをバックアップしてください。ディスクデータのバックアップ方法については、「スナップショットを作成する」をご参照ください。
inode の密度を増やして、inode の数を増やします。
利点:この解決策は、
inode密度の構成に柔軟性をもたらします。欠点:不適切な操作はデータの損失につながる可能性があり、運用上のリスクが高くなります。
inode が頻繁に使い果たされる場合は、ファイルシステムを再フォーマットし、再フォーマットプロセス中に inode の密度を調整することを検討してください。次の例では、/mnt マウントポイントにマウントされている /dev/vdb ディスクを使用します。
ディスクデータをバックアップします。詳細については、「スナップショットを作成する」をご参照ください。
/mntにマウントされているファイルシステムをアンマウントするには、次のコマンドを実行します。sudo umount /mnt/dev/vdbディスクに Ext4 ファイルシステムを作成するには、次のコマンドを実行します。<bytes-per-inode>は inode の密度を指定します。値が小さいほど、inode密度が高いことを示します。sudo mkfs.ext4 -i <bytes-per-inode> /dev/vdb<bytes-per-inode>のデフォルト値は 16 KB です。ファイルシステムに多数の小さなファイルが存在する場合は、<bytes-per-inode>の値を小さくして、inode密度と inode の数を増やすことができます。たとえば、<bytes-per-inode>を 4 KB に設定します。sudo mkfs.ext4 -i 4k /dev/vdb