[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[debian-users:28726] potato install via USB floppy
- From: Taketoshi Sano <kgh12351@xxxxxxxxxxx>
- Subject: [debian-users:28726] potato install via USB floppy
- Date: Wed, 13 Jun 2001 01:56:09 +0900
- X-dispatcher: imput version 991025(IM133)
- X-fingerprint: A1A0 F2D0 9C5D 7D61 DBA1 1507 D0B3 F3D0 AE31 C009
- X-ml-info: If you have a question, send e-mail with the body "help" (without quotes) to the address debian-users-ctl@debian.or.jp; help=<mailto:debian-users-ctl@debian.or.jp?body=help>
- X-ml-name: debian-users
- X-mlserver: fml [fml 3.0pl#17]; post only (only members can post)
- Message-id: <20010613015001I.kgh12351@xxxxxxxxxxxxxxxxxxxx>
- X-mail-count: 28726
- X-mailer: Mew version 1.94.2 on Emacs 20.7 / Mule 4.0 (HANANOEN)
佐野@浜松です。
以前、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 (佐野 武俊)