[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[debian-users:39245] make-kpkg --initrd (Re: Kernel panic: No init found)
さとうふみやす です。
At Tue, 13 Jan 2004 04:37:58 +0900,
nakajin-tuyosi wrote:
> > fakeroot make-kpkg --revision=custom.1 kernel_image
> make-kpkg --initrd --revision=0308udf kernel-image
> (ここだけが別です)
> 多分両方ともいけてると思いますが、どこにどんな差があるのでしょうか?
make-kpkg(1) のマニュアルに書かれていますが、kernel-image*.deb を
インストールするときに mkinitrd(8) が実行されて、initrd が作成
されるようになります。
…
つい最近、私も make-kpkg の --initrd オプションを試したことが
あるのですが、ブート時になぜか cramfs な initrd のマウントに失敗し
ブートできない (kernel panic) カーネルになってしまいます。
カーネルのソースは、cramfs な initrd に対応するパッチが
取り込まれた Linux 2.4.22 と Linux 2.4.23 で試しました。
(Debian のカーネルソース (kernel-source-*) も試したような気がするが、
記憶が定かではない…)
具体的にはどうなるかと言うと、
RAMDISK: cramfs filesystem found at block 0
と initrd が cramfs であると認識できるのに、
RAMDISK: Loading 1016 blocks [1 disk] into ram disk...done.
Freeing initrd memory: 1016k freed
cramfs: wrong magic
Kernel panic: VFS: Unable to mout root fs on 03:02
と、実際にマウントしようとすると cramfs な magic ではないと
認識されてしまいます。
Google などで検索したところ同じ問題に遭遇している例がいくつか
ありましたが、「ルートパーティションがあるデバイスのアクセスに
必要なモジュールが有効になっていないのが原因だ」という的外れの
回答くらいしかなく、今のところ原因は特定できていません。
たぶん、カーネルのコンフィグレーションに依存しているのでは
ないかと予想しているのですが、時間がとれず、テストできていません。
ちなみに、/etc/mkinitrd/mkinitrd.conf の MKIMAGE の値を
MKIMAGE='/project/sbin/genext2fs -d %s -f %s' のように書き換え、
以下の (アドホックな?) スクリプトを用いることで initrd を ext2 に
したところ、問題は起りませんでした。
#!/bin/sh
##
## Generate a ext2 filesystem on loop device or file
## Copyright (c) 2003 SATOH Fumiyasu, All rights reserved.
##
## Copyright: GNU General Public License
## Date: 2003-12-16, since 2003-12-15
##
## $Id$
## Required external commands are:
## sed, basename, expr, gzip, wc, find, cpio, dd, df,
## mkdir, rmdir, mount, umount, mkfs.ext2, tune2fs
## Startup
## ======================================================================
set -u
set -e
PATH="/sbin:/usr/sbin:/bin:/usr/bin"
export PATH
umask 022
dev_ram="/dev/ram"
fs_type="ext2"
fs_blocksize="1024"
mount_point="/tmp/`basename "$0"`.$$"
dir="."
device=""
while getopts d:f:b: opt; do
case "$opt" in
f)
device="$OPTARG"
;;
d)
dir="$OPTARG"
;;
b)
fs_blocksize="$OPTARG"
;;
*)
exit 1
;;
esac
done
shift `expr $OPTIND - 1`
if [ -z "$device" ]; then
echo "usage: $0 -f device [-d source]"
exit 100
fi
## ======================================================================
dir_usage=`du -sk "$dir" |sed 's/[^0-9].*$//'`
dir_files=`find "$dir" -print |wc -l`
## +100 for ???? (FIXME)
fs_blockcount=`expr "$dir_usage" '*' 1024 / "$fs_blocksize" + 100`
## +2 for '.' and '..', +2 for temporary
fs_inodes=`expr "$dir_files" '+' 2 '+' 2`
## ======================================================================
dd if=/dev/zero of="$dev_ram" bs="$fs_blocksize" count="$fs_blockcount"
mkfs.ext2 -v -m0 -b "$fs_blocksize" -N "$fs_inodes" "$dev_ram" "$fs_blockcount"
tune2fs -c 0 -i 0 "$dev_ram"
mkdir "$mount_point"
mount -t ext2 "$dev_ram" "$mount_point"
rmdir "$mount_point/lost+found"
(cd "$dir" && find . -print0 |cpio -0pdum "$mount_point")
df -k "$mount_point"
df -i "$mount_point"
umount "$mount_point"
dd if="$dev_ram" bs="$fs_blocksize" count="$fs_blockcount" \
|gzip -9 \
>"$device"
rmdir "$mount_point"
## FIXME: How to free the memory for /dev/ram?
exit 0
--
-- Name: SATOH Fumiyasu -- Home: http://www.sfo.jp (in Japanese only)
-- Mail: fumiya at net-thrust.com, samba.gr.jp, namazu.org or ...