[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