Linux インスタンス上でアプリケーションやサービスが稼働し続けると、ログ、キャッシュ、業務データなどのファイルが生成されます。 時間の経過とともに、これらのファイルがディスク領域を消費し尽す場合があります。 ディスク領域が枯渇すると、新しいデータを書き込めなくなり、サービスの中断や不具合を引き起こす原因となります。
現象
Linux インスタンスでファイルの作成やアプリケーションの実行を行うと、No space left on device というエラーが表示されます。これは、ディスク領域が枯渇していることを示しています。
原因と解決策
作業を開始する前に、スナップショットを作成してデータバックアップすることで、不慮のデータ損失を回避できます。
1. ディスク領域の枯渇
ディスク使用率を確認します。
sudo df -hを実行し、マウントポイントごとのディスク使用率を確認します。Use%が 100% の領域が枯渇状態です。不要なファイルやディレクトリをクリーンアップします。
sudo du -sh <directory_name>/*コマンドで特定のディレクトリ内のファイルとサブディレクトリのサイズを確認します。必要に応じて、サブディレクトリに移り、階層ごとの使用量を確認してください。例:
sudo du -sh /mnt/*を実行して、/mntディレクトリ内のファイルとサブディレクトリのサイズを確認します。クリーンアップ後もディスク領域が不足している場合は、ディスクのサイズを変更できます。
2. Inode リソースの枯渇
各ファイルは 1 つの inode を占有します。小さなファイルが大量に存在するディスクでは、ディスク領域に空きがあっても Inode が枯渇すると、新しいファイルを作成できなくなる場合があります。
inode の使用率を確認します。
sudo df -iコマンドを実行します。IUse%列が 100% の場合、すべての inode リソースが枯渇しています。不要なファイルやディレクトリをクリーンアップします。
sudo du -sh --inodes <folder_name>/*コマンドを実行して、特定のディレクトリ内のファイルとサブディレクトリが使用している inode の数を確認します。必要に応じて、サブディレクトリに移り、このコマンドで各階層の inode 使用状況を確認できます。例:
sudo du -sh --inodes /mnt/*を実行して、/mntディレクトリ内のファイルとサブディレクトリが使用している inode の数を確認します。クリーンアップ後も inode の数が不足している場合は、ディスクのサイズを変更できます。
3. 使用中の削除済みファイルによるディスク領域の占有
ファイルが削除されても、プロセスがそのファイルを使用している (つまり、ファイル記述子を保持している) 限り、ファイルが占有していたディスク領域は解放されません。ディスク領域は、プロセスが終了するかファイルを閉じた後にのみ解放されます。
lsofツールをインストールします。dfやduコマンドでは、領域を占有し続けている削除済みファイルを特定できません。このようなファイルは、lsofツールで一覧表示できます。Alibaba Cloud Linux および CentOS
sudo yum install -y lsofDebian および Ubuntu
sudo apt install -y lsof削除済みファイルが保持しているストレージ領域を確認します。
sudo lsof | grep delete | sort -k7 -rn | more出力の 7 列目はファイルサイズ (単位:バイト) を示します。これらの値を合計することで、未解放の領域の総量を算出できます。

プロセス名と PID を控えます。
sudo lsof | grep deleteを実行し、COMMAND列とPID列のプロセス名と PID を控えてください。関連サービスを再起動または停止します。
sudo ps -ef | grep <PID>を実行してプロセスの役割を確認します。その後、影響を評価した上でサービスを再起動または停止してください。重要サービスの再起動や停止は業務に影響を及ぼす可能性があります。 事前に影響を評価し、適切なメンテナンスウィンドウ内で実施してください。
4. 別のマウントによるマウントポイントの隠蔽
デバイスを空でないディレクトリにマウントすると、そのディレクトリに元々存在していた内容は不可視になります。 ただし、そのディレクトリをすでに開いていたプロセスは引き続きデータを書き込めます。 この「隠れた」領域の消費は df コマンドでは検出できず、予期せぬディスク領域の枯渇につながる場合があります。
重複するマウントポイントを確認します。
sudo lsblkを実行し、MOUNTPOINT列で複数のデバイスが同じディレクトリにマウントされていないか確認してください。sudo lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 253:0 0 40G 0 disk ├─vda1 253:1 0 2M 0 part ├─vda2 253:2 0 200M 0 part /boot/efi └─vda3 253:3 0 39.8G 0 part / vdb 253:16 0 40G 0 disk └─vdb1 253:17 0 40G 0 part /mnt vdc 253:32 0 40G 0 disk └─vdc1 253:33 0 40G 0 part /mntこの例では、パーティション
vdb1とvdc1の両方が/mntにマウントされており、マウントポイントが隠されるリスクがあります。ファイルシステムをアンマウントします。
重要ファイルシステムをアンマウントすると、そのパスに依存するサービスが中断される可能性があります。リスクを評価し、適切なメンテナンスウィンドウ内でこの操作を実施してください。
<duplicate_mount_point>は前の手順で取得できます。sudo umount <duplicate_mount_point>この例では、
/mntが重複するマウントポイントです。sudo umount /mntを実行すると、最後にマウントされたデバイスvdc1がアンマウントされます。下層のマウントポイントのデバイスを特定します。
sudo df -hを実行して、現在表示されているマウントポイントのデバイス名を特定します。sudo df -hFilesystem Size Used Avail Use% Mounted on devtmpfs 3.7G 0 3.7G 0% /dev tmpfs 3.7G 0 3.7G 0% /dev/shm tmpfs 3.7G 524K 3.7G 1% /run tmpfs 3.7G 0 3.7G 0% /sys/fs/cgroup /dev/vda3 40G 4.5G 33G 12% / /dev/vda2 200M 5.8M 194M 3% /boot/efi /dev/vdb1 40G 40G 0 100% /mnt tmpfs 747M 0 747M 0% /run/user/0この例では、現在
/mntにマウントされているデバイスは/dev/vdb1です。ディスク領域不足の問題を解決します。
以前に隠されていた領域から不要なファイルやディレクトリをクリーンアップします。
この例では、
vdb1からマウントされた/mntディレクトリをクリーンアップする必要があります。クリーンアップ後も領域が不足している場合は、ディスクのサイズを変更し、別の空のディレクトリにマウントします。
この例では、サイズ変更の対象となるデバイスは
vdb1です。
複数のデバイスを同じディレクトリにマウントしないでください。
複数のデバイスを同じディレクトリにマウントすると、先にマウントされたデバイスの領域が隠蔽され、データが誤ったデバイスに書き込まれる原因になります。この問題を回避するため、各デバイスは常に一意の空のディレクトリにマウントしてください。
5. Docker リソースによる大量のディスク領域消費
Docker の操作により、多くの中間イメージ、停止したコンテナー、ビルドキャッシュが生成されることがあります。時間の経過とともに、これらのオブジェクトが蓄積し、ディスク容量を消費します。
Docker ファイルのディスク容量使用率を確認します。
sudo df -hコマンドを実行します。Filesystemがoverlayとなっている項目でUse%が 100% に達している場合、Docker が領域を消費していることを示します。ディスク領域を使用している Docker リソースを特定します。
sudo docker system dfコマンドを実行します。Size列とRECLAIMABLE列を確認して、領域の消費状況を特定します。sudo docker system dfTYPE TOTAL ACTIVE SIZE RECLAIMABLE Images 21 9 13.94GB 10.66GB (76%) Containers 9 5 30.09MB 0B (0%) Local volumes 6 6 259.9MB 0B (0%) Build Cache 0 0 0B 0Bこの例では、
Dockerイメージが 13.94 GB を使用しており、そのうち 10.66 GB が再利用可能です。未使用のイメージのクリーンアップを優先することを推奨します。不要なファイルをクリーンアップします。
Docker ファイルをクリーンアップできない場合は、「1. ディスク容量の枯渇」の手順に従って問題を解決してみてください。
停止したすべてのコンテナーを削除するには、
sudo docker container pruneを実行します。すべての dangling イメージ (タグのないイメージ) を削除するには、
sudo docker image pruneを実行します。未使用のビルドキャッシュを削除するには、
sudo docker builder pruneを実行します。
6. inotify watches の上限到達
sudo tail -f のようなコマンドを実行すると、tail: cannot watch '...': No space left on device というエラーが表示されることがあります。このエラーはディスク領域の不足を示すものではなく、ファイルやディレクトリの変更を追跡するために使用される inotify watches の上限に達したことを意味します。この上限値を引き上げる必要があります。
現在の
inotify watchesの上限を確認します。sudo cat /proc/sys/fs/inotify/max_user_watchesを実行して、inotify watchesの現在の上限を確認します。inotify watchesの上限値を引き上げます。上限値を引き上げると、inotify がより多くのシステムメモリを使用する可能性があります。変更を行う前に、この点を慎重に評価してください。
<new_limit_value>は 524288 以下に設定することを推奨します。sudo sh -c "echo fs.inotify.max_user_watches=<new_limit_value> >> /etc/sysctl.conf"新しい設定をロードします。
sudo sysctl --systemを実行して新しい設定をロードし、変更を適用します。新しい設定を確認します。
sudo cat /proc/sys/fs/inotify/max_user_watchesを再度実行し、inotify watchesの上限が期待する値に更新されたことを確認します。
関連ドキュメント
画像、動画、アーカイブなどの大量の静的ファイルを保存するには、Object Storage Service (OSS) の使用を推奨します。
高性能かつ高並列なファイル共有が必要な場合は、File Storage NAS の使用をご検討ください。
大規模なログ収集と分析のために、ログを Simple Log Service (SLS) に保存することで、ログのクエリを簡素化し、ストレージ消費を削減できます。