关于arm linux initrd boot 探讨

    关于 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





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值