システムハードディスク換装完了
とりあえず復旧までこぎつけた。
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-RAMにsquashfsでシステムをバックアップしているからそこにアクセスしようにも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から書き戻せばいいだけだったはず。
LinuxでDOSのsysコマンドに対応するのってなんだろうね。ディスクにカーネルを書き込んでMBRを設定するやつ…んん〜
あと、シンボリックリンクを管理するプログラムってあるかな…復旧後にシンボリックリンクを作成しわすれて悲惨なことになったので。
SystemRescueCd
SystemRescueCd
システム復旧専用のディスク。Linuxで作られているが、Windows管理者にも使えるようになっている。マニュアルは丁寧に書かれていて好感が持てる。Cdと名乗っているが、DVD-RやUSBメモリやHDDに作成することもできる。
パーティションをいじくったり、復旧作業を行ったり。たかがレスキューCDと思うなかれ。驚くことに、今のSystemRescueCdはX.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