rescue diskを作ってみる
 

1.はじめに
2.作り方
3.使い方
4.遊び方
5.終わりに


最近(2005-10-02)は、フロッピーのない機器も増えたそうで、時代の要請からrescue cdromの作成も始めました。興味のあるかたはこちらへどうぞ→rescue cdromを作ってみる

1.はじめ に

rescue diskをスクラッチから作るスクリプトを書いてみました。以前は二枚組の Redhatのrescue diskを使っていましたが、最近はCD-ROMからの rescue bootが標準になったらしく、以前のような形態では配布されなくなったようです。ちまたにも1FD Linux等々ありますが、やはり1FDでは限界があり、rescue diskとしてはどうかと思います。

そんなわけで、ずっと古いrescue diskを使って(というか、常備して)きましたが、さすがに世の中もすっかり、kernel 2.4になじんでしまったようなので、rescue diskも2.4で新調することとしました。せっかくなので自分で作ってみたいと思います。その結果が

mkbrd-0.2.1a.tar.gz

です。このスクリプトは共有ライブラリの依存関係を自動的に解決し、ライブラリを構成、コピーするようにしてあるので、少々、環境が変わっても、その環境 に対応した rescue diskが作成可能なはずです。まぁ、Vine 2.6r1でしか試してませんが…。

普通に伸長して、中に入っているmkbd.shとmkrd.shを適当なところにおいて下さい。このスクリプトはroot権限を要求し、カレントディレク トリおよび/tmpに一時的な作業領域を確保しま す。実行するときは、くれぐれも気をつけて下さい。


rescue diskの最大の問題は、言わずもがな、その限られた空間の中で何を削り、何を残すかです。ここでは、rescue  diskが必要になる事態の多 くはハードディスクの不具合に関するものだと仮定し、データの回収、修復等に重点をおいています。たとえば、ハードディスクからブートしなくなったマシン に入って、ftpで他のマシンにデータを移してやったり、また逆に、ftpで必要なファイルを持ってきてシステムを修復してやったり…そんなイメージで す。

以下が、このスクリプトから生成されるrescue diskのコマンドです。これらは、mkrdを実行したシステムからコピーされます。ただし、initだけは別でシステムの/sbin以下にあるものとは 異なり、ただの小さなスクリプトです。



ファ イル管理
cp、ln、mkdir、ls、rm、mv、chmod、
シ ステム管理
ash、sync、df、 mount、umount、swapon、swapoff、insmod、lsmod、rmmod、chroot、mknod、
プ ロセス管理
ps、kill、init、
テ キスト・ファイル操作
cat、ed、gzip、more、tar、
ネッ トワークユーティリティ
ifconfig、ping、route、ftp、
ストレージユーティリティ
badblocks、dd、e2fsck、fdisk、mke2fs、


なかなか、うまくおさめたと思ってるんですが、さてどうでしょう?残念なのは、grepを入れられなかったことです。ぎりぎり入らなかったです。なにかを なんとかすれば入るような気がしないでもないのですが、試行錯誤するのがちょっと面倒になってしまいました。


2.作り方

一枚目 bootdisk

具体的な作り方です。このrescue diskは二枚組です。一枚目はカーネルのブート用、二枚目は、ramdiskへ展開される圧縮された/ファイルシステムのイメージです。都合上、以下一 枚目をbootdisk、二枚目をrootdiskと記述することがあります。その他、細かいことは直接スクリプトを見て下さい。

今回は、Vine Linux 2.6r1を想定しています。フロッピーディスクの容量ギリギリのところでやっているので環境がちょっと変わっただけで、思いがけずはみだしてしまうなん てことがあるかもしれません(まぁ、逆もあるかもしれませんが…)。rootdisk作成用のスクリプトには多少の調整オプションも用意したのでヒマな人 は遊んでみて下さい。

まず、一枚目です。mkbd.shで作ります。mountしたりするので、root権限が必要です。

#mkbd.sh -k /boot/vmliunz-2.4.20-0vl29.1 -i /boot/initrd-2.4.20-0vl29.1.img

と、こんな感じで指定します。-kはカーネルの絶対パス、bootに必要なら、-iにはinitrdの絶対パスを指定します。指定しない場合は、カーネル は/boot/vmlinuzを、initrdは/boot/initrd.imgをとりあえず探し、/boot/vmlinuzがなければ失敗します。 /boot/initrd.imgがなければ、initrdを使わないbootdiskになります。明示的に、initrdを使わないようにするときに は、-i 0 としてください。

また、mkinitrdでつくったinitrdを使っているとbootできない場合がありますが、その時はinitrdを使わない(-i 0)か、initrdのlinuxrc中のinsmodの最終行より下の行は削除してください。


#!/bin/nash

echo "Loading scsi_mod module"
insmod /lib/scsi_mod.o
echo "Loading sd_mod module"
insmod /lib/sd_mod.o
echo "Loading sym53c8xx module"
insmod /lib/sym53c8xx.o
echo Mounting /proc filesystem
mount -t proc /proc /proc
echo Creating root device
mkrootdev /dev/root
echo 0x0100 > /proc/sys/kernel/real-root-dev
echo Mounting root filesystem
mount -o defaults --ro -t ext3 /dev/root /sysroot
pivot_root /sysroot /sysroot/initrd
umount /initrd/proc

#!/bin/nash

echo "Loading scsi_mod module"
insmod /lib/scsi_mod.o
echo "Loading sd_mod module"
insmod /lib/sd_mod.o
echo "Loading sym53c8xx module"
insmod /lib/sym53c8xx.o


上のような感じです。


二枚目 rootdisk

まず、Vine的に重要なことがあります。当初、Vine 2.6r1のフルインストールとアップデートのみの環境で実行できることを目標としていましたが、残念ながらその目標は断念せざるを得なくなりました。理 由は、ひとつはシェルの大きさで、もう一つは、Vine 2.6r1のe2fsckがスタティックにコンパイルされていることです。e2fsckがスタティックにコンパイルされているのは、ファイルシステムの修 復をどんな状況下でも実行できるようにしてあるためですが、rescue diskに押し込むには大き過ぎます。

とりあえず試すだけなので、e2fsckはいらないという場合は

#mkrd.sh -cd 'e2fsck'

として下さい。

そんなワケで、シェルはVine Plusのashを使います。これは、単にひろってきて、rpmでインストールするだけなので、簡単です。問題はe2fsckです。これは、specファ イルをいじってrebuildする必要があります。

e2fsprogs-1.29-0vl1.src.rpmを取ってきて、

$rpm -i e2fsprogs-1.29-0vl1.src.rpm

展開し、任意のRPM_SPEC_DIRにあるe2fsprog.specを編集します。具体的には81行目、%configureの行に-- enable-dynamic-e2fsckを付け加えます。


%build
%configure --enable-elf-shlibs 
make libs progs docs
%build
%configure --enable-elf-shlibs --enable-dynamic-e2fsck 
make libs progs docs


書き加えたら、rpmでインストールするときヴァージョンが同じだと文句を言われないようにrevisionなり、なんなりを少し増やしておくことも忘れ ず に。まぁ、--forceでもいいんですけど…。

終わったら、後はお決まりの流れです。

$rpm -bb rpm/SPEC/e2fsprog.spec
$su
#rpm -Uvh rpm/RPM/i386/e2fsprogs-1.29-0vl1.1.i386.rpm
#exit
$

これで準備が終わりました。二枚目のフロッピーを用意して、rootになって実行するだけです。bootdiskと違って個々の環境の差というものは関係 ないので、単純にスクリプトを走らせて下さい。

$su
#mkrd.sh

このスクリプトは、まず最初、/ファイルシステムの作成完了時にその容量を表示して停止します。このとき、このまま作業を続行するか否かを聞いてきますの で、R、S、またはその他を入力して下さい。

The root tree size is 3554304B.

If you want to remain original tree of root image,enter R.
It is in /home/yoshino/mkbrd-0.02/root.

If you want to save the tree of root image and restart,enter S.
It is saved to /home/yoshino/mkbrd-0.02/root.3613.save.

Others,the operation restarts.Simply press Enter.

Rは、完成したroot.imgをmountしたまま終了します。Sは、別なディレクトリに/ファイルシステムのコピーを作り、作業自体はそのまま続行 されます。それ以外は、とくになにもせずに作業を続行します。

次に、フロッピーディスクに書き込むための圧縮イメージ、root.img.gzができあがると、圧縮イメージの容量を表示して作業を中断し、本当にフ ロッピーディスクに書き込むかどうかを聞いてきます。

Root disk image was created.
root.img.gz is 1467478B.

Set floppy disk on /dev/fd0, and simply press Enter.
If you set any values,the operation is aborted.

こんな感じで表示されます。ここで、フロッピーに書き込まずに終了したいときは、なにか文字を入力してEnterを押して下さい。書き込みたいときは、な にも入力せず、そのままEnterです。

読み込んだブロック数は 2871+1
書き込んだブロック数は 2871+1
The operation was completed.

最後にこんな感じで終了すれば成功です。

とくに難しいことはなく、Enterだけを押していけば問題なく終了するはずです。できあがったら、どっちが bootdiskでどっちがrootdiskかわかるようにしておきましょう…、まぁ、そんな小学生みたいなことで苦労するのは私だけかもしれません が…。

2005年1月10日 追記
Vineも3.0以降になるとファイルサイズがどれも肥大化し、なかなか、 2.6と同じ構成ではフロッピーにおさまりきらなくなってきました。一番無駄に大きいファイルは、ftpですので、これを削ると楽です。でも、ftpがな くなると今一つrescue diskとしておもしろみにかけます。実際問題として、rescue diskでftpが必要になるときなんて、そう、ないんですが…。


3.使い方

使い方は、まずbootdiskを入れて起動してください。LILOのブートプロンプトが出てきますので、普通に起動してやります。bootdiskが 持っている選択肢はrescue以外にありません。めでたくカーネルがブートしたならば、そのうち止まり、二枚目のフロッピーディスクを入れるよう促され ます。そうしたら、フロッピーディスクを二枚目の rootdiskと取りかえてEnterです。rootdiskが正しく作られているならば、カーネルは、圧縮されたイメージを見つけたと かなんとか言ってきます。で、しばらくすると

Started rescue system,mkrd-0.02
#

というのが出てきておしまいです。あとは好きにしてください。終了の仕方は、exitです。exitでシェルを終了してください。

System halted

と出たら、O.K.です。それ以後のメッセージは無視しましょう。面倒な人は、なにかmountしてい なければ、電源ブチッでもダイジョブです、ramdiskですから。

rescue diskを作るのは、そう難しいことではないと思いますが、難しいのは、これを運用することです。たとえば、起動してから、pingを撃てる ようにするだけでも色々知らないと結構大変です。実はちょっとはまりました、routeのパラメータの仕様が以前より厳格になったらしく、今まで通り ではうまくいかなかったからです。いやぁー、こういう最小構成のシステムを使っていると色々勉強になりますね。


4.遊び方

さて、rescue diskの真髄は、そのコマンドの構成です。私の構成に不満のある人もおありでしょう。そういう場合は、

#mkrd.sh -cd 'tar' -ca '/bin/cpio'

という感じで指定します。上記は、デフォルトのコマンドからtarを削除し、/bin/cpioをrootdiskに加えるという意味です。削除するも の、加えるもの、ともに空白で区切って複数 指定可能です。どちらかを指定しなくともかまいません。ただし、削除するコマンドはファイル名で指定し、新たに加えたいものは 絶対パス で指定して下さい。ともにオプションのあとにコマンドを''でくくって指定して下さい。

加えるものは別に実行可能でなくてもかまわないので、行き先は/binになりますが起動後必要なモジュールなどを入れておくのもひとつの手です。ただし、 本筋は一枚目のbootdiskでできる限りのことをやっておくことです。とにかくディスクスペースはもっとも貴重なリソースです。

デフォルトのコマンドは

#mkrd.sh -lc

で表示されます。

また、rescue diskでは、その容量が非常に大きな問題なので、作成前にあらかじめそのおよその容量を知ることが重要な場合があります。-csでコマンドの容量を調べ ることができます。このときは実際の作業は実行しません。

#mkrd.sh -cs -cd 'more mv' -ca '/bin/cpio /bin/grep'
default_size is 1373708

del_size is 70504

add_size is 118360

Total size of commands is about 1421564.

と、こんな感じになります。rootdiskの容量を占めるのはコマンドだけでなく、ライブラリも大きな存在です。ライブラリを合わせた総計を求めるとき は、-sを加えて

#mkrd.sh -s -cd 'more mv' -ca '/bin/cpio /bin/grep'
default_size is 1373708

del_size is 70504

add_size is 118360

Total size of commands is about 1421564.

lib_size is 2049896

Total root disk size is about 3471460.

となり、その合計が、3471460Bであることがわかります。このrootdiskの容量は4096KBです。一見、まだ余裕があるように見えますが、 これを圧縮してフロッピー一枚に押し込めるわけですから、話はそう簡単ではありません。デフォルトの手元のrootdiskは、1466246Bです。フ ロッピーディスクは一枚、1474560Bですので、あと10KBも残ってません。

何分、ギリギリの微差を扱うことになるので、圧縮という不確定要素のため、実際に圧縮したあと容量がどう変化するのかは神のみぞ知る…です。減らしたのに 増えたり、増やしたのに減ったりと、とかく世間は生きづらいものです。ですので、実際の大きさは作ってみなければわからないので、このナマの容量は参考程 度にしかなりません。

ほかに、-vというオプションもあります。これをつけるとより多くの情報を出してきます。自動判定されたライブラリのリストを見たいときなど指定して下さ い。

#mkrd.sh -s -v -cd 'tar' -ca '/bin/cpio'

こんな感じです。

共有ライブラリの自動判定について
共有ライブラリの自動判定は、lddを利用してなされていますが、まれにlddにひっかからないものがあります。たとえば、libnss* がその一例で、このスクリプトでも、libnss_files.so.2は自動判定とは別なところで加えられています。

libnss_dns.so.2がなくても、nslookupは使えますが、libnss_dns.so.2がないとCライブラリのリゾル バはDNS経由での名前解決を実行できません。


5.終わり に

なんとか、rescue diskもカーネル2.4になりました、よかったです。imageそのままをコピーして使う rescue diskと違って、スクラッチから作りだすスクリプトは何かと応用が効くのではと思っています。というワケで、バグとか気になるところとか あったらお教え下さいますよう、よろしくお願いします。何分、rootで動かすスクリプトなので、気をつけるにこしたことはないでしょう。

しかし、なんでこんなモノを突然、書いてしまったんでしょう…、別に全然ヒマじゃないのに…。実は先日、探し求めていたキーボードをついに見つけまして、 980円のジャンクですが、箱入り美品で…う、うれしかったんです、キーボードをさわっていたかったんです。フルサイズのテンキーレスキーボード、GP5 -R1KB2です。難を言うなら、101(104?)英語なことです(テンキーレスなので101じゃないですが…)。ホントは日本語のヤツがよかったんで すが、まぁ、しかたがないです。あぁー、ついに宗旨がえです。

だんだん、日本語キーボードの感覚もうすらいできました。しかし、まだまだ間違えます。とくによく間違えるのは『"』で、どうしても、『2』のところに手 が動きます。『"』なんて別にそんな使うわけでもないのに、なぜかちゃんと体がおぼえていて、それって不思議ミステリー…な感じです。


うーん、しかしftpのトラブルには非常に手間取ってしまいました。(ちょっとオオゲサですが)莫大な時間を浪費してしまいました。おかげで色々と、とど こおってしまっています。ホントはこんなことの優先順位はかなり低いはずなので、気にし ない、ほっておく、という選択肢もあったのですが、こういうのは性格ですからねぇ、いかんともしがたいです。ごめん、関係各所。


2003年6月13日 よしのぶ
e-mail;yoshino@rita.karing.jp
 
index.html  ひとつもどる

www.karing.jp started running since 2003.6.7.