momongaの中身

momongaの中身を見る。今回の目標は、

ソース

今見ているのは、momonga-0.6.1-1m。

loader/loader.cのmain()

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()が全てを決め ていることになる。

loader/loader.cの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の最初の方でやっている。

installNamesの決定

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 },
};

つまり、ローカルハードディスクからのインストールは既にサポートされている 様子だ。

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のことの ようだ。

setupIsoImages() がやること

loader.c:561 setupIsoImages() は、選択されたパーティションを、

/tmp/hdimage

にマウントして、/tmp/hdimage/ディレクトリ に対して、validIsoImages () し ている。(loader.c:580)

loader.c:484 validIsoImages () では、引数になったディレクトリ内のファイ ルを順に loopback mount して、その中に、.../Momonga/base/hdstg1.img が含 まれていれば、そのファイルを返す。

mountHardDrive() が有効になるのはいつ?

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


Back to siroan diary. [zunda]
zunda <zunda at freeshell.org>