momongaの中身を見る。今回の目標は、
ローカルHDにあるstage2やパッケージのツリーからのインストールを可能にする。
ローカルHDにあるISO9660イメージからのインストールを可能にする。
今見ているのは、momonga-0.6.1-1m。
stage2の検出は、loader/loader.cでやっているようだ。main()を辿っていくと、 最後に、
printf(_("Running momonga - please wait...\n")); printf("url = %s\n", url); setenv("MOMONGA", "1", 1); setenv("LANG", lang, 1); setenv("SHELL", "/usr/bin/bash", 1); execv(momongaArgs[0], momongaArgs); perror("exec");
している。urlは、本来は/tmp/methodに書かれるのだろうが、今は#if 0されている。 main()内でurlを決めている個所は、
if (ksFile) { startNewt(flags); ksReadCommands(ksFile); url = setupKickstart("/mnt/source", &kd, modInfo, modLoaded, &modDeps, &flags, ksNetDevice); }
次に、
if (!url) { url = doMountImage("/mnt/source", &kd, modInfo, modLoaded, &modDeps, &lang, &keymap, &kbdtype, flags); }
のどちらか。今、kickstartは置いておくとして、doMountImage()が全てを決め ていることになる。
カーネルモジュールを確認してどのようなハードウェアが使えるか決めた後、ま ずは、
/* This is a check for NFS or CD-ROM rooted installs */ if (!access("/mnt/source/Momonga/instimage/usr/bin/momonga", X_OK)) return "cdrom://unknown/mnt/source/.";
している。つまり、NFSやCD-ROMから2nd stageを読む場合に/mnt/sourceにもう マウントされている可能性があるということだ。そうでなければ、
startNewt();
して、言語の選択、キーボードの選択をして、
case STEP_METHOD:
でインストール方法の選択をする。
#if ( defined (INCLUDE_LOCAL) && !defined (INCLUDE_PCMCIA) ) \ || defined (__sparc__) || defined (__alpha__) step = STEP_URL; dir = 1; break; #endif
INCLUDE_LOCALが定義されてる場合はそのまま次へ。そうでなければ、
What type of media contains the packages to be installed?
と尋ねて、installNames配列から、methodNumを決める。次に、インストール元 の場所を決める。
Momonga CDがみつかればはっぴー。
url = setupCdrom(NULL, location, kd, modInfo, modLoaded, modDepsPtr, flags, 1, 1);
そうでなければ、
url = installMethods[validMethods[methodNum]].mountImage( installMethods + validMethods[methodNum], location, kd, modInfo, modLoaded, modDepsPtr, flags);
としてインストール元を決める。
つまり。installNames配列がどうやって決まるかを見なくちゃいけないわけだ。 これは doMountImageの最初の方でやっている。
doMountImageの最初に、installMethodsから可能な方法をコピーして installNamesを決めてるんだ。installMethds[]はloader.c:133くらいでスタテ ィックに決めている。loader.c:102より、
struct installMethod { char * name; int network; enum deviceClass deviceType; /* for pcmcia */ char * (*mountImage)(struct installMethod * method, char * location, struct knownDevices * kd, moduleInfoSet modInfo, moduleList modLoaded, moduleDeps * modDepsPtr, int flags); };
で、#ifを除くと、loader.c:133より、
static struct installMethod installMethods[] = { { N_("Local CDROM"), 0, CLASS_CDROM, mountCdromImage }, { N_("NFS image"), 1, CLASS_NETWORK, mountNfsImage }, { "FTP", 1, CLASS_NETWORK, mountUrlImage }, { "HTTP", 1, CLASS_NETWORK, mountUrlImage }, { N_("Hard drive"), 0, CLASS_HD, mountHardDrive }, };
つまり、ローカルハードディスクからのインストールは既にサポートされている 様子だ。
loader.c:1072にmountHardDrive()がある。ここでは、
What partition and directory on that partition hold the CD (iso9660) images for Momonga?
というメッセージが出力される。あり?isoイメージをマウントするの?とにか く、ここに来られれば、ローカルディスクのISOイメージを使えそうだ。この後 で、loader.c:1153で、
url = setupIsoImages(part->name + 5, type, dir, flags);
している。
loader.c:977 からパーティションテーブルを読み込んでいるが、ファイルシス テムとして有効そうなのは、
case BALKAN_PART_DOS: case BALKAN_PART_EXT2:
だけみたい。balkan/balkan.hを見ると、DOS/EXT2/OTHER/NTFS/SWAP/UFS/RAIDの 区別しかないみたい。loader.c:1149 を見るとBALKAN_PART_DOSはvfatのことの ようだ。
loader.c:561 setupIsoImages() は、選択されたパーティションを、
/tmp/hdimage
にマウントして、/tmp/hdimage/ディレクトリ に対して、validIsoImages () し ている。(loader.c:580)
loader.c:484 validIsoImages () では、引数になったディレクトリ内のファイ ルを順に loopback mount して、その中に、.../Momonga/base/hdstg1.img が含 まれていれば、そのファイルを返す。
installMethods[]の最後の要素が有効になるのは、
#if defined(INCLUDE_LOCAL)
のとき。Makefileを見ると、loader.o loader-local.o loader-pcmcia.oでは -DINCLUDE_LOCALされていて、それぞれ、loader loader-local loader-pcmciaと してリンクされる。
scripts/mk-images.i586でloader-hogeはinitrd.imgに組み入れられるみたいだ。 まず、
が入り、各言語のブートディスクに、
が入る。
つまり、少なくともboot.imgには、mountHardDriveが有効なloaderが入ってるっ てことだ。そういうわけで、boot.imgをフロッピーに書いておけば、ローカルデ ィスクの中のISO 9660イメージをループバックマウントできるはず。
この前できなかったのは、違うバージョンのmomongaのイメージを使おうとして、 MomongaディレクトリじゃなくてKondaraディレクトリしかなかったからんだん だろうな。
というわけで、momonga-0.6.1-1mのソースを見た限りでは、
してインストールすることはできそうだ。
そして、対応できるファイルシステムを増やすには、
必要がありそう。もし、ブートディスクの容量を超過しちゃう場合には、
必要もあるだろう。
一方、ローカルディスクのISO9660イメージではなくて、インストーラのツリー そのものに対応するためには、loader/loader.c に何か処理を追加する必要があ る。最も直接には、mountHardDrive() でISOイメージだけではなくて必要なファ イルそのものを検出して、そのファイルがあれば validIsoImage() すること無 しに指定されたディレクトリを url として返すことだろうけど、それでいいの かな?
手元のmoonga-0.6.0-1mで試してみよう。
# dd if=boot.img of=/dev/fd0
して、isoイメージを、/home/zunda/Momonga/momonga-0.6.0-1m-020718B.iso つ まり /dev/hda3 (ext2) の/zunda/Momonga/momonga-0.6.0-1m-020718B.iso とし て置いておいて、上記で作成したフロッピーから起動。
起動後CDを読もうとして(入れてない)、
The Momonga CD was not found in any of your CDROM drives. Please insert the Momonga CD and press OK to retry. OK/Back
だめやん。なんで?
上記のメッセージは、loader.c:1315 setupCdrom () から出されているようだ。 setupCdrom () は doMountImage () から呼ばれていて、CD-ROMがみつからない 時点で、nullを返してほしいのに、CDROMを読むことに固執している。
CD-ROMドライブがあっても、CDがみつからない場合は、次に進んで他の手段を選 べるようにしなくちゃいけないんだな。