HD103SI の2台で raid1 だったのが /proc/mdstat の md4 が [_U] で sda4 が外れており、
sda の該当箇所を dd で読み込みできないことを確認してから書き込み(3~4箇所)、
add したところ sdb の xxx セクタが読めないというエラーで [UU] の状態にできないので、
0S02601 を2台買ってきて取り付ける例です。
不良セクタを探す。
$ sudo smartctl --test=short /dev/sda
$ sudo smartctl --test=long /dev/sda
不良セクタがある場合。(smartctl の test は、しばらく時間がかかります。)
$ sudo smartctl -a /dev/sda
# 1 Extended offline Completed: read failure 90% 7342 1157047143
# 2 Short offline Completed: read failure 20% 7342 1157047143
ある程度、不良セクタを読み込む。
$ sudo dd if=/dev/sda of=/tmp/abc.txt bs=512 count=1 skip=1157047143
$ sudo dd if=/dev/sda of=/tmp/abc.txt bs=512 count=1 skip=1157047143
$ sudo dd if=/dev/sda of=/tmp/abc.txt bs=512 count=1 skip=1157047143
$ sudo dd if=/dev/sda of=/tmp/abc.txt bs=512 count=1 skip=1157047143
$ sudo dd if=/dev/sda of=/tmp/abc.txt bs=512 count=1 skip=1157047143
読み込めない場合、不良セクタに書き込む。(その前にバックアップを取る。)
$ sudo dd if=/dev/zero of=/dev/sda bs=512 count=1 seek=1157047143
不良セクタを探す、に戻る。
sda(HD103SI) の数箇所を /dev/zero で上書きした後の状態の例です。
195番の数字がとても多いのが特徴です。
sdb(HD103SI) も同じぐらいの桁に見える195番の量でした。
sda の Reallocated_Sector_Ct が0のままでした。
$ sudo smartctl -a /dev/sda|grep -iP "^\s*(5|19[5678])|error.*count"
5 Reallocated_Sector_Ct 0x0033 100 100 010 Pre-fail Always - 0
195 Hardware_ECC_Recovered 0x001a 100 100 000 Old_age Always - 2533423135
196 Reallocated_Event_Count 0x0032 100 100 000 Old_age Always - 0
197 Current_Pending_Sector 0x0012 100 100 000 Old_age Always - 0
198 Offline_Uncorrectable 0x0030 100 100 000 Old_age Offline - 0
199 UDMA_CRC_Error_Count 0x003e 100 099 000 Old_age Always - 2
5 0 0 Not_testing
sdb に sda と同じ方法を試したところ、読み込みも書き込みもできなかったので諦めました。
また sdb の Reallocated_Sector_Ct が0のままでした。
sda(HD103SI) => sda(0S02601) に交換する。
sda にパーテーションを作成する。
livecd ~ # fdisk -l /dev/sdb
Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x0005eba9
Device Boot Start End Blocks Id System
/dev/sdb1 1 32 257008+ fd Linux raid autodetect
/dev/sdb2 33 1978 15631245 fd Linux raid autodetect
/dev/sdb3 1979 5869 31254457+ fd Linux raid autodetect
/dev/sdb4 5870 121601 929617290 fd Linux raid autodetect
livecd ~ # fdisk -l /dev/sda
Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0xe4c289be
Device Boot Start End Blocks Id System
/dev/sda1 1 32 257008+ fd Linux raid autodetect
/dev/sda2 33 1978 15631245 fd Linux raid autodetect
/dev/sda3 1979 5869 31254457+ fd Linux raid autodetect
/dev/sda4 5870 121601 929617290 fd Linux raid autodetect
1番細かい単位でコピーする。
bootセクタに書き込まないと、新しい HDD が sda の場合、起動しないので grub で書き込む。
dd if=/dev/sdb of=/dev/sda bs=512 conv=sync,noerror
bs を大きくしたい場合は man dd などを読んだほうが良いです。
$ sudo dumpe2fs /dev/DEV | grep "^Block size:"
大量にエラーが出ていたので sdb の方がもっとおかしかったかもしれない。
Mon Sep 20 18:00:49 UTC 2010
dd: reading `/dev/sdb': Input/output error
1156476160+0 records in
1156476160+0 records out
592115793920 bytes (592 GB) copied, 44934.5 s, 13.2 MB/s
... (1156476160+1 ~ 1156476160+478)
592116038656 bytes (592 GB) copied, 45157.6 s, 13.1 MB/s
dd: reading `/dev/sdb': Input/output error
1156476160+479 records in
1156476639+0 records out
592116039168 bytes (592 GB) copied, 45157.6 s, 13.1 MB/s
1953524688+480 records in
1953525168+0 records out
1000204886016 bytes (1.0 TB) copied, 98823 s, 10.1 MB/s
Tue Sep 21 21:27:52 UTC 2010
sdb(HD103SI) => sdb(0S02601) に交換する。
なんだかんだで起動する。
fdiskでsdbにパーテーションを作成する。
mdadm -add して /proc/mdstat で確認する。
(例) watch -n60 cat /proc/mdstat
なんだかんだで成功しました。
ついでに ext4 にする。(失敗した場合、同じ手順で復帰できると考えているためです。)
install-amd64-minimal-20100902.iso をdvdで用意する、などの別の linux を用意する。
tune2fs -O has_journal,dir_index,filetype,extent,flex_bg,sparse_super,large_file,huge_file,uninit_bg,dir_nlink,extra_isize /dev/mdXXX
tune2fs -I 256 /dev/mdXXX
e2fsck -y /dev/mdXXX
md1~md4 が md124~md127 になっていたが変更方法がわからないので、
/etc/fstab と /etc/mdadm.conf を修正する。
resize_inode が無い場合で Inode size: 128 の場合 256 にできないかもしれません。
$ sudo dumpe2fs /dev/DEV | grep "^Inode size:"
カーネルに対応が無いと読めません。
$ grep -i ext4 /etc/kernels/kernel-config-x86_64-2.6.34-gentoo-r6
CONFIG_EXT4_FS=y
CONFIG_EXT4_FS_XATTR=y
CONFIG_EXT4_FS_POSIX_ACL=y
CONFIG_EXT4_FS_SECURITY=y
# CONFIG_EXT4_DEBUG is not set
grub-0.97-r10 で ext4 が読めましたが、やる前に確認するべきです。
$ eix ^grub$
[I] sys-boot/grub
Available versions: *0.92-r1 0.94-r1 0.96-r1 0.96-r2 ~0.96-r3 ~0.97 0.97-r2 0.97-r3 0.97-r4 0.97-r5 0.97-r6 ~0.97-r8 0.97-r9 0.97-r10 **1.98 **9999 {custom-cflags debug multislot ncurses netboot static truetype}
Installed versions: 0.97-r10(22時19分03秒 2010年08月06日)(ncurses -custom-cflags -netboot -static)
Homepage: http://www.gnu.org/software/grub/
Description: GNU GRUB 2 boot loader
grub の起動オプションを変更しました。
番号が変わると面倒なので変えない方法を探した方が良かったです。
$ grep md126 /boot/grub/grub.conf
kernel /boot/kernel-genkernel-x86_64-2.6.34-gentoo-r6 root=/dev/ram0 init=/linuxrc ramdisk=8192 udev domdadm real_root=/dev/md126
今回の例は、7月上旬に、
SMART error (CurrentPendingSector) detected on host: xxx
というメールが来ていたのを放置して、
9月に入った頃には md4 が [_U] だったようだが、
さらに放置した場合に発生する場合が有ります。
また放置気味な場合ソフトウェアraid1は3台が良いかもしれません。
交換して mdadm --add しても残っている方もおかしい場合があるためです。
またbootセクタの書き込みを忘れると、それがsdaの場合は起動しません。
また /, /boot などのOSの起動に関わる部分を ext4 に変更する場合は、下調べした方が良いです。
また swap はメモリの2倍で 16GB 取りましたが使ってないです。
設置しないか 1~2GB 程度で良かったかもしれません。
また寿命が縮んだ原因は md4 に kvm のイメージをサイズ可変のフォーマットで設置したため、かもしれません。
md1 => 256MB, /boot
md2 => 16GB , swap
md3 => 30GB , /
md4 => 残り , /mnt/share
また ext4 に変更した場合の利点の内の一つは
$ sudo du -sh /*
などが早くなったかもしれません。
また e2fsck が早くなっているらしいです。
またオンラインデフラグが今後あるらしいですが、まだ無いです。
また、一応インストール時と同じ手順でmdデバイスの番号を戻せます。
install-amd64-minimal-20100902.isoからブート。
boot: [Enter]
jp [Enter]
sshdを起動。
$ /etc/init.d/sshd start
$ passwd
root [Enter]
root [Enter]
$ ifconfig
sshクライアントでログイン。
$ ssh 192.168.0.4
login as: root [Enter]
password: root [Enter]
raidを止める。
$ mdadm --misc --stop /dev/md124
$ mdadm --misc --stop /dev/md125
$ mdadm --misc --stop /dev/md126
$ mdadm --misc --stop /dev/md127
raidを作成する。メッセージを読む。種類の指定に注意する。
$ mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1
$ mdadm --create /dev/md2 --level=1 --raid-devices=2 /dev/sda2 /dev/sdb2
$ mdadm --create /dev/md3 --level=1 --raid-devices=2 /dev/sda3 /dev/sdb3
$ mdadm --create /dev/md4 --level=1 --raid-devices=2 /dev/sda4 /dev/sdb4
マウントする。
$ mount /dev/md3 /mnt/gentoo/
$ mount /dev/md1 /mnt/gentoo/boot/
$ mount /dev/md4 /mnt/gentoo/mnt/share/
デバイスをマウントする。
$ mount -t proc none /mnt/gentoo/proc
$ mount -o bind /dev /mnt/gentoo/dev
chrootでログインする。
$ chroot /mnt/gentoo /bin/bash
$ env-update
$ source /etc/profile
$ export PS1="(chroot) $PS1"
設定ファイルを作成する。
$ mdadm --detail --scan > /etc/mdadm.conf
# md124 => md1 などに戻す。
$ vi /etc/fstab
再起動する。DVDは外す。
$ exit
$ reboot
●ルートディレクトリの指定をする。
/dev/md3 [Enter]
●ログインして修正する。
$ sudo mount /boot/
$ cd /boot/grub/
$ sudo vi grub.conf
$ diff grub.conf.2010-10-02 grub.conf
13c13
< kernel /boot/kernel-genkernel-x86_64-2.6.34-gentoo-r6 root=/dev/ram0 init=/linuxrc ramdisk=8192 udev domdadm real_root=/dev/md126
---
> kernel /boot/kernel-genkernel-x86_64-2.6.34-gentoo-r6 root=/dev/ram0 init=/linuxrc ramdisk=8192 udev domdadm real_root=/dev/md3
$ sudo grub
grub > device (hd0) /dev/sda
grub > root (hd0,0)
grub > setup (hd0)
grub > device (hd0) /dev/sdb
grub > root (hd0,0)
grub > setup (hd0)
grub > quit
再起動してルートディレクトリを聞かれなければ/dev/sdaに書いたgrubの設定が反映されています。
$ ll /dev/md*
brw-rw---- 1 root disk 9, 1 2010-10-03 09:06:47 /dev/md1
brw-rw---- 1 root disk 9, 2 2010-10-03 09:06:45 /dev/md2
brw-rw---- 1 root disk 9, 3 2010-10-03 09:06:46 /dev/md3
brw-rw---- 1 root disk 9, 4 2010-10-03 09:06:47 /dev/md4
参考
http://www.gentoo.org/doc/ja/gentoo-x86-tipsntricks.xml?style=printable#software-raidhttp://www.gentoo.org/doc/ja/gentoo-x86-tipsntricks.xml?style=printable#software-raid
http://nabe.blog.abk.nu/0301
http://www.gentoo.org/doc/ja/handbook/handbook-x86.xml?part=1&chap=6#doc_chap1