-->

2010-09-27

ハードディスクの交換の例

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

0 件のコメント: