ぎんあん日誌

gin-an diary

2002.2.17.


ローカルハードディスクからのループバックマウントでのインストールについて、 結論編。むちゃくちゃ大変です。あきらめました。

目次


起動順序

まず、インストーラがどのような順序で起動されるか知る必要がありました。 理解した範囲では…

  1. フロッピーに入っているboot.img等のインストーラから syslinuxというブートローダーがPCにロードされる。
  2. syslinuxが、boot.imgに入っているいろいろなメッセージを表示し、 ユーザーからのオプションを受けて、boot.img内のカーネルを、 initrd.imgをram diskに読みこんで起動する。
  3. 起動されたカーネルがinitrd.img内のinitを起動し、 それが、loaderを起動する。
  4. loaderがユーザーにインストール元を尋ね、それに答えて、 stage2をロードする。
  5. loaderが、stage2にあるanacondaを起動する。
  6. anacondaがインストール時の様々なオプションをユーザーに尋ね、 それに合せて、rpmのインストールと諸々のファイルの設定をする。

ということのようです。 ここで、いまやろうとしている「reiserfsにあるisoイメージをループバックマント」 するためには、

が必要だろうなぁ、と思うわけです。

準備

Kondaraのanacondaとkernelをいただいてきて眺めてみました。 こういう時には、www上で見られる CVSレポジトリがとても役にたちます。

kernel-BOOT(インストーラのカーネル)の .config を眺めてみると、 CONFIG_BLK_DEV_LOOP=yになっていることがわかります。 ということは、ユーザーが使えるコマンドさえあれば、 ループバックマウントはできそうです。一方、CONFIG_REISERFS_FS=mなので、 reiserfsをマウントするにはモジュールが必要そうです。

reiserfsのモジュールの準備

これについては、結局isoを展開してインストール成功版 をご覧ください。

ループバックマウントのためのコマンド

インストーラに入っているmountコマンドは、 最低限のオプションしか実装されていないので、 ループバックマウントはできません。 losetupコマンドをstatic linnkで作ります。

  1. ソースをいただいてくる。
    rpm -qi losetupから辿ると、このパッケージはmount-hoge.nosrc.rpm から作られていること、mount.specを見て、ソースが、 utli-linux-hoge.tar.bz2であることがわかります。 今回は、util-linux-2.11n.tar.bz2 を頂いてきました。
  2. 解凍
    tar zxvf ../package/util-linux-2.11n.tar.bz2とか。
  3. コンパイル
    INSTALLを見ると、static link版の作りかたがわかります。
    ./configure
    make -C lib LDFLAGS=-static xstrncpy.o
    make -C mount LDFLAGS="$LDFLAGS -I../lib" loop.h losetup
    strip mount/losetup
    
  4. 確認
    file mount/losetupすると、static link されていることが確認できます。
  5. 使ってみよう
    # /tmp/losetup /dev/loop0 /home/asumi/rc2iso/2.1RC2-i586-bin-disc1.iso
    # /bin/mount -t iso9660 /dev/loop0 /mnt/tmp
    # ls /mnt/tmp
    Kondara/  dosutils/  images/
    # /bin/umount /dev/loop0
    # /tmp/losetup -d /dev/loop0
    
    よしよし。ループバックマウントできてます。

次に、インストーラ内でループバックマウントと symbolic linkするスクリプトを作ります。 lnコマンドもそれほど便利にはできてないので。

ancaondaでは、デフォルトでインストール元のファイルシステムを、 /tmp/hdimageにマウントするようになっているので、 それに倣って、マウント場所もISOイメージの場所も決め打ちになってます。 ループバックデバイスのmajor numbrは7の模様。 一度ループバックすると、RPMSディレクトリに沢山symlinkができますが、 2回目にはそれが邪魔になって正常にsymlinkできないので、一度rmしてください。 (ほんとうは上記のシェルスクリプトにやらせればいいんだけど。)

で、インストール

前回の挑戦と同じく、 LILOからインストーラを起動しました。 だって、とりはずし式のフロッピードライブ持って帰るの重いんですもの。 メディアも無いし…(おいおい)。

reiserfsもマウントできて順調に進んでいると思ったのですが、 パッケージ情報を読む時に…

rc = _isys.mount(fstype, device, location, readOnly)
SystemError : (16, 'Device or resource busy')

がーん。

anaconda (pythonのスクリプト) や、 そこにインポートされているスクリプトをつらつら眺めてみると、 すくなくともハードディスクやCD-ROMからインストールする時には、 インストーラは、インストール元から情報が必要になるたびに、 インストール元をマウントし、 情報を読んでからアンマウントするようにしていることがわかりました。 インストーラが途中でこけても、ハードディスクへの害が最小限になるように、 しているのですね。

で、マウントしてないと思ってたインストール元が、 ユーザーに勝手にマウントされていると、 上のようなエラーをもらってしまうわけだ。 マウントするほうは無視できても、アンマウントする時には、 まずループバックマウントを外してからハードディスクをアンマウントするという、 ちょっと複雑な動作が必要になる。

anacondaに、 ループバックマウント用のモジュール(というのかな?)を足してやって、 loaderからそれを指定できるようにすればいいのですが、 かな〜り複雑なので、パスします。 残念。

というわけで、ループバックマウントしてインストールはできませんでした。 ちゃんちゃん。


開発者のみなさまに感謝

Back to gin-an diary. [zunda]
zunda <zunda at freeshell.org>