fstabを監査して直す
目標
壊れたfstabをルールに従って監査し、直し、自分で検証スクリプトを作成します。
なぜ重要なのか
fstabは、システムで最も危険なファイルの1つです。間違って書くと起動の途中で止まり、コンソールのないクラウドインスタンスなら、打つ手がありません。特に、6番目のフィールドであるpass(fsckの順序)がよく間違われます。ルートではないのに1を指定したり、ネットワークファイルシステムに0以外の値を指定したりすると、起動が止まります。そしてnofailがないと、データディスクが1つ壊れたときにサーバー全体が立ち上がりません。実務では、再起動の前に必ず検証します。再起動して確認するのは、確認ではなく賭けです。
このラボで使うルール
- ルールA: すべてのエントリ行は、ちょうど6個のフィールドを持っている必要があります
- ルールB:
passの値は、ルート(/)だけが1、それ以外のローカルファイルシステムは2、ネットワーク/仮想ファイルシステム(nfs、nfs4、tmpfs)は0です - ルールC: 同じマウントポイントが2回現れてはいけません
- ルールD:
dumpとpassは数字である必要があります
ステップ
/root/fstabディレクトリを作成し、/opt/fixtures/st-fstab/fstab.brokenを/root/fstab/work.tabにコピーしてください。- コメントと空行を除いた各エントリを、
장치,마운트지점,타입,옵션,dump,passのCSV(プレースホルダーは順に、デバイス、マウントポイント、タイプ、オプション、dump、passです)に変換して、/root/fstab/fields.csvに保存してください。フィールドが足りない行は、あるものだけを書いてください。 - 上の4つのルールに違反している行番号を、昇順に1行に1つずつ
/root/fstab/audit.txtに書いてください。行番号は、コメントを含めてファイルの先頭から1として数えます。 - すべての違反を直した
/root/fstab/fixed.tabを作成してください。元の正常なエントリはそのまま維持し、フィールドが足りない行は0 2で埋め、重複したマウントポイントのうち後のものは/var2に移し、誤ったpassの値はルールBに合わせて直してください。 fixed.tabで、デバイスのパス(/dev/...)で書かれたエントリを、UUID=1a2b3c4d-0004-4000-8000-000000000004の表記に変えてください。fixed.tabで、ルートではないすべてのローカルのエントリのオプションにnofailを追加し、/tmpのエントリのオプションにnoexec、nosuid、nodevをすべて追加してください。fixed.tabのNFSのエントリのオプションに、_netdev、soft、timeo=600、retrans=2がすべて入るようにしてください。/root/fstab/validate.shを作成してください。最初の引数としてfstabファイルのパスを受け取り、ルールA–Dを検査して、違反がなければ終了コード0、1つでもあれば0以外の値で終了する必要があります。採点ツールが、fixed.tab(通る必要があります)とfstab.broken(失敗する必要があります)の両方で実行します。
参考
awk 'NF && $1 !~ /^#/ {print}'で、コメントと空行を除外します。- 行番号が必要なら、
grep -nまたはawk '{print NR": "$0}'を使います。 - ステップ8のスクリプトはbashで書き、実行権限はなくてもかまいません(採点ツールが
bash validate.sh <파일>で実行します。プレースホルダーはファイル名です)。 - よくある間違い1: ステップ3で、重複したデバイスを問題として数える場合です。ルールはマウントポイントの重複です。
- よくある間違い2: ステップ8のスクリプトが引数を受け取らず、固定のパスを読む場合です。必ず最初の引数を使ってください。
作業用のコピーを作る
/root/fstabディレクトリを作成し、/opt/fixtures/st-fstab/fstab.brokenを/root/fstab/work.tabにコピーしてください。
元のフィクスチャには触れず、コピーで作業してください。行数が元と同じである必要があります。
フィールドをCSVに分解する
コメントと空行を除いた各エントリを、장치,마운트지점,타입,옵션,dump,passのCSV(プレースホルダーは順に、デバイス、マウントポイント、タイプ、オプション、dump、passです)に変換して、/root/fstab/fields.csvに保存してください。フィールドが足りない行は、あるものだけを書いてください。
コメントと空行は除外します。awkで6つのフィールドをカンマでつなげればよいです。
ルール違反の行を見つける
上の4つのルールに違反している行番号を、昇順に1行に1つずつ/root/fstab/audit.txtに書いてください。行番号は、コメントを含めてファイルの先頭から1として数えます。
4つのルールを1つずつ適用してみてください。行番号は、コメントを含めてファイルの先頭から数えます。
修正版の提出
すべての違反を直した/root/fstab/fixed.tabを作成してください。元の正常なエントリはそのまま維持し、フィールドが足りない行は0 2で埋め、重複したマウントポイントのうち後のものは/var2に移し、誤ったpassの値はルールBに合わせて直してください。
フィールドが足りない行は埋め、重複したマウントポイントは1つを別のパスに移し、誤ったpassの値はルールに合わせて直してください。
デバイス名をUUID表記にする
fixed.tabで、デバイスのパス(/dev/...)で書かれたエントリを、UUID=1a2b3c4d-0004-4000-8000-000000000004の表記に変えてください。
デバイスのパスで書かれたエントリが1つあります。UUID=表記に変えますが、値は任意に決めてかまいません。
安全なオプションの追加
fixed.tabで、ルートではないすべてのローカルのエントリのオプションにnofailを追加し、/tmpのエントリのオプションにnoexec、nosuid、nodevをすべて追加してください。
ルートではないローカルのエントリには、失敗しても起動を続けるオプションが、/tmpにはセキュリティオプションが3つ必要です。
NFSエントリの作成
fixed.tabのNFSのエントリのオプションに、_netdev、soft、timeo=600、retrans=2がすべて入るようにしてください。
ネットワークファイルシステムには、ネットワークの準備を待つオプションが必要で、passは検査しない値である必要があります。
検証スクリプトの作成
/root/fstab/validate.shを作成してください。最初の引数としてfstabファイルのパスを受け取り、ルールA–Dを検査して、違反がなければ終了コード0、1つでもあれば0以外の値で終了する必要があります。採点ツールが、fixed.tab(通る必要があります)とfstab.broken(失敗する必要があります)の両方で実行します。
採点ツールが、正常なファイルと不良のファイルの両方で実行します。正常なら0、問題があれば0以外の値で終了する必要があります。