CentOSでのディスククォータ管理:ユーザーとグループのストレージ容量を制限するヒント

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

現実の問題:CentOSサーバーのディスク容量が突然「息切れ」したとき

ITに携わる皆さんなら、平和な日常の中でサーバーの容量不足アラートを受け取ったり、さらに悪いことにシステムが重くなり始めたり、最悪の場合サービスが停止したりする状況には慣れているでしょう。そんな時、最初にすることはdf -hコマンドを実行して、どのパーティションが最も「食い荒らされている」かを確認することです。

以前の会社で働いていた頃、内部サービスを実行しているCentOS 7サーバーがいくつかありました。時々、ある開発担当者が誤って数ギガバイトのログファイルや大量のデータを自分のホームディレクトリにアップロードし、それに気づかないという状況に遭遇しました。ディスクが満杯になり、システムが遅くなり始め、さらにはサービスがクラッシュして初めて、慌てて確認することになります。これは処理時間を無駄にするだけでなく、他の多くの人々の業務にも直接影響を与えます。

多くの企業では、いまだにCentOS 7で稼働しているサーバーがいくつかあります。AlmaLinuxへの移行はすでに解決された課題です。しかし、CentOS 7であれAlmaLinuxであれ、リソース管理、特にストレージスペースの管理は常に最優先事項です。厳格な制御メカニズムがなければ、個人またはグループが簡単に過剰なリソースを占有してしまう可能性があります。これはバランスを崩し、システム全体に悪影響を及ぼします。

原因分析:なぜ容量の「制御不能」に陥るのか?

上記のような状況に至る主な原因は、多くの場合、積極的なストレージスペース管理および制限メカニズムの欠如です。デフォルトでは、CentOS(または任意のLinuxオペレーティングシステム)でユーザーを作成すると、ホームディレクトリや書き込み権限のある任意のディレクトリにデータを保存できます。しかし、容量制限はデフォルトでは適用されていません。

  • 積極的な対策の欠如: 管理者は、問題が発生してから(ディスクが満杯になってから)対応することが多く、事前の予防策を講じていません。
  • ユーザーの意識不足: 多くのユーザー、特にシステムに詳しくないユーザーは、自分が使用している容量とそのシステム全体への影響を認識していません。
  • 自動制御ツールの不在: du -shdf -hによる手動チェックは一時的な解決策に過ぎず、悪用を自動的に防ぐことはできません。
  • 不公平なリソース割り当て: 制限がない場合、一部のユーザーが意図せず、または意図的にスペースの大部分を占有してしまう可能性があります。これにより、他のユーザーが作業するのに十分なスペースがなくなってしまいます。

結果はディスクの満杯にとどまりません。システムパフォーマンスの低下、データ損失のリスク、バックアップや復旧の困難さも引き起こします。さらに、これはセキュリティ上の脆弱性を生み出し、攻撃者がディスクをいっぱいにすることでサービス妨害(DoS)攻撃を実行することを可能にする可能性があります。

解決策(そしてなぜそれが最善ではないのか)

容量の問題に直面したとき、いくつかの解決策が一般的に考えられます。

1. 手動での確認とリマインダー

これは、始めたばかりの頃に最も一般的な方法です。定期的に、管理者はdu -sh /home/*のようなコマンドを使用して、どのユーザーが最も多くの容量を占有しているかを確認し、その後、メールやチャットでクリーンアップを促します。

利点: シンプルで、複雑な設定は不要です。

欠点: 時間がかかり、見落としやすく、受動的で、積極的に防ぐことはできません。ユーザーが忘れたり協力しなかったりする可能性があり、管理者はこの作業を継続的に繰り返す必要があります。明らかに、これはスケーラブルな解決策ではありません。

2. 自動チェックおよび通知スクリプトの作成

次のステップは、cronジョブで定期的に実行されるシェルスクリプトを開発し、各ユーザーまたは各ディレクトリの容量を自動的にチェックすることです。あるしきい値を超えた場合、スクリプトはそのユーザーと管理者の両方に通知メールを送信します。

利点: 部分的に自動化され、手作業の労力を削減できます。

欠点: やはり受動的な対策です。スクリプトは通知するだけで、ユーザーがファイルをさらに作成するのを防ぎません。ユーザーはメールを読んでクリーンアップするまで、引き続き悪用することができます。場合によっては、他のユーザーのファイルを削除するにはroot権限が必要となり、これは常に最適または安全ではありません。

3. ディスククォータの導入

これこそが、私たちがご紹介したい最も積極的で効果的な解決策です。ディスククォータはオペレーティングシステムの機能です。これにより、管理者は特定のファイルシステム上でユーザーまたはグループが使用できるストレージスペース(ブロック)とファイル数(inode)を制限できます。

利点:

  • 積極的な防止: ユーザーが制限を超えるのを防ぎ、最初からディスク満杯の状態を回避します。
  • 公平な割り当て: 各ユーザー/グループが一定のストレージスペースを確保できるようにし、一部のユーザーによる過剰な占有を防ぎます。
  • システム安定性: サーバーのパフォーマンスと安定性を維持するのに役立ちます。
  • 管理の容易さ: 設定後、管理がよりシンプルになり、労力が少なくて済みます。

最善の方法:CentOSでのディスククォータ導入ガイド

CentOSでディスククォータを導入するには、以下の手順を実行します。ここでは、通常ユーザーデータが格納される/homeパーティションでの容量制限を例に説明します。

ステップ1:クォータパッケージの確認とインストール

まず、quotaパッケージがシステムにインストールされていることを確認してください。


rpm -qa | grep quota

結果がない場合やパッケージが不足している場合は、インストールする必要があります。


sudo yum install quota -y

ステップ2:ファイルシステムでのクォータの有効化

クォータを機能させるには、usrquota(ユーザー用)とgrpquota(グループ用)オプションを適用したいパーティションに追記するため、/etc/fstabファイルを編集する必要があります。

お好みのエディタ(例:viまたはnano)で/etc/fstabファイルを開きます。


sudo vi /etc/fstab

クォータを適用したいパーティション(例:/home)の設定行を探します。この行は通常、以下の形式です。


/dev/mapper/centos-home /home                   xfs     defaults        0 0

またはext4の場合:


/dev/sda1               /home                   ext4    defaults        1 2

defaultsの部分にusrquotagrpquotaをカンマで区切って追加する必要があります。他のオプションがすでに存在する場合は、それらの後に追記してください。


/dev/mapper/centos-home /home                   xfs     defaults,usrquota,grpquota        0 0

編集後、ファイルを保存して終了します。変更を有効にするには、ファイルシステムを再マウントする必要があります。最も安全な方法はサーバーを再起動することですが、ダウンタイムを避けるために、次のように再マウントできます。


sudo mount -o remount /home

注: XFSファイルシステム(CentOS 7以降では通常デフォルト)を使用している場合、usrquotagrpquotaオプションで十分です。ext4の場合、カーネルがサポートしていることを確認する必要があります。

ステップ3:クォータデータベースファイルの作成

次に、設定したパーティションにクォータ用のデータベースファイルを作成する必要があります。quotacheckコマンドはファイルシステムをスキャンし、データベースファイルを作成します。これらのファイルはaquota.useraquota.group(または古いext4の場合はquota.userquota.group)で、パーティションのルートディレクトリに配置されます。


sudo quotacheck -cug /home
  • -c: 新しいデータベースファイルを作成します。
  • -u: ユーザー用のデータベースをスキャンして作成します。
  • -g: グループ用のデータベースをスキャンして作成します。

スキャンプロセスの詳細を表示するには、-vを追加できます。

ステップ4:ユーザー/グループのクォータ制限の設定

これは最も重要なステップです。ユーザーまたはグループに制限を設定します。edquotaコマンドを使用します。

ユーザーの設定:


sudo edquota -u <username>

例として、ユーザーitfromzeroに設定する場合:


sudo edquota -u itfromzero

このコマンドは、以下のような内容でエディタ(通常はvi)を開きます。


Disk quotas for user itfromzero (uid 1001):
  Filesystem             blocks       soft       hard     inodes     soft     hard
  /dev/mapper/centos-home  0          0          0          0          0          0

各列の説明:

  • blocks: ユーザーが現在使用しているブロック数。
  • soft: ソフトリミット。ユーザーはこの制限を一定期間(猶予期間)超過することができます。
  • hard: ハードリミット。ユーザーはこの制限を超過することはできません。ハードリミットに達すると、それ以上データを書き込むことはできません。
  • inodes: ユーザーが現在使用しているファイル/ディレクトリ(inode)の数。
  • inodes soft / inodes hard: ブロックと同様ですが、ファイル/ディレクトリの数に適用されます。

単位はKMGの接尾辞を追加することで、KB、MB、GBで設定できます。例えば、ユーザーitfromzeroに対して、データブロックのソフトリミットを1GB、ハードリミットを1.2GBに設定します。同時に、ファイル数のソフトリミットを50,000ファイル、ハードリミットを60,000ファイルに設定します。


Disk quotas for user itfromzero (uid 1001):
  Filesystem             blocks       soft       hard     inodes     soft     hard
  /dev/mapper/centos-home  0          1G         1.2G       0          50000    60000

エディタを保存して終了します。

グループの設定:

ユーザーと同様に、グループにも制限を設定できます。


sudo edquota -g <groupname>

例:


sudo edquota -g developers

設定方法はユーザーの場合と同様です。

猶予期間(Grace Period)の設定:

猶予期間とは、ソフトリミットがハードリミットになる前に、ユーザーがソフトリミットを超過することを許容される期間です。この期間は以下のコマンドで設定できます。


sudo edquota -t

これにより、以下のようなファイルが開きます。


Grace period before enforcing soft limits for users:
Time units may be: days, hours, minutes, seconds
  Filesystem             Block grace period       Inode grace period
  /dev/mapper/centos-home 7days                    7days

7days3days2hoursなどに変更できます。例えば、ユーザーがクリーンアップするのに十分な時間を与えるため、一般的な期間として5daysが設定されます。

ステップ5:クォータの有効化

制限の設定が完了したら、パーティションでクォータを有効にする必要があります。


sudo quotaon /home

クォータを無効にするには、quotaoff /homeを使用します。

ステップ6:クォータの状態確認

クォータが機能しているか、および制限が正しく適用されているかを確認するには、以下のコマンドを使用します。

すべてのパーティションの概要を確認:


sudo repquota -a

出力には、有効化されているすべてのパーティションのクォータ状態が表示されます。

特定のユーザーのクォータを確認:


sudo quota -s itfromzero

このコマンドは、ユーザーitfromzeroが使用している容量とファイル数が、その制限と比較して詳細に表示されます。


Disk quotas for user itfromzero (uid 1001):
     Filesystem  blocks   soft   hard  inodes   soft   hard
  /dev/mapper/centos-home     4K     1G   1.2G      1     50K    60K

ユーザーがソフトリミットを超過した場合、blocksまたはinodesの列に+が表示され、猶予期間がカウントダウンされます。

実用的なヒントとベストプラクティス

  • 適切な場所への適用: クォータは、通常、ユーザーデータや特定のアプリケーションのデータが格納されるパーティション(例:/home/var/www/srv)に適用すると最も効果的です。システム管理を複雑にする可能性があるため、本当に必要でない限り、ルートパーティション/には適用しないようにしてください。
  • ユーザーへの教育: クォータを設定した後でも、これらの制限についてユーザーに通知し、説明することが非常に重要です。彼らは、作業の中断を避けるために、その理由と自分の容量を確認する方法を知る必要があります。
  • 定期的な監視: クォータは自動的に機能しますが、repquota -aで定期的にチェックし、全体の状況を把握し、必要に応じて調整することをお勧めします。
  • edquota -pを使用したテンプレート作成: 複数のユーザーに同じ制限を適用する必要がある場合、テンプレートユーザーに設定を構成できます。その後、edquota -p <template_user> <user1> <user2> ...コマンドを使用して設定をコピーします。この方法は、非常に多くの時間を節約できます。
  • XFSクォータ: CentOS 7以降のバージョンでは、/のデフォルトファイルシステムは通常XFSです。したがって、XFSを使用する場合は、従来のquotaではなくxfs_quotaを使用できます。基本的な設定方法は似ていますが、コマンドは少し異なります。例:xfs_quota -x -c 'limit bsoft=1g bhard=1.2g itfromzero' /home
  • Inode制限の検討: ユーザーによっては、多くの容量を占有していなくても、非常に多くの小さなファイル(例:キャッシュファイル、セッションログ)を作成する場合があります。Inodeの制限は、この状況を制御し、ファイルシステムのリソースの浪費を防ぐのに役立ちます。

結論

CentOSでのディスククォータ管理は、特にマルチユーザー環境や共有サーバー環境において、システム管理者にとって不可欠なスキルです。ストレージスペースを積極的に制限することで、ディスク満杯による問題を防ぐだけでなく、リソースの公平な割り当てを確保し、システム全体のパフォーマンスと安定性を維持することができます。

Share: