[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gentoojp-users 415] cloop.o(Re:ppc版_OldWorld機用の起動CD)



 山倉様、分かりやすいアドバイスをありがとうございました。

>これだと多分、始めの方のエラーメッセージは既に流されてしまっている状態
>ですね。起動にお使いのカーネルはどのような物でしょうか? LiveCDから取っ
>たものですか?
>
 ダウンロードしたイメージをマウントしますとふたつのボリュームが
デスクトップ上に現れました。GentooPPC_1.4_rc7とCDROMという
名前でした。フォーマット形式が異なっていますがこれらの中身は同一と
考えてよろしいのでしょうか。HFS形式である前者を編集し、CDに焼いて
使用しております(LiveCDとはこれを指すと思ってよいでしょうか)。
 この中にありましたカーネルvmlinuxは起動時に画面に現れたメッセージから
2.4.21-ppc-r1だと分かりました。

>ここでどのような処理が行なわれているかを知るには、CD上のinitrd.img.gz 
>の中身を確認する必要があります。それためには、initrd.img.gzを伸長し、
>loopデバイスを使ってどこかにmountします。その中に、linuxrc というスク
>リプトがありますので、それを読んでください。
>
>修正あるいはデバッグしたければスクリプトを書き換え、umountしてgzipで圧
>縮し、CD内のものと置き換えてやれば良いでしょう。
>
>initrdについては、カーネルソースのDocumentation/initrd.txtに書いてあり
>ます。
>
>
>ちなみに、live.gcloop は http://dev.gentoo.org/~lu_zero/gcloop/ にある
>ツールで圧縮されています。
>  
>
 以下がGentooPPC_1.4_rc7に含まれていたlinuxrcの中身です。

#!/bin/sh
#
# Pieter Van den Abeele <pvdabeel@xxxxxxxxxx>
# (C) 2002 Pieter Van den Abeele
# Distributed under the GPL v.2

PATH=/usr/sbin:/usr/bin:/sbin:/bin

mount -o remount,rw /

mount proc -t proc /proc
mount devfs -t devfs /dev
mount tmpfs -t tmpfs /mnt/live

echo "0" >/proc/sys/kernel/printk

findmount() {
CDROM="/dev/cdroms/${1}"
mount -t iso9660 -r $CDROM /mnt/live/mnt/cdrom >/dev/null 2>&1
sleep 5
if [ -d /mnt/live/mnt/cdrom/live.gcloop ]; then
umount /mnt/live/mnt/cdrom
echo "LRC: live.gcloop not found on $CDROM"
sleep 5
shift
findmount $*
else
# losetup /dev/loop/0 /mnt/live/mnt/cdrom/live.iso
# mount -t iso9660 -r /dev/loop/0 /mnt/live/mnt/iso/
mknod /dev/cloop b 240 0
insmod /lib/modules/misc/cloop.o file=/mnt/live/mnt/cdrom/live.gcloop
mount -o ro -t ext2 /dev/cloop /mnt/live/mnt/iso/

fi
}

cd /mnt/live
mkdir /mnt/live/mnt
mkdir /mnt/live/mnt/iso
mkdir /mnt/live/mnt/cdrom
mkdir /mnt/live/mnt/initrd
mkdir /mnt/live/mnt/.init.d

findmount cdrom0 cdrom1 cdrom2 cdrom3 cdrom4

ln -s mnt/iso/bin .
ln -s mnt/iso/lib .
ln -s mnt/iso/sbin .
ln -s mnt/iso/boot .
ln -s mnt/iso/usr .
ln -s mnt/iso/opt .

mount tmpfs -t tmpfs /mnt/live/lib/modules
cp -a /lib/modules/* /mnt/live/lib/modules

mkdir proc etc var
cd mnt/iso
cp -a dev home root tmp etc /mnt/live/
chmod 1777 /mnt/live/tmp

cd /mnt/live/var
ln -s ../mnt/iso/var/db .
ln -s ../mnt/iso/var/empty .
cd ../mnt/iso/var
cp -a cache lib lock log run spool tmp ../../../var/

echo "6" >/proc/sys/kernel/printk

umount /proc
cd /mnt/live
echo "linuxrc: please wait for INIT to start... this could take a while"
pivot_root . mnt/initrd
/bin/mount -o bind ./mnt/initrd/dev /dev
exec chroot . /sbin/init <dev/console >dev/console 2>&1

 19行目に
mount -t iso9660 -r $CDROM /mnt/live/mnt/cdrom >/dev/null 2>&1
とありますが、自分が作成するCDはhfs形式ですので
mount -t ihfs -r $CDROM /mnt/live/mnt/cdrom >/dev/null 2>&1
とあらためました。また、どの段階でエラーが発生するのかを調べるため
(もう少しスマートなやりかたがあるのでしょうが、画面にスクロールされる
メッセージを書き留めるため)

###
echo "step A"
sleep 15

などを挿入しました。具体的な内容は本文の最後に載せておきます。
 結果として、最初に出されるエラーメッセージは
insmod: init_module: cloop: Invalid argument
であることが分かりました。ls -lによって/lib/modules/misc/cloop.oが
実行可能になっておりませんでしたので、chmod u+xを行いました(これは
不要な操作かもしれません、前後でメッセージに変わりがなかったしそもそも
Invalid argumentとあるからには実行はされているようですし)。

>CDに入っているcloop.oがそれをマウントするた
>めのモジュールですが、環境によってはloadできないかも知れません。その時
>は上述のURLからソースを落してくれば、自分でモジュールを作ることもでき
>ますし、伸長するコマンドを作ることもできます。伸長してしまえば、loopデ
>バイスを使ってマウントできます。

>linuxrcの最後でinitを実行した後は、こちらの世界になります。

 というわけで、山倉様にご指摘いただいたようにcloop.oを検討する必要が
ありそうですが、残念ながらこの段階でつまづいております。とくに、ひとつに
は具体的にモジュール、コマンドを作る手順、あるいはそれらに関するキーワード
やコマンド名を教えていただきたいという点、ふたつめにはなぜcloop.oが
当方の環境で動かなかったのかという点について(環境によって引数がinvalidに
なったりならなかったりするというのはどういったケースが相当するのかぴんと
来ないのです)、ご教授いただけたら幸いです。

# 以下が現在デバッグに用いましたlinuxrcの中身です。

#!/bin/sh
#
# Pieter Van den Abeele <pvdabeel@xxxxxxxxxx>
# (C) 2002 Pieter Van den Abeele
# Distributed under the GPL v.2

PATH=/usr/sbin:/usr/bin:/sbin:/bin

mount -o remount,rw /

mount proc -t proc /proc
mount devfs -t devfs /dev
mount tmpfs -t tmpfs /mnt/live

echo "0" >/proc/sys/kernel/printk

findmount() {
    CDROM="/dev/cdroms/${1}"
#    mount -t iso9660 -r $CDROM /mnt/live/mnt/cdrom >/dev/null 2>&1
    mount -t hfs -r $CDROM /mnt/live/mnt/cdrom >/dev/null 2>&1
    sleep 5
    if [ -d /mnt/live/mnt/cdrom/live.gcloop ]; then
      umount /mnt/live/mnt/cdrom
      echo "LRC: live.gcloop not found on $CDROM"
      sleep 5
      shift
      findmount $*
    else
      # losetup /dev/loop/0 /mnt/live/mnt/cdrom/live.iso
      # mount -t iso9660 -r /dev/loop/0 /mnt/live/mnt/iso/
      mknod /dev/cloop b 240 0 
      insmod /lib/modules/misc/cloop.o file=/mnt/live/mnt/cdrom/live.gcloop
      mount -o ro -t ext2 /dev/cloop /mnt/live/mnt/iso/
    
    fi
}

cd /mnt/live
mkdir /mnt/live/mnt        
mkdir /mnt/live/mnt/iso    
mkdir /mnt/live/mnt/cdrom  
mkdir /mnt/live/mnt/initrd 
mkdir /mnt/live/mnt/.init.d

###
echo "step A"
sleep 15

findmount cdrom0 cdrom1 cdrom2 cdrom3 cdrom4

ln -s mnt/iso/bin  .
ln -s mnt/iso/lib  .
ln -s mnt/iso/sbin .
ln -s mnt/iso/boot .
ln -s mnt/iso/usr  .
ln -s mnt/iso/opt  .

mount tmpfs -t tmpfs /mnt/live/lib/modules
cp -a /lib/modules/* /mnt/live/lib/modules

###
echo "step B"
sleep 15

mkdir proc etc var
cd mnt/iso
cp -a dev home root tmp etc /mnt/live/
chmod 1777 /mnt/live/tmp

cd /mnt/live/var
ln -s ../mnt/iso/var/db .
ln -s ../mnt/iso/var/empty .
cd ../mnt/iso/var
cp -a cache lib lock log run spool tmp ../../../var/

###
echo "step C"
sleep 15

echo "6" >/proc/sys/kernel/printk

umount /proc
cd /mnt/live
echo "linuxrc: please wait for INIT to start... this could take a while"
pivot_root . mnt/initrd
/bin/mount -o bind ./mnt/initrd/dev /dev
exec chroot . /sbin/init <dev/console >dev/console 2>&1

--
田中 元 BYH01337@xxxxxxxxxxx