はじめに
現在LPIC level1の資格取得を目指している、ピカピカのエンジニア1年生です。
学習中に疑問に思ったことを備忘録として書き記してみました。
そのため、まだまだ知識不足な点も多く、記事内容に間違いや修正点があるかもしれませんが、温かい目で見守る、もしくはご指摘いただけると幸いです。
この記事を書いたきっかけ
LPIC の勉強をしていると、書籍には
設定ファイルは /etc に置かれる
とよく書かれています。
しかし、ユーザーの crontab ファイルは /etc ではなく /var/spool/cron に置かれていることに違和感を感じました。
- crontab って「設定ファイル」じゃない?
- 書籍には「設定は /etc に置かれる」と書いてあるのに?
- /var は「ログ」や「可変データ」の場所じゃないの?
どうやら調べてみると、
FHS の厳密なルールに「/etc ではなく /var に置く理由」が隠されていることが分かりました。
同じ疑問を持つ方が多いと思い、記事としてまとめました。
それぞれのディレクトリの定義と役割(FHS に基づく)
まずはそれぞれのディレクトリの意味を整理してみます。
■ /etc
FHS 3.0 の /etcの定義 によると、
"Host-specific system configuration files.”(ホスト固有のシステム設定)
つまり、「システム設定ファイル」が配置されます。
さらに
”it must be static and cannot be an executable binary.”
という記載があります。
これは、静的である必要があり、実行可能バイナリであってはならないということです。
Tips
実行バイナリとは、コンピュータが扱う「0」と「1」の2進数を基にしたデータ形式で、コンピュータが直接処理・実行できるデータのこと。
■ /var
FHS 3.0の/varの定義 によると、
"/var contains variable data files. ”
日本語に直すと、「/varには可変データファイルが含まれる。」という意味です。
要するに、
「/var」にはログファイルやspool(スプール)などの頻繁に書き換えられるファイルが配置される
ということになります。
■ /var/spool
FHS 3.0の /var/spool の定義 によると、
/var/spool contains data which is awaiting some kind of later processing.
翻訳すると、
「/var/spool には、後続の処理を待機しているデータが含まれる。」
という意味になります。
つまり、
将来、プログラム・ユーザー・管理者によって実行される予定のジョブデータ
が保存されます。
ユーザーの crontab が /var/spool/cron に置かれる3つの理由
ここからが本題です。
理由①:「/etc」は”静的な設定”の置き場だから
上記のFHSによると /etc の定義はこうです
静的なシステム設定ファイルを置く場所
ポイントは以下の通り
- 管理者が編集する
- システムの静的設定
- 変更頻度が低い
更新頻度が高いようなファイルはどうやら配置されなそうです。
理由②:ユーザーの crontabファイルは「頻繁に変更される動的データ」だから
ユーザーは crontab -e で「crontabファイル」を自由に編集することができるため、内容は頻繁に変わります。
crontab -e
-eオプションをつけて実行することでエディタを使用してユーザーのcrontabファイルを編集することができる。
-e : 環境変数EDITORで指定されているエディタを起動する
そして、FHS では /var の定義が
可変データ(variable data)を置く場所
となります。
よって
ユーザーごとの頻繁に更新される crontab は /etc ではなく /varに置くのが適切
ということになります。
理由③:crontab は “ジョブの待ち行列(spool)” として扱われるから
spool は「待ち行列」「キュー」に相当します。
FHS では /var/spool はこう定義されています。
ジョブキュー(メール、印刷など)のための領域
この分類に従うと、
ユーザーのジョブ=待ち行列で管理されるべきデータ
→/var/spool/cronに置かれるのが正しい。
まとめ
- /etc は「静的なシステム設定」
- /var は「変化するデータ」
- /var/spool は「実行待ちジョブの待ち行列」
ユーザーの crontab は 頻繁に変更されるジョブ設定 であり“キュー(spool)” として扱われる可変データ のため /var/spool/cron に置かれる
つまり、
設定ファイルっぽく見えても「動的データ」であるなら /etc には置かない
→ /var に置くのが FHS 的に正しい
ということです。
| 場所 | 役割 | 該当する crontab |
|---|---|---|
| /etc/crontab | 管理者が編集する静的な cron 設定 | システム全体の cron 設定 |
| /var/spool/cron/ユーザー | 変更が頻繁で Queue(spool)として管理される動的データ | ユーザーごとの cron ジョブ |
参考文献
FHS 3.0( https://refspecs.linuxfoundation.org/FHS_3.0/ )に基づきます
■ FHS 3.0
Section 3.7 /etc
Section 3.11 /var
Section 3.11.2 /var/spool