[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 ...