fsckのチェック間隔と正常性確認

■起動時のfsckのチェックを事前に知る。

$ sudo tune2fs -l /dev/sda1 | \
  grep -i "mount count\|last check\|check interval\|next check"
Mount count:              14
Maximum mount count:      26
Last checked:             Sun Oct 21 21:10:20 2012
Check interval:           15552000 (6 months)
Next check after:         Fri Apr 19 21:10:20 2013

■fstabの6番目のフィールドが0や未設定で無いファイルシステムが対象。
 以下の通り、ブートパーティションは1、それ以外は2がfsckのチェック対象となる。
 ※「nkf -f幅数」はfと幅数の間にスペースを入れないこと。

$ grep -v ^# /etc/fstab | \
  awk '($6>0){print}' | sed s/"UUID=[a-f0-9\-]* "/"UUID=[UUID] "/g
UUID=[UUID] /               ext3    errors=remount-ro 0       1

$ sudo fdisk -l /dev/sda | grep '  \*'
/dev/sda1   *           1        6079    48829536   83  Linux

$ man fstab | grep -A 4 " *6 *番目の.*プログラム" | nkf -Lu -d -w -f78;echo
 6 番目のフィールド (fs_passno) は fsck(8) プログラムが用い、 ブート時にファイ
ルシステムのチェックを実行する順序を 決定するために参照される。 ルートファイル
システムは fs_passno を 1 と明記する必要があり、 その他のパーティションは、 fs_
passno を 2 とする必要がある。 1 つのドライブ中のファイルシステムは順番にチェ
ックされる。 しかし、異なるドライブのファイルシステムは ハードウェアの並列性を
役立たせる為に 同時にチェックされる。 6 番目のフィールドが存在しないか 0 であ
る場合には 0 値が返り、 fsck はそのファイルシステムをチェックする必要がないと
みなす。

■fsckの時間によるチェック間隔。

$ man tune2fs 2> /dev/null | grep -A 3 interval | \
  tail -4 | sed s/"\]"/"&\n"/ | nkf -Lu -d -w -f80
 -i interval-between-checks[d|m|w]

 ファイルシステムをチェックする最大の時間間隔を設定する。 数値のみ、もしくは末尾
に d を付けると「日」と解釈され、 m, w  はそれぞれ「月」「週」と解釈される。 0
を指定すると、時間依存のチェックはしなくなる。

■デフォルトでは6ヶ月経ってfsckが呼ばれたらチェックされる。

$ echo "15552000/sec 60/sec 60/min 24/h 30/days" | \
  awk -F\/ '{print $1/60/60/24/30,"months"}'
6 months

■何ヶ月前にチェックされたのかを見たい場合。
 
$ LAST=$(sudo tune2fs -l /dev/sda1 | grep "^Last checked" | sed s/".*[dr]\: *"//)
$ echo $LAST
Sun Oct 21 21:10:20 2012
$ echo `date '+%s'` `date --date "$LAST" '+%s'` | awk '{print ($1-$2)/60/60/24/30,"months"}'
2.76354 months

■何ヵ月後にチェックされるのかを見たい場合。
 ただし、fsckのチェックが無効の場合、「Next check after」は過去の日付になっていることもある。
 その場合、時間によるチェック間隔は意味を持たないので出力しない。

$ TARGET=/dev/sda1; \
  NEXT=$(sudo tune2fs -l "$TARGET" | grep "^Next check" | sed s/".*[rd]\: *"//); \
  echo -n "Next check $TARGET "; \
  echo `date '+%s'` `date --date "$NEXT" '+%s'` | awk '{print ($2-$1)/60/60/24/30,"months"}' | \
  grep -v "\-";echo
Next check /dev/sda1 3.23413 months

■上記は何日後でも良い。

$ TARGET=/dev/sda1; \
  NEXT=$(sudo tune2fs -l "$TARGET" | grep "^Next check" | sed s/".*[rd]\: *"//); \
  echo -n "Next check $TARGET "; \
  echo `date '+%s'` `date --date "$NEXT" '+%s'` | awk '{print ($2-$1)/60/60/24,"days"}' | \
  grep -v "\-";echo
Next check /dev/sda1 97.0236 days

■fsckのチェック対象で無いと、マウント回数は最大マウント数よりも多いことがあるので、
 「Maximum mount count」進数として扱う。
 例えば、以下の場合は26進数。

$ sudo tune2fs -l /dev/sda1 | grep -i "mount count"
Mount count:              14
Maximum mount count:      26

$ sudo tune2fs -l /dev/sda1 | \
  grep -i "mount count" | \
  awk -F\: '{print $2}' | \
  xargs echo -n | \
  awk '{print "後",$2-($1%$2),"回マウントするとチェック"}'12 回マウントするとチェック

■以下のような場合。fstabで、6番目のフィールドが0、
 つまり、fsckが無効になっている。

$ sudo tune2fs -l /dev/sda3 | grep -i "mount count"
Mount count:              36
Maximum mount count:      24

$ grep sda3 /etc/fstab
/dev/sda3       /home           ext3    defaults        0       0

■パーティション毎に日付をずらすべきだが、
 日付の設定をしてもfstabの値が変わるわけではないので注意する。
 tune2fsで設定を変更すると、「Last write time」の日付が変わる。

$ sudo tune2fs -c 25 /dev/sda3
tune2fs 1.41.12 (17-May-2010)
Setting maximal mount count to 25

$ grep sda3 /etc/fstab
/dev/sda3       /home           ext3    defaults        0       0

$ sudo tune2fs -c 24 /dev/sda3
tune2fs 1.41.12 (17-May-2010)
Setting maximal mount count to 24

$ sudo tune2fs -l /dev/sda3 | grep "Last write"
Last write time:          Sat Jan 12 20:41:23 2013

■スワップ以外のファイルシステムの状態は以下のように確認できる。
 「clean」ならば正常。
 ※スワップは仮想メモリなので、ディスクパーティションとしては扱わない。

$ sudo fdisk -l /dev/sda | \
  grep ^/ | \
  grep -v -i swap | \
  awk '{print $1}' | \
  for list in `xargs`;do \
    echo -n "$list "; \
    sudo tune2fs -l "$list" | grep -i state; \
  done;echo
/dev/sda1 Filesystem state:         clean
/dev/sda3 Filesystem state:         clean