[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:28726] potato install via USB floppy



佐野@浜松です。

以前、USB フロッピーからのインストールについての話題が
ありましたが、今回 2.4.5 カーネルを使って USB フロッピー
経由での IBM ThinkPad i シリーズ 1200 への potato の
インストールに成功したので報告します。

USB フロッピーを使ってインストーラを起動する場合、一般的には
最初の rescue フロッピーは BIOS 経由でアクセスするために特に
問題は無く、フロッピーを入れ換えて root フロッピーを入れた
ところでカーネルが USB フロッピードライブにアクセスできずに
止まる、という現象になると思います。

ところが最近入手した IBM の ThinkPad i シリーズ 1200 の場合、
どうやら BIOS に癖があるらしく、最初の rescue フロッピーから
して起動しません。カーネルをロードするはるか手前で "boot failed" 
というエラーメッセージを吐いて止まってしまいます。

すこし試した範囲ではカーネルをベタ書きしたフロッピーや LILO を
入れたフロッピーからなら特に問題無く起動できるようなので、
LILO で起動するフロッピーを作成することにしました。

起動に使ったフロッピーのイメージは後で

 http://master.debian.or.jp/~sano/usbfdboot/

以下に置いておきます。カーネルの config や、後述の変更箇所に
ついてもこの中に入れておきますので、興味のある方はどうぞ。

さて 2.4.5 カーネルなんですが、今回は Debian パッケージの
カーネルソースではなく、ftp.kernel.org からもらってきた
オリジナルコードのソースアーカイブを使いました。

<余談>

せっかくなのでカーネル組み込みでの PCMCIA も試してみようとした
ところ、drivers/scsi/pcmcia/Config.in に typo があったらしく、
PCMCIA の SCSI カード用ドライバーが組み込めません。そこで以下の
ように変更しました。

--- Config.in.0	Fri Jun  8 15:12:02 2001
+++ Config.in	Fri Jun  8 15:13:14 2001
@@ -7,9 +7,9 @@
 
 bool 'PCMCIA SCSI adapter support' CONFIG_SCSI_PCMCIA
 if [ "$CONFIG_SCSI_PCMCIA" = "y" ]; then
-   dep_tristate '  Adaptec AHA152X PCMCIA support' CONFIG_PCMCIA_AHA152X m
-   dep_tristate '  Qlogic PCMCIA support' CONFIG_PCMCIA_QLOGIC m
-   dep_tristate '  Future Domain PCMCIA support' CONFIG_PCMCIA_FDOMAIN m
+   dep_tristate '  Adaptec AHA152X PCMCIA support' CONFIG_PCMCIA_AHA152X $CONFIG_SCSI_PCMCIA
+   dep_tristate '  Qlogic PCMCIA support' CONFIG_PCMCIA_QLOGIC $CONFIG_SCSI_PCMCIA
+   dep_tristate '  Future Domain PCMCIA support' CONFIG_PCMCIA_FDOMAIN $CONFIG_SCSI_PCMCIA
 fi
 
 if [ "$CONFIG_PCMCIA_QLOGIC" = "y" -o "$CONFIG_PCMCIA_AHA152X" = "y" -o \

結局まだ 2.4.5 カーネルに組み込んだ PCMCIA ドライバーで
SCSI や NIC を使えるかどうかの確認はしていないので、
今回の話とは直接関係ありませんが、とりあえずこれも
何かの参考になるかもしれませんので書いておきます。

</余談>

さて、LILO で起動した 2.4.5 カーネルですが、普通に root=/dev/sda と
するとフロッピーを指定した時のように "Insert root disk ..."  という
プロンプトを出したりせず、いきなり root fs をマウントしようとして
アクセスできずにパニックしてしまいます。

「これはフロッピーとそれ以外で動作を区別しているな」と狙いを付けて
まずは init/main.c を見ると static void prepare_namespace(void)
という関数の中に 

        /* Mount the root filesystem.. */
        mount_root();

という記述があります。この関数を検索してみると fs/super.c に本体が
void __init mount_root(void) として定義してあります。

この関数をちょっと眺めると

#ifdef CONFIG_BLK_DEV_FD
        if (MAJOR(ROOT_DEV) == FLOPPY_MAJOR) {
#ifdef CONFIG_BLK_DEV_RAM
                extern int rd_doload;
                extern void rd_load_secondary(void);
#endif
                floppy_eject();
#ifndef CONFIG_BLK_DEV_RAM
                printk(KERN_NOTICE "(Warning, this kernel has no ramdisk support)\n");
#else
                /* rd_doload is 2 for a dual initrd/ramload setup */
                if(rd_doload==2)
                        rd_load_secondary();
                else
#endif
                {
                        printk(KERN_NOTICE "VFS: Insert root floppy and press ENTER\n");
                        wait_for_keypress();
                }
        }
#endif

という箇所があったので、「ああ、これか」と以下のように
変更してみました。

--- super.c.0	Tue Jun 12 08:54:22 2001
+++ super.c	Tue Jun 12 17:52:53 2001
@@ -1459,7 +1459,11 @@
 #endif
 
 #ifdef CONFIG_BLK_DEV_FD
-	if (MAJOR(ROOT_DEV) == FLOPPY_MAJOR) {
+	if (MAJOR(ROOT_DEV) == FLOPPY_MAJOR
+#ifdef CONFIG_USB_STORAGE
+	 || MAJOR(ROOT_DEV) == SCSI_DISK0_MAJOR
+#endif
+	) {
 #ifdef CONFIG_BLK_DEV_RAM
 		extern int rd_doload;
 		extern void rd_load_secondary(void);


CONFIG_USB_STORAGE が定義されている時は root=/dev/sda の時にも
root=/dev/fd0 の時と同様な処理をする、という変更です。

で、まずはこれだけで試してみると、、、ダメです。なんだか
ファイルシステムを認識できないらしい。最初は reiser FS と
誤認識してるようだったので、いったん reiser を無効にして
カーネルを build し直したりしましたが、それでもダメ。

で、再度上記のコードをチェックすると

#ifndef CONFIG_BLK_DEV_RAM
                printk(KERN_NOTICE "(Warning, this kernel has no ramdisk support)\n");
#else
                /* rd_doload is 2 for a dual initrd/ramload setup */
                if(rd_doload==2)
                        rd_load_secondary();
                else
#endif

この部分が目に止まりました。ここで rd_load_secondary() を
検索してみると drivers/block/rd.c に見つかります。

void __init rd_load_secondary(void)
{
        rd_load_disk(1);
}

この rd_load_disk() は同じ rd.c の中で定義されています。

static void __init rd_load_disk(int n)
{
#ifdef CONFIG_BLK_DEV_INITRD
        extern kdev_t real_root_dev;
#endif

        if (rd_doload == 0)
                return;

        if (MAJOR(ROOT_DEV) != FLOPPY_MAJOR
#ifdef CONFIG_BLK_DEV_INITRD
                && MAJOR(real_root_dev) != FLOPPY_MAJOR
#endif
        )
                return;


やはりここにも FLOPPY_MAJOR でチェックしてる箇所がありました。
というわけでここも以下のように変更します。

--- rd.c.0	Tue Jun 12 17:47:34 2001
+++ rd.c	Tue Jun 12 17:51:45 2001
@@ -716,6 +716,9 @@
 #ifdef CONFIG_BLK_DEV_INITRD
 		&& MAJOR(real_root_dev) != FLOPPY_MAJOR
 #endif
+#ifdef CONFIG_USB_STORAGE
+		&& MAJOR(ROOT_DEV) != SCSI_DISK0_MAJOR
+#endif 
 	)
 		return;
 

これで、root=/dev/sda を指定しても

"VFS: Insert root floppy disk to be loaded into RAM disk and press ENTER\n");

というメッセージが表示され、かつこのメッセージが表示されてからしばらく待って
 USB フロッピードライブが /dev/sda としてカーネルに認識されたのを確認してから
Enter キーを押すと、ちゃんと圧縮された ext2 fs な root image をメモリーに
ロードしてインストーラが起動するようになりました。

あとは Alt+F2 でセカンドコンソールに移動し、

 mount /dev/rd/0 / -o remount,rw

 (何故か read-only でマウントされていたので)

 cd /dev
 mv fd0 fd0.chk
 ln -s sda fd0

 (/dev/fd0 で USB なフロッピードライブ (/dev/sda) にアクセスできるように)

を実行してから、順番にインストーラのメニューから手順を実行していくだけ、
なんですが、何故かディスクのパーティション分割やスワップ領域の作成など
の時に /dev/hda が選択枝に出てこなかったので、このへんも Alt+F2 で
セカンドコンソールに移動して、そっちでやってしまいました。

インストール先のパーティションを作成して mke2fs が終了したら
そこを /target にマウントします。

「カーネルとモジュールのインストール」や「ベースシステムの
インストール」は普通の potato 用 boot-floppies のフロッピー
ディスクを USB フロッピーディスク経由で読み込んで実行できました。

ただ、「fdflush がエラーになる」とか、フロッピーにアクセスするたびに
エラーメッセージが出ますが、無視して繰り返し実行すれば OK です。

あと、最後に LILO をインストール先のパーティションにインストール
したのですが、この時は lilo.conf に何かエラーがあるとかで LILO が
ちゃんと働いてくれず、結局自分で最初から lilo.conf を書き直して
やっとLILO を実行できました。

この後、再起動してちゃんと Debian が起動することを確認しています。
上記の方法を使えば USB フロッピーしか使えない状況でも Debian を
インストールすることは可能です。

P.S.

実は ThinkPad i シリーズ 1200 の場合は CD-ROM 内蔵なので
苦労して USB フロッピー経由でインストールしなくても、製品に
附属してくるリカバリー CD-ROM で起動して、メニューが表示された
ところで ESC キーを押して DOS に落ち、そのまま CD-ROM を
Debian CD の 1 枚目に入れ換えて X: ドライブから install 
ディレクトリの boot.bat を実行すれば CD-ROM からインストーラが
起動します。特に事情が無ければ、普通はこっちの方法を使ったほうが
楽で速いでしょう。

今回 USB フロッピー経由のインストールに挑戦したのは、以前に
そういう質問があったのを覚えていたのと、個人的な興味から、
ですね。(リカバリー CD とか DOS の助けを借りずにできる方法を
確保しておきたかった、というのもあるかな)

以上、簡単ですが御参考まで。

--
     # (わたしのおうちは浜松市、「夜のお菓子」で有名さ。)
    <kgh12351@xxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)