午前2時14分の緊急事態
午前2時14分、私のスマートフォンがPagerDutyのアラートで震えました。それはシステム管理者なら誰もが恐れるメッセージでした。CRITICAL: No space left on device (ENOSPC)(デバイスに空き領域がありません)。私たちの主要な共有開発サーバーがダウンしたのです。SSHでログインし、/var/logが肥大化しているか、巨大な一時ファイルがあるのだろうと予想しました。しかし、df -hを実行すると、/homeパーティションが容量100%になっていました。
du -sh /home/*でホームディレクトリをスキャンしたところ、犯人が判明しました。あるジュニアデベロッパーが再帰的なバックアップスクリプトを実行し、わずか20分足らずで450GBもの生センサーデータを自分のホームフォルダにダンプしていたのです。リソース管理(ガバナンス)が欠由していたため、たった一人のユーザーがチーム全体のワークフローを停止させてしまいました。メールサーバーは止まり、cronジョブは失敗し、システムはテキストドキュメントを保存するためのロックファイルを作成することさえできなくなりました。
制限がないとファイルシステムが故障する理由
Linuxはデフォルトでは非常に寛容です。ユーザーがリソースを責任を持って共有することを前提としています。しかし、本番環境において「善意」に頼ることは災いの元です。ディスクがいっぱいになると、カーネルはメタデータを書き込むことができず、アプリケーションは即座にクラッシュします。これはシステム全体の完全な麻痺を引き起こします。
深夜に発生したこのインシデントの根本的な原因は、単なるバグのあるスクリプトではなく、ディスククォータ(Disk Quotas)が設定されていなかったことにあります。クォータがない状態では、ファイルシステムはすべてのユーザーを全空き容量の共同所有者として扱います。これを防ぐには、境界を強制する必要があります。「ユーザーAには10GB、ユーザーBには20GB、そして『Dev』グループには合計100GBを割り当てる」といった指示をカーネルに伝えるシステムが必要です。
適切なツールの選択
ストレージ制限を処理する方法はいくつかあります。LVMを使用してユーザーごとに個別のパーティションを作成することもできますが、500もの個別のボリュームを管理するのは悪夢です。XFSには独自の組み込みクォータツールがあり、ハイパフォーマンスな構成には優れています。しかし、Ubuntu 22.04やDebianのような標準的なext4ベースのシステムでは、古典的なquotaパッケージが最も信頼性が高く、十分に検証されたソリューションであり続けています。
8GBのRAMと2,000人のアクティブユーザーを抱える本番サーバーで運用した際、このカーネルレベルのアプローチによるCPU使用率は無視できるほど微々たるものでした。5分ごとにディスク使用量を監視するカスタムbashスクリプトを実行するよりもはるかに効率的です。ファイルシステムレベルで動作するため、ユーザーがファイル名を変更したり、深いサブディレクトリに隠したりしても、制限を回避することはできません。
ディスククォータの実装ステップ
二度と午前2時14分に呼び出されないようにするため、私は標準的なクォータシステムを導入しました。皆さんのサーバーでも、約10分で設定を完了できます。
ステップ 1: ユーティリティのインストール
カーネルと通信するためのユーザースペースツールが必要です。UbuntuまたはDebianでは、次のコマンドでインストールします。
sudo apt update
sudo apt install quota quotatool -y
ステップ 2: ファイルシステムテーブルの更新
カーネルは、どのパーティションの使用量を追跡すべきかを知る必要があります。/etc/fstabを開き、制限したいパーティション(/homeなど)を見つけます。
# /etc/fstabの元の行:
UUID=xxxx-xxxx /home ext4 defaults 0 2
# ユーザーおよびグループクォータ用に修正した行:
UUID=xxxx-xxxx /home ext4 defaults,usrquota,grpquota 0 2
usrquotaとgrpquotaを追加することで、次回のマウント時にユーザー単位およびグループ単位でのディスク使用量の追跡を開始するようシステムに指示します。
ステップ 3: クォータデータベースの初期化
サーバーを再起動する必要はありません。ファイルシステムを再マウントして、変更を即座に適用します。
sudo mount -o remount /home
次に、クォータインデックスファイル(aquota.userとaquota.group)を作成します。quotacheckコマンドはディスクをスキャンし、システム上のすべてのファイルの現在の使用量を計算します。
sudo quotacheck -cum /home
-c: 新しいクォータファイルを作成します。-u: ユーザーレベルのクォータをチェックします。-m: 読み取り専用として再マウントせずにチェックを実行します。
最後に、システムを有効化します。
sudo quotaon -v /home
ステップ 4: edquotaによる制限の設定
edquotaコマンドを実行すると、VimやNanoなどのデフォルトのテキストエディタで一時ファイルが開き、そこで具体的な制限を定義できます。
sudo edquota -u developer_name
設定内容は以下のようになります:
Disk quotas for user developer_name (uid 1001):
Filesystem blocks soft hard inodes soft hard
/dev/sda2 409600 1048576 1258291 5 0 0
これらのカラムを理解することが重要です:
- blocks: 現在の使用容量(1KBブロック単位)。
- soft (limit): 警告のしきい値。ユーザーはこの制限を一時的に超えることができますが、「猶予期間(通常は7日間)」が設定されます。
- hard (limit): 絶対的な上限。ユーザーがこの数値に達すると、システムはすべての書き込み操作をブロックします。
- inodes: ファイルの総数。これにより、ユーザーが大量の空ファイルを作成してファイルシステムのメタデータ容量を使い果たすのを防ぎます。
この例では、ソフト制限を1GB(1,048,576 KB)、ハード制限を1.2GB(1,258,291 KB)に設定しています。
ステップ 5: 猶予期間の調整
ソフト制限に達した後、ユーザーがファイルを削除するまでに与えられる時間を変更するには、タイマーコマンドを使用します。
sudo edquota -t
私は通常、本番環境ではこれを48時間に設定しています。これにより、デベロッパーが平日の勤務時間中に対応するのに十分な時間を確保しつつ、ディスクが危険なほど満杯な状態が長く続くのを防ぐことができます。
ストレージの監視
制限を設定することは最初のステップに過ぎません。誰が容量上限に近づいているかを確認する必要もあります。repquotaコマンドを使用すると、ファイルシステム上のすべてのユーザーのクリーンなサマリーが表示されます。
sudo repquota -s /home
-sフラグは、生のブロック数を人間が読みやすいMBやGBに変換します。私はよくこの出力を週次のcronジョブにパイプして、組織内のディスク消費量トップ10を特定しています。
プロセスの自動化
新入社員ごとに手動でedquotaを実行するのは面倒です。すべての新しいデベロッパーに対して標準の5GB制限を適用したい場合は、「プロトタイプ」ユーザーを使用して設定を即座にコピーできます。
sudo edquota -p template_user new_user
このコマンドは、template_userの制限をnew_userに1秒で複製します。これにより一貫性が確保され、オンボーディング時の設定ミスを防ぐことができます。
これらのクォータを導入して以来、ユーザーが原因で「No space left on device」エラーが発生したことは一度もありません。誰かが制限に達しても、システムはその特定のユーザーの書き込み操作のみを停止します。OSの残りの部分や他のチームメンバーは、中断することなく作業を続けることができます。これはシンプルで古風なツールですが、プロのLinux管理者にとって必須のツールキットであり続けています。

