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がみつからない場合は、次に進んで他の手段を選 べるようにしなくちゃいけないんだな。