LANDISK で fsck を定期的に行う

[戻る]

ある時 LANDISK (HDL-160U) に保存したファイルがおかしいことに気づきました. まぁ数年使ってるとそろそろイカれ出しているのでしょう. fsck でもかけてみるかと思ったのですが, mount 中だから出来ないと言われました. んじゃ umount して... と思ったのですが, いろんなデーモンを停めなくてはいけなくてなかなか上手くいきません. 無改造の LANDISK なら cgi で簡単に出来るかもしれないんですが, 私のはアレコレ改造しているため cgi ではできません.

まぁリブートすればいいわけであまり難しく考えてもしかたありません.

ところで, tune2fs で /dev/hda3 を覗くと Maximum mount count より Mount count の方が大きいことに気づきました. リブートしても定期的に fsck をかけてくれないようです. /home/LANDISK/script/mounthdd.sh を覗くと, nocheck オプションを付けて mount しています.

これが原因かもと, /etc/rc.d/rcS の頭の方で

mount -t ext2 /dev/hda3 /mnt/hda3
umount /mnt/hda3
と nocheck オプション無しで一旦マウントしてみたのですが変わりません. check オプションを付けても, /etc/fstab に /dev/hda3 のエントリをつけても 変わりません. う〜んよく分からん.

まぁリブートなんて滅多にしないから, rcS で直接

/sbin/e2fsck -p /dev/hda3
と書いてもいいんですが, 将来なんかの理由でリブートを繰り返す時があるかもと考えると どうも美しさにかけます.

tune2fs の出力を sed や awk を駆使して fsck を行う時期を知るとか, tune2fs のソースを改造して時期を知る方法とかも考えたのですが, ちょっと面倒くさそうです. そこで正直美しさに欠けますが, 直接 fsck を書くよりマシということで 以下のようにしました (root 様になって, / を r/w モードでリマウントする必要が あります).

  1. rcS の 140 行前後にルートを r/w モードでリマウントしている部分があるので, その直後 (LED control driver. と書かれたコメント行の直前) に以下のフレーズを追加
    if [ -f /etc/fsck.ts ];then
      at=`cat /etc/fsck.ts`
      ct=`date +%s`
      if [ $at -le $ct ];then
        /sbin/e2fsck -p /dev/hda3
        at=$((ct+2592000))
        echo $at > /etc/fsck.ts
      fi
    fi
    
  2. コマンドラインから以下の命令を実行
    echo 0 > /etc/fsck.ts
    
要は, 前回 fsck を行った時間を覚えておいて, それから 1 ヶ月 (60x60x24x30=2592000 秒) 以上経過したら fsck を行うというものです. 初期値は 1970 年 1 月 1 日にしているので, 一回目は必ず fsck がかかります.


2006.10