壊れかけたディスクを修復する場合は、まずシステムを停止させて別のシステムから起動して行うのが普通です。それが不可能な場合(サーバをハウジングしている等)でなければあんまりおすすめできません。
tar で古いログを圧縮して手動ローテートしようとしたとき I/O error が出ました。まあディスクが一杯になったんだろうと思って少しずつ消していったんですが、同じところで死にます。いやな予感がしながらログを見ると案の定こんなのが.
Jul 11 17:33:09 jaco kernel: hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Jul 11 17:33:10 jaco kernel: hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=87143720, sector=3284312
Jul 11 17:33:10 jaco kernel: end_request: I/O error, dev 03:08 (hda), sector 3284312
Jul 11 17:33:10 jaco kernel: hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Jul 11 17:33:10 jaco kernel: hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=87143720, sector=3284320
Jul 11 17:33:10 jaco kernel: end_request: I/O error, dev 03:08 (hda), sector 3284320
Jul 11 17:33:10 jaco kernel: hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Jul 11 17:33:10 jaco kernel: hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=87143720, sector=3284328
Jul 11 17:33:10 jaco kernel: end_request: I/O error, dev 03:08 (hda), sector 3284328
Jul 11 17:33:10 jaco kernel: hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
Jul 11 17:33:10 jaco kernel: hda: dma_intr: error=0x40 { UncorrectableError }, LBAsect=87143720, sector=3284336
Jul 11 17:33:10 jaco kernel: end_request: I/O error, dev 03:08 (hda), sector 3284336
Jul 11 17:33:10 jaco kernel: hda: dma_intr: status=0x51 { DriveReady SeekComplete Error }
fsck するために readonly でマウントしなおします。 /dev/hda8 は /var なので、/var を使用しているデーモン類 (syslogd とか) をあらかじめ停止させます。でないと remount できません。
jaco:~# mount -r -o remount /dev/hda8
mount: /var は使用中です
あれ? まだ何かあるみたいなんで、fuser で調べます。
jaco:~# fuser -mv /var
USER PID ACCESS COMMAND
/var root 445 f.... apcupsd
apcupsd でした。 それを止めてから remount します。なにも文句言われなければ mount コマンドで ro になってるかどうか確認してから fsck を実行します。この場合、bad block のスキャンを行うために -c を指定します(read/write テストを行う勇気があれば -c -c)。もし実際に bad block があるのなら、テストにかなりの時間がかかるでしょう。
jaco:~# e2fsck -c -f -v /dev/hda8
e2fsck 1.23, 15-Aug-2001 for EXT2 FS 0.5b, 95/08/09
/dev/hda8 is mounted.
WARNING!!! Running e2fsck on a mounted filesystem may cause
SEVERE filesystem damage.
Do you really want to continue (y/n)? yes
Checking for bad blocks (read-only test): 512064........................done
Pass 1: Checking inodes, blocks, and sizes
Duplicate blocks found... invoking duplicate block passes.
Pass 1B: Rescan for duplicate/bad blocks
Duplicate/bad block(s) in inode 16126: 421749 421750 421751 421752 421753
Pass 1C: Scan directories for inodes with dup blocks.
Pass 1D: Reconciling duplicate blocks
(There are 1 inodes containing duplicate/bad blocks.)
File /log/httpd/access_log (inode #16126, mod time Fri Jul 11 17:48:02 2003)
has 5 duplicate block(s), shared with 1 file(s):
<The bad blocks inode> (inode #1, mod time Fri Jul 11 17:55:29 2003)
Clone duplicate/bad blocks<y>? yes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Free blocks count wrong for group #0 (10726, counted=10721).
Fix<y>? yes
Free blocks count wrong for group #12 (21052, counted=21057).
Fix<y>? yes
/var: ***** FILE SYSTEM WAS MODIFIED *****
1874 inodes used (0%)
117 non-contiguous inodes (6.2%)
# of inodes with ind/dind/tind blocks: 98/15/0
245405 blocks used (47%)
23 bad blocks
0 large files
847 regular files
996 directories
0 character device files
0 block device files
2 fifos
1 link
2 symbolic links (2 fast symbolic links)
18 sockets
--------
1866 files
無事済んだみたいなので、確認のためもう一度 fsck を走らせて、エラーがなければ read/write でマウントし直し、デーモン類を起動します。とりあえず動き出したらバックアップを取って HDD を交換します。