fsckで修復の練習

CentOS 5.5

// SRPMS の取得・展開
# wget http://ftp.riken.go.jp/Linux/centos/5/os/SRPMS/e2fsprogs-1.39-23.el5_5.1.src.rpm
# rpm2cpio e2fsprogs-1.39-23.el5_5.1.src.rpm | cpio -id
# tar xzvf e2fsprogs-1.39.tar.gz

// この辺りのディレクトリにいろいろある
# cd e2fsprogs-1.39/tests/f_h_badnode/

// アーカイブされているので展開
# gzip -d image.gz

// そのままだとfsckかけられないのでloopbackデバイスに割り当てる
# losetup /dev/loop0 image

// マウントすると messages に警告が出力される。(意訳:なんかヤバイからfsckかけたほうがよくね?)
# mount /dev/loop0 /mnt/
# tail /var/log/message
Aug 27 02:42:36 www14006u kernel: EXT2-fs warning: checktime reached, running e2fsck is recommended

// fsckをかけるときはumountした状態であることが鉄則。さもなくば壊れる。
# umount /mnt/
# fsck -t ext3 -f -C /dev/loop0
fsck 1.39 (29-May-2006)
e2fsck 1.39 (29-May-2006)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Problem in HTREE directory inode 12929: node (531) has bad max hash
Problem in HTREE directory inode 12929: node (993) referenced twice
Problem in HTREE directory inode 12929: node (1061) has bad min hash
Problem in HTREE directory inode 12929: node (1062) has invalid depth
Problem in HTREE directory inode 12929: node (1062) has bad max hash
Problem in HTREE directory inode 12929: node (1062) not referenced
Invalid HTREE directory inode 12929 (/test2).  Clear<y>? yes

Pass 3: Checking directory connectivity
Pass 3A: Optimizing directories
Pass 4: Checking reference counts
Pass 5: Checking group summary information

/dev/loop0: ***** FILE SYSTEM WAS MODIFIED *****
/dev/loop0: 47730/100192 files (0.0% non-contiguous), 13377/31745 blocks

// 返値 1:ファイルシステムのエラーが修正されたの意味
# echo $?
1

// 修復後、マウントしてlost+foundに移動されたファイルが無いか確認。
# mount /dev/loop0 /mnt/
# ll -a /mnt/lost+found/
合計 13
drwx------ 2 root root 12288  625  2002 .
drwxr-xr-x 6 root root  1024  625  2002 ..


// 後始末 loop0 がずっと割り当てられたままなので解除。
# umount /mnt
# losetup -d /dev/loop0
  • オプション
    • -t :ファイルシステムタイプ指定(必須ではない)
    • -f :チェックを強制的に実行。fsckが壊れてないと認識しているとチェックが行われない。
    • -C :進捗状況を出力する。大容量のこの時代には必須かと。実行中表示されるが終わるとメッセージが上書きされて消えるため上記には出てないように見える。
# ls e2fsprogs-1.39/tests/
ChangeLog                 f_bbinode        f_hurd           f_salvage_dir
Makefile.in               f_big_sparse     f_illbbitmap     f_selinux
README                    f_bitmaps        f_illibitmap     f_special_ea
d_loaddump                f_clear_xattr    f_illitable      f_summary_counts
defaults                  f_crashdisk      f_imagic         f_swapfs
e_brel_bma                f_dirlink        f_imagic_fs      f_valid_ea_in_inode
e_icount_normal           f_dup            f_journal        f_zero_group
e_icount_opt              f_dup2           f_lotsbad        f_zero_super
e_irel_ima                f_dup3           f_lpf            filter_dumpe2fs
f_16384_block             f_dup_de         f_lpf2           m_dasd_bs
f_8192_block              f_dup_resize     f_lpffile        m_large_file
f_bad_disconnected_inode  f_dupdot         f_messy_inode    m_meta_bg
f_bad_local_jnl           f_dupfsblks      f_miss_blk_bmap  m_no_opt
f_badbblocks              f_dupsuper       f_miss_journal   m_raid_opt
f_baddir                  f_end-bitmap     f_misstable      m_std
f_baddotdir               f_expand         f_mke2fs2b       progs
f_badinode                f_ext_journal    f_noroot         r_move_itable
f_badjourblks             f_extra_journal  f_okgroup        r_resize_inode
f_badorphan               f_filetype       f_orphan         run_e2fsck
f_badprimary              f_h_badnode      f_overfsblks     run_mke2fs
f_badroot                 f_h_badroot      f_preen          test_config
f_badsymlinks             f_h_normal       f_recnect_bad    test_script.in
f_badtable                f_h_reindex      f_reconnect
f_bbfile                  f_holedir        f_resize_inode
    • fsck*1 で内部的に呼ばれる fsck.ext3 は e2fsck のハードリンク=全部同じ。
# ll -i /sbin/ | grep 1012997
1012997 -rwxr-xr-x 3 root root     1158080 1112  2010 e2fsck
1012997 -rwxr-xr-x 3 root root     1158080 1112  2010 fsck.ext2
1012997 -rwxr-xr-x 3 root root     1158080 1112  2010 fsck.ext3

*1:fsckは各ファイルシステムチェックコマンドのフロントエンド