TT Lab
はじめる
学ぶ 学習パス コース

ストレージとマウント

fstabを監査して直す

TT Labで続きを見る

目標

壊れたfstabをルールに従って監査し、直し、自分で検証スクリプトを作成します。

なぜ重要なのか

fstabは、システムで最も危険なファイルの1つです。間違って書くと起動の途中で止まり、コンソールのないクラウドインスタンスなら、打つ手がありません。特に、6番目のフィールドであるpass(fsckの順序)がよく間違われます。ルートではないのに1を指定したり、ネットワークファイルシステムに0以外の値を指定したりすると、起動が止まります。そしてnofailがないと、データディスクが1つ壊れたときにサーバー全体が立ち上がりません。実務では、再起動の前に必ず検証します。再起動して確認するのは、確認ではなく賭けです。

このラボで使うルール

ステップ

  1. /root/fstabディレクトリを作成し、/opt/fixtures/st-fstab/fstab.brokenを/root/fstab/work.tabにコピーしてください。
  2. コメントと空行を除いた各エントリを、장치,마운트지점,타입,옵션,dump,passのCSV(プレースホルダーは順に、デバイス、マウントポイント、タイプ、オプション、dump、passです)に変換して、/root/fstab/fields.csvに保存してください。フィールドが足りない行は、あるものだけを書いてください。
  3. 上の4つのルールに違反している行番号を、昇順に1行に1つずつ/root/fstab/audit.txtに書いてください。行番号は、コメントを含めてファイルの先頭から1として数えます。
  4. すべての違反を直した/root/fstab/fixed.tabを作成してください。元の正常なエントリはそのまま維持し、フィールドが足りない行は0 2で埋め、重複したマウントポイントのうち後のものは/var2に移し、誤ったpassの値はルールBに合わせて直してください。
  5. fixed.tabで、デバイスのパス(/dev/...)で書かれたエントリを、UUID=1a2b3c4d-0004-4000-8000-000000000004の表記に変えてください。
  6. fixed.tabで、ルートではないすべてのローカルのエントリのオプションにnofailを追加し、/tmpのエントリのオプションにnoexec、nosuid、nodevをすべて追加してください。
  7. fixed.tabのNFSのエントリのオプションに、_netdev、soft、timeo=600、retrans=2がすべて入るようにしてください。
  8. /root/fstab/validate.shを作成してください。最初の引数としてfstabファイルのパスを受け取り、ルールA–Dを検査して、違反がなければ終了コード0、1つでもあれば0以外の値で終了する必要があります。採点ツールが、fixed.tab(通る必要があります)とfstab.broken(失敗する必要があります)の両方で実行します。

参考

作業用のコピーを作る

/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以外の値で終了する必要があります。