您的位置:首页 > 运维架构 > Linux

关于arm linux initrd boot 探讨

2012-10-15 18:20 337 查看
关于 DEV_INITRD 支持开启后,且initrd_rootfs 无/init 文件,boot fail 问题探讨,如下是部分.config配置截取:
CONFIG_BLK_DEV_INITRD=y

CONFIG_INITRAMFS_SOURCE="../rootfs_base/rootfs_base.busybox-1.19.3.gcc441.armv7"

CONFIG_INITRAMFS_ROOT_UID=0

CONFIG_INITRAMFS_ROOT_GID=0
下面是CMDLINE,主要关注root/rootfstype 设置,其它设置有些是关于特别platform的设置参数不用care it.

CONFIG_CMDLINE="rootdelay=2 root=/dev/mmcblk0p2 init=/init cgroup_disable=memory
rootfstype=ext4 rw mem=1024M console=ttyS0,115200 androidboot.console=ttyS0 consoleblank=0 reserved_fb=1 videomode=128:128:72:50:1:0:255:0:2:0:0:0:0:0:0:49"

如按上面配置可能会导致kernal panic.
omaplfb: Device 0: PVR Device ID: 1

Waiting 2sec before mounting root device...

VFS: Cannot open root device "mmcblk0p2" or unknown-block(179,2)

Please append a correct "root=" boot option; here are the available partitions:

b300 3872256 mmcblk0 driver: mmcblk

b301 2884096 mmcblk0p1 00000000-0000-0000-0000-000000000000mmcblk0p1

b302 507904 mmcblk0p2 00000000-0000-0000-0000-000000000000mmcblk0p2

b303 393216 mmcblk0p3 00000000-0000-0000-0000-000000000000mmcblk0p3

b304 65536 mmcblk0p4 00000000-0000-0000-0000-000000000000mmcblk0p4

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2)

[<803b6130>] (unwind_backtrace+0x0/0xe4) from [<807cfffc>] (panic+0x58/0x194)

[<807cfffc>] (panic+0x58/0x194) from [<8000925c>] (mount_block_root+0x254/0x2a4)

[<8000925c>] (mount_block_root+0x254/0x2a4) from [<80009474>] (prepare_namespace+0x16c/0x1d0)

[<80009474>] (prepare_namespace+0x16c/0x1d0) from [<80008440>] (kernel_init+0x120/0x15c)

[<80008440>] (kernel_init+0x120/0x15c) from [<803b1424>] (kernel_thread_exit+0x0/0x8)

CPU0: stopping

[<803b6130>] (unwind_backtrace+0x0/0xe4) from [<803ab2f0>] (do_IPI+0xcc/0x1a4)

[<803ab2f0>] (do_IPI+0xcc/0x1a4) from [<803b054c>] (__irq_svc+0x4c/0xe4)

Exception stack(0x80967f78 to 0x80967fc0)

7f60: 00000003 00000001

7f80: 80967fc0 00000000 80966000 803b18d8 80966000 80974bfc 0000406a 413fc090

7fa0: 00000000 00000000 00000001 80967fc0 803b18d8 80568200 60000013 ffffffff

[<803b054c>] (__irq_svc+0x4c/0xe4) from [<80568200>] (debug_smp_processor_id+0x10/0xf0)

[<80568200>] (debug_smp_processor_id+0x10/0xf0) from [<803b18d8>] (cpu_idle+0x2c/0xe4)

[<803b18d8>] (cpu_idle+0x2c/0xe4) from [<80008ba0>] (start_kernel+0x4e8/0x668)

[<80008ba0>] (start_kernel+0x4e8/0x668) from [<00008040>] (0x8040)
经过查看linux 下的init部分代码的makefile
ifneq ($(CONFIG_BLK_DEV_INITRD),y)

obj-y += noinitramfs.o

else

obj-$(CONFIG_BLK_DEV_INITRD) += initramfs.o

endif
当CONFIG_BLK_DEV_INITR未定义时,链接noinitramfs.c,
static int __init default_rootfs(void)

{

int err;

err = sys_mkdir("/dev", 0755);

if (err < 0)

goto out;

err = sys_mknod((const char __user *) "/dev/console",

S_IFCHR | S_IRUSR | S_IWUSR,

new_encode_dev(MKDEV(5, 1)));

if (err < 0)

goto out;

err = sys_mkdir("/root", 0700);

if (err < 0)

goto out;

return 0;

out:

printk(KERN_WARNING "Failed to create a rootfs\n");

return err;

}

rootfs_initcall(default_rootfs);
即当系统无initrd boot时候,default rootfs 会创建/root 目录,查看mount_root()【init/do_mounts.c】函数代码,发现其需要access /root 目录,所以如果正好你定制的initrdrootfs无root 目录就会出现上面kernal panic issue,如果你正巧有root 目录,那祝贺你boot ok.

通过上面探讨,可以发现initrd作用。
1.>最小rootfs系统,当从含有initrd kernal boot,initrd mount后boot工作由 initrd rootfs 里的init脚本控制;
2.>当 initrd rootfs无init文件时,系统尝试root指示的设备,note:请确保 initrd rootfs有root目录,否则会出现上面的kernal
panic issue;


如果initrd rootfs启动,且需要其停留在initrd rootfs,请将CMDLINE中的root修改为root=/dev/ram
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: