2013年春のファイルサーバHDD障害発生

久しぶりの更新ですが、このブログが更新される時は障害とか嫌なことが起きた時だったりするので嬉しいことではないです。
そして今回も同じく嬉しくないこと。

まずWindows上からsambaのドライブを認識してないことが発覚。
認識していないというか、ドライブは認識されているけどHDDの中身が空の状態。
なぜ気付いたかというと、thunderbirdのローカルフォルダが空になっていたから。
最初はthunderbirdの不具合で上手く読み取れないとかじゃないかなと思ったのですが、エクスプローラから見ても空。

ちょっと焦ってきたので冷静にsshで確認してみました。
そしてこんな感じ

# ls /var/storage/00/main/
ls: reading directory /var/storage/00/main/: 入力/出力エラーです

I/Oエラーです。
マウントしなおせば元通りになったりしてくれるかもしれないと思いアンマウントしてマウントしなおしてみます。

#umount /var/storage/00/main
デバイスを使用中です

使用中と言われました。
一体何がこいつを掴んでいるんだろう?

# fuser -mv /var/storage/00/main/

                     USER        PID ACCESS COMMAND
/var/storage/00/main/:
                     root      10262 ..c.. smbd

sambaでした。
サービスを停止し忘れていました。
sambaを止めてからアンマウントしてみます。

# /etc/init.d/smb stop
SMB サービスを停止中:                                      [  OK  ]
NMB サービスを停止中:                                      [  OK  ]
# umount /var/storage/00/main/
# mount -t ext3 /dev/sdb /var/storage/00/main
mount: wrong fs type, bad option, bad superblock on /dev/sdb,
       missing codepage or other error
       In some cases useful info is found in syslog - try
       dmesg | tail  or so

エラーです。
ファイルシステムがおかしいと言っています。
しかしfstabには

LABEL=00main            /var/storage/00/main    ext3    defaults        0 0

とかいてあるので間違っているわけではないようです。
とりあえずリブートしてみます。
それだけでうまくいくこともある!!!

# cd /var/storage/00/main/
# ls
data  lost+found  scripts  svn  this_is_main  tmp  var.log
[root@localhost main]# df
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/sda2              1781732   1270392    419368  76% /
/dev/sda1               101086     12180     83687  13% /boot
tmpfs                  1020808         0   1020808   0% /dev/shm
/dev/sdb             2884285104 1210150780 1527620996  45% /var/storage/00/main
/dev/sdc             2884285104 1209528564 1528243212  45% /var/storage/00/mirror
/dev/sdd             2884285104 2571644916 166126860  94% /var/storage/01/main
/dev/sde             2884285104 2571644928 166126848  94% /var/storage/01/mirror
/dev/sdf             2884285104 2237635508 500136268  82% /var/storage/02/main
/dev/sdg             2884285104 2237631004 500140772  82% /var/storage/02/mirror

あっさりもどってました。
でもデータが破損してたりしたら嫌なのでdiffってみます。

# diff /var/storage/00/main /var/storage/00/mirror
共通の下位ディレクトリー: /var/storage/00/main/dataと/var/storage/00/mirror/data
共通の下位ディレクトリー: /var/storage/00/main/lost+foundと/var/storage/00/mirror/lost+found
/var/storage/00/mainだけに発見: scripts
共通の下位ディレクトリー: /var/storage/00/main/svnと/var/storage/00/mirror/svn
/var/storage/00/mainだけに発見: this_is_main
/var/storage/00/mirrorだけに発見: this_is_mirror
/var/storage/00/mainだけに発見: tmp
/var/storage/00/mainだけに発見: var.log

フォルダ構造はまったくもって平気なようです。
続いてファイルの差分等がないか見てみます。
なんかいいやり方はないかなと思ってググっていたらrsyncでできそうです。
気になったのがこの2つ。

--list-only             list the files instead of copying them
(ファイルをコピーはしないで一覧表示する)
-n, --dry-run               perform a trial run with no changes made
(ファイルを更新せずに転送対象となるものを探してみるだけ)

なんだか同じように見えますが、前者はコピー元のファイルを一覧表示するだけでファイルを比較した結果とかではなく、
何のためにあるのかさっぱりわからないもので、後者は実際に転送する対象を一覧表示するという素晴らしいものです。

さて、実行して対象をファイルに出力してみます。
前回の同期バッチ以降はthunderbirdのファイル以外は増えていないはずですが・・・。

rsync -crn --list-only /var/storage/00/main/data /var/storage/00/mirror > /root/20130404.log 2>&1

チェックサムに変えたので異常に時間がかかるだろうと予想して確認は仕事から帰ってきてからにします。

ついでに、rsyncのオプションをみていて気付いたこと。

-c, --checksum    skip based on checksum, not mod-time & size
(更新時刻とファイルサイズではなくチェックサムでファイル転送をスキップするかどうか決める)

こんなオプションがあるってことは普段は更新日時とファイルサイズをみて対象ファイルを決定しているということで、
以前の記事で「rsyncは元々チェックサムで比較している」と書いてしまっていたことが間違いだったと気付かされました。
2012秋のファイルサーバ復旧 05 データ領域用HDDの設定など

そういうわけで差分更新バッチ用のスクリプトを修正しておきます。

#!/bin/bash

# log directory
log_dir="/var/storage/00/main/scripts/log"
if [ ! -d $log_dir ]
then
mkdir $log_dir
fi

# log file path
log_file=$log_dir"/sync_storage_"`date +%Y%m%d%H%M`".log"

# start
echo "### Start sync storage ##########" >> $log_file
date >> $log_file

# check dupe
running=`pgrep -fo $0`
if [ $$ != $running ]
then
echo "### Already running : $running ###" >> $log_file
exit 1
fi

# exec rsync
rsync -avc --delete /var/storage/00/main/data /var/storage/00/mirror >> $log_file 2>&1
rsync -avc --delete /var/storage/00/main/svn /var/storage/00/mirror >> $log_file 2>&1
rsync -avc --delete /var/storage/01/main/data /var/storage/01/mirror >> $log_file 2>&1
rsync -avc --delete /var/storage/02/main/data /var/storage/02/mirror >> $log_file 2>&1

# end
echo "### End sync storage ############" >> $log_file
date >> $log_file

exit 0

無事解決。よかったよかった。

コメント