システムハードディスク換装完了

とりあえず復旧までこぎつけた。

3GBのディスクが逝ったので、昔とあるrubyistから譲ってもらった10GBのディスクを使う。何年も使われずに押し入れで眠っていたけれど、捨てなくてよかったと思った瞬間だ。壊れるまで数年ほど頑張ってもらって、その間に起動方法を考えないといけない。

$ sudo hdparm -I /dev/hda
/dev/hda:

ATA device, with non-removable media
	Model Number:       IBM-DTTA-351010                         
	Serial Number:      WF0WFFB0996
	Firmware Revision:  T56OA73A
Standards:
	Used: ATA/ATAPI-4 T13 1153D revision 17 
	Supported: 4 3 2 1 
Configuration:
	Logical		max	current
	cylinders	16383	16383
	heads		15	15
	sectors/track	63	63
	--
	CHS current addressable sectors:   15481935
	LBA    user addressable sectors:   19807200
	device size with M = 1024*1024:        9671 MBytes
	device size with M = 1000*1000:       10141 MBytes (10 GB)
Capabilities:
	LBA, IORDY(can be disabled)
	Buffer size: 466.0kB	bytes avail on r/w long: 34	Queue depth: 32
	Standby timer values: spec'd by Standard, no device specific minimum
	R/W multiple sector transfer: Max = 16	Current = 0
	DMA: sdma0 sdma1 sdma2 mdma0 mdma1 mdma2 udma0 udma1 *udma2 
	     Cycle time: min=120ns recommended=120ns
	PIO: pio0 pio1 pio2 pio3 pio4 
	     Cycle time: no flow control=240ns  IORDY flow control=120ns
Commands/features:
	Enabled	Supported:
	   *	NOP cmd
	   *	READ BUFFER cmd
	   *	WRITE BUFFER cmd
	   *	Host Protected Area feature set
		Release interrupt
	   *	Look-ahead
	   *	Write cache
	   *	Power Management feature set
		Security Mode feature set
	   *	SMART feature set
	   *	READ/WRITE DMA QUEUED
Security: 
		supported
	not	enabled
	not	locked
		frozen
	not	expired: security count
	not	supported: enhanced erase
	22min for SECURITY ERASE UNIT. 

今回のシステムクラッシュは痛かった。旧ディスクはまだまだやれると思えるほど元気そうに見えたが、実は老体に鞭打ってたのだ。頑張ってきたのだが、悲鳴(異常音)を発することなく突然逝ってしまった。
だけどよく考えたら兆候はあった。パーティションテーブルがいかれてると何度も言われた。mksquashfsでシステムをバックアップとっていたときに、必ずmemory corruptionを起こしてた。昨日ふとsyslogを見てみたらI/O errorが起きていた。
その後、崩壊は一気に加速していった。tarがgzipがmountが…次々と/binのコマンドが読めなくなってしまった。DVD-RAMsquashfsでシステムをバックアップしているからそこにアクセスしようにもmountが使えなくては意味がない!まさに缶詰のなかに缶切りがある状況だ。
幸いシステムディスクとデータディスクを分けているため、当然のことながら/homeなどのデータにはまったく影響しない。システムとデータ同時に壊れるわけではないので精神衛生上よい!だからこそ小容量ディスクをシステムディスクに使いたいのだ。
これまた幸い数年前にSystemRescueCdを焼いていたから使ってみた。復旧中うかつにも/binを移動させてしまったためシステムが動作しなくなったとき、こいつに助けられた。ただ、バージョンが古いのでsquashfsには対応していなかった。最新版の0.4.0ではsquashfs対応なのでいざディスクがぶっこわれてもSystemRescueCdから復旧できるだろう。
今回はシステムのディスクがやられたので再度Debian GNU/Linuxをインストールすることにした。昔DebianインストーラのCDを作成した気がするのだが、見付からなかったので、Debian -- Network install from a minimal CDからISOイメージをダウンロードしてCDに焼いた。そして最小構成でインストール。このインストールの目的はあくまでカーネルMBRの設定だからだ。/binなどのシステムはDVD-RAMに毎週バックアップしているので、書き戻せばいいからだ。
書き戻したら、なんとかシステムは復旧した。ふぅ…

今回のクラッシュ→再インストールでliloからgrubに乗り換えられた。aptでカーネルをインストールしたらgrubの設定も自動でやってくれるので乗り換える価値はある。だって楽だから。

今回のクラッシュでリストアのしやすさが大切だと思い知らされた。バックアップを取っているつもりでもリストアに苦労しているようではだめだ。復旧「できる」のはシステム管理者として当たり前であり、少しでも短時間で復旧できないといけないのだ。盲点だったのは手持ちのSystemRescueCdのバージョンが古すぎてsquashfsに対応していないことだった!squashfsに対応していれば、LinuxをインストールしたらすぐにSystemRescueCdを起動してsquashfsから書き戻せばいいだけだったはず。

LinuxDOSのsysコマンドに対応するのってなんだろうね。ディスクにカーネルを書き込んでMBRを設定するやつ…んん〜

あと、シンボリックリンクを管理するプログラムってあるかな…復旧後にシンボリックリンクを作成しわすれて悲惨なことになったので。

SystemRescueCd

SystemRescueCd
システム復旧専用のディスク。Linuxで作られているが、Windows管理者にも使えるようになっている。マニュアルは丁寧に書かれていて好感が持てる。Cdと名乗っているが、DVD-RやUSBメモリやHDDに作成することもできる。

パーティションをいじくったり、復旧作業を行ったり。たかがレスキューCDと思うなかれ。驚くことに、今のSystemRescueCdX.orgが入っていることだ。ほかにもFireFoxとかが入っている。ChangeLogを見てみればわかるように、今年は急ピッチで開発が進んでいる。毎月のようにリリースしているのでチマチマと更新していきたい。

・ 0.4.0) 2007-10-04:
・ 0.3.8) 2007-09-04:
・ 0.3.7) 2007-07-18:
・ 0.3.6) 2007-06-11:
・ 0.3.5) 2007-04-19:
・ 0.3.4) 2007-03-20:
・ 0.3.3) 2007-03-01:
・ 0.3.2) 2007-01-10:
・ 0.3.1) 2007-01-01:
・ 0.3.0) 2006-12-20:
・ 0.2.19) 2006-05-01:
・ 0.2.18) 2006-04-01:
・ 0.2.17) 2006-03-01:
・ 0.2.16) 2006-02-01:
・ 0.2.15) 2004-08-17:
・ 0.2.14) 2004-06-07:
・ 0.2.13) 2004-05-13:
・ 0.2.12) 2004-03-23:
・ 0.2.11) 2004-02-18:
・ 0.2.10) 2004-01-29:
・ 0.2.9) 2004-01-07:
・ 0.2.8) 2003-11-20:
・ 0.2.7) 2003-10-29:
・ 0.2.6) 2003-10-11:
・ 0.2.5) 2003-09-21:
・ 0.2.4) 2003-09-09:
・ 0.2.3) 2003-09-01:
・ 0.2.2) 2003-08-21:
・ 0.2.1) 2003-08-04:
・ 0.2.0) 2003-07-27:
・ 0.1.4) 2003-07-23:
・ 0.1.3) 2003-07-21:
・ 0.1.2) 2003-07-20:
・ 0.1.1) 2003-07-18:

危機管理として、バックアップだけでは不十分だ。リストアしやすい環境を整備する必要がある。カスタマイズして、俺版レスキューディスクを作成したい。

ratpoison-1.4.2リリース

たった今ratpoisonの新版がリリースされた。どうせすぐ再起動するのだからインストールしてしまおう。

url=http://savannah.nongnu.org/download/ratpoison/ratpoison-1.4.2.tar.gz
cd ~/compile
wget $url; tar xzvf `basename $url`; cd `basename $url .tar.gz`
./configure && make && strip src/ratpoison && sudo make install

インストール後、ratpoisonコマンドラインで newwm /usr/local/bin/ratpoison を実行すればバージョンアップされたratpoisonを使うことができる。

 - Command: newwm WINDOW-MANAGER
     This is a bad-bad command. It kills ratpoison and revives that
     ugly rodent! Yuck! Avoid!

ratpoisonのinfoでは糞味噌に言われているが、X再起動なしにratpoisonそのものをバージョンアップするのにも使える。

symlinks - シンボリックリンクを管理する

symlinksはディレクトリ中のシンボリックリンクを管理する小さなプログラム。
リストしたり、絶対パス相対パス変換をしたり、リンク先が存在しないシンボリックリンクを削除したりする。
クラッシュ復旧後など、存在すべきシンボリックリンクが存在しなくて困る場合にそなえて、予めリストを作成しておくといい。インストールはapt一発。

$ apt-get install symlinks

俺の場合、/m以下にデータディスクをマウントしているのでこう。-rで再帰的にサブディレクトリを探索する。-vをつけないと相対パスシンボリックリンクは表示しないので注意。

$ symlinks -r -v / /m > /log/symlinks

$ ln -s ~/.emacs dotemacs
$ ln -s ../../r/.emacs dotemacs.relative
$ echo foo > foo
$ ln -s foo foo.link
$ ls -l
合計 4
lrwxrwxrwx 1 rubikitch users 24 2007-10-07 19:24 dotemacs -> /m/home/rubikitch/.emacs
lrwxrwxrwx 1 rubikitch users 14 2007-10-07 19:24 dotemacs.relative -> ../../r/.emacs
-rw-r--r-- 1 rubikitch users  4 2007-10-07 19:24 foo
lrwxrwxrwx 1 rubikitch users  3 2007-10-07 19:24 foo.link -> foo
$ symlinks .
other_fs: /tmp/tmpdir00/dotemacs.relative -> ../../r/.emacs
other_fs: /tmp/tmpdir00/dotemacs -> /m/home/rubikitch/.emacs
$ symlinks -v .
relative: /tmp/tmpdir00/foo.link -> foo
other_fs: /tmp/tmpdir00/dotemacs.relative -> ../../r/.emacs
other_fs: /tmp/tmpdir00/dotemacs -> /m/home/rubikitch/.emacs

chase - シンボリックリンクの実体ファイルを求める

chaseはシンボリックリンクの実体を求める小さいプログラム。

-rw-r--r-- 1 rubikitch users  4 2007-10-07 19:24 foo
lrwxrwxrwx 1 rubikitch users  3 2007-10-07 19:24 foo.link -> foo
lrwxrwxrwx 1 rubikitch users  8 2007-10-07 19:44 foo.link.link -> foo.link

たとえばこんな状態で、readlinkを実行しても1つしか辿らないが、chaseならすべてのリンクを辿る。

$ readlink foo.link.link
foo.link
$ chase foo.link.link
/tmp/tmpdir00/foo


と、ここまで書いてて気付いたのだが、readlinkにもオプションを指定すれば同様な動作をすることがわかったw

$ readlink -f foo.link.link
/tmp/tmpdir00/foo
$ readlink -e foo.link.link
/tmp/tmpdir00/foo
$ readlink -m foo.link.link
/tmp/tmpdir00/foo