ディスク貧乏は苦労する

GTを3発にして、抜いたカートリッジ250G1本でDebian版の開発を行っている。
手持ちソフトで一応単体での試験がほぼ見えてきたので、結合試験に入るために完全なGTが必要だ。
GTの再構築を行うにはドライブが4発なんだけど、手元にあるのは3発だけ。
250GBくらい、どっかに転がっているんだろうとタカをくくって聞いてみたけど、どこも余ってない。
予備というかjunk箱から発掘を試みるも、発見されるのはPATAばかり...
しかたないので、300GBSATAベアドライブを発掘してきて、とりあえず今のDebian開発環境はそっちに引っ越すことにした。
うーん、紺屋の白袴だ。


UBCDでチェックできるSATAなPC環境を持っていないので、ダンプして読んでみる。
書くとさらに時間かかりそうだし、今回は読むだけ。
300GBだとさすがに時間がかかるな...
ddだと簡単だけど進捗がわかんないのがイヤね。
フォーマットして、badblocksのほうがよかったかな。

# dd if=/dev/sdb of=/dev/null

ddしながら暇なので、smartmontoolsを入れてみる。
状態がわかんないとイヤだもんね。
依存パッケージは特になさそうだ。不要ならさくっと消せる。

# apt-get install smartmontools

使ってみる。

# smartctl -a /dev/sdb
smartctl version 5.32 Copyright (C) 2002-4 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

Device: Maxtor   6B300S0          Version: BANC
Device type: disk
Local Time is: Mon May 28 17:52:23 2007 JST
Device does not support SMART

Device does not support Error Counter logging
Device does not support Self Test logging

あれ? 対応してない? そんなわけないよな。
あ、そっか、MarvellのSATAドライバの作りが妙なんだった。
このままだと使えないじゃん... orz

# smartctl -a -d marvell /dev/sda
smartctl version 5.32 Copyright (C) 2002-4 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=======> INVALID ARGUMENT TO -d: marvell
=======> VALID ARGUMENTS ARE: ata, scsi, 3ware,N <=======

Use smartctl -h to get a usage summary

バージョン古いから対応してないってわけかい。
最新は5.36だそうだ。ただ、このオプションはlibata向けなので、Marvellオリジナルのドライバで動作するかどうかがわからない。
しかたないので、バイナリをGTから持ってくる。

# ldd /usr/sbin/smartctl
        libc.so.6 => /lib/libc.so.6 (0x4001d000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

単体でも動きそう。

# ./smartctl -l error -d marvell /dev/sdb
smartctl version 5.34 [armv5tejl-unknown-linux-gnu] Copyright (C) 2002-5 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF READ SMART DATA SECTION ===
SMART Error Log Version: 1
No Errors Logged

問題なさそうね。

SMART Self-test log structure revision number 1
No self-tests have been logged.  [To run self-tests, use: smartctl -t]

と出てくるので、セルフテストを仕込む。

# ./smartctl -t long -d marvell /dev/sdb
smartctl version 5.34 [armv5tejl-unknown-linux-gnu] Copyright (C) 2002-5 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Extended self-test routine immediately in off-line mode".
Drive command "Execute SMART Extended self-test routine immediately in off-line mode" successful.
Testing has begun.
Please wait 118 minutes for test to complete.
Test will complete after Mon May 28 20:09:41 2007

longだと、4時間ほどかかるらしい。
裏でddしているから遅いのかな?


しばらく放置。


といって中一日あいてしまった。

586114704+0 records in
586114704+0 records out
300090728448 bytes transferred in 14355.003568 seconds (20904957 bytes/sec)

ddは終わっている。
エラーは特に出ていないようだ。


smartctl -a したら、たったいまセルフテストが動き始めたようだ。
ディスクがジーーーーと言ったり、カッカッカッと言ったりしはじめた。
アクセスがあるときは指示しても待ちに入ってしまうようだ。
これから4時間かよ...


あー、ブレーカー落ちました。
だめじゃん。
もう一度開始。


ようやく終わった。

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Extended offline    Completed without error       00%       985         -

問題なさそう。
shortをやるとどうなるんだろう。

# ./smartctl -t short -d marvell /dev/sdb

所要時間は2分だって。

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed without error       00%       985         -
# 2  Extended offline    Completed without error       00%       985         -

表示項目が増えた。
このテストの間、以下のようなメッセージが残る。

program smartctl is using a deprecated SCSI ioctl, please convert it to SG_IO

最近は、SCSI iocltじゃなくて、SG_IOを使えってことなのね。


ドライブは大丈夫そうなので、フォーマットして移行を開始。
テンポラリに使う容量がないので、別マシンにつないでバッサリコピーというわけにはいかない。
動作しているシステムの引越しを単体でやるのは結構めんどくさい。

Disk /dev/sdb: 300.0 GB, 300090728448 bytes
255 heads, 63 sectors/track, 36483 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1         125     1004031   83  Linux
/dev/sdb2             126         250     1004062+  82  Linux swap / Solaris
/dev/sdb3             251         375     1004062+  83  Linux
/dev/sdb4             376       36483   290037510   83  Linux

# mkswap /dev/sdb2
# mkfs.ext3 /dev/sdb1
# mkfs.ext3 /dev/sdb3
# mkfs.ext3 /dev/sdb4

# mount /dev/sdb1 /media/
# cp -a /boot/* /media/
# umount /media/

# mount /dev/sda4 /mnt/
# mount /dev/sdb3 /media/
# cp /mnt/public/source/userland/OLPbasesystem01_20070426a.tgz /media/
# cd /media/
# tar zxvfp OLPbasesystem01_20070426a.tgz
# cd /
# umount /media/

# mount /dev/sdb4 /media/
# cp -a /mnt/* /media/
# umount /media/
# shutdown -h now

停止してドライブ入れ替え。
コピー環境で起動する。
当たり前だけど、ちゃんと起動してきた。


動作中のrootfs環境の引越しをする。
まず、テンポラリ環境にオリジナルのrootfsを移す。

# mount /dev/sda4 /media/
# mkdir /media/250Gsda3cp20070530
# mount /dev/sdb3 /mnt/
# cp -a /mnt/* /media/250Gsda3cp20070530/

一応保険も打っておく。

# dd if=/dev/sdb3 of=/media/250Gsda3dd20070530.image
2008125+0 records in
2008125+0 records out
1028160000 bytes transferred in 200.263656 seconds (5134032 bytes/sec)

# shutdown -h now

停止してオリジナル環境で起動する。

# mount /dev/sdb4 /media/
# mount /dev/sdb3 /mnt/
# rm -r /mnt/*
# cp -a /media/250Gsda3cp20070530/* /mnt/
# shutdown -h now

コピー環境で起動する。
一応、データをアーカイブしておく。

# mount /dev/sda4 /media/
# cd /media/250Gsda3cp20070530/
# tar zcvfp ../250Gsda3cp20070530.tgz ./

あー、めんどくさかった!