使用Initramfs或yaffs2作为根文件系统启动成功,但是Ramdisk作为根文件系统有问题

使用Initramfs或yaffs2作为根文件系统启动成功,但是Ramdisk作为根文件系统有问题


最近在调一个很郁闷的系统问题:
使用Ramdisk作为根文件系统时,分区结构如图

static struct mtd_partition smdk_default_nand_part[] = {
    [0] = {
        .name    = "U-Boot",
        .size    = 0x60000,
        .offset    = 0,
    },
    [1] = {
        .name    = "Linux Kernel",
        .offset = 0x80000,
        .size    = 0x300000,
    },
    [2] = {
        .name    = "RAMDisk",
        .offset = 0x380000,
        .size    = 0x1000000,
    },
    [3] = {
        .name    = "Yaffs",
        .offset = 0x1380000,
        .size    = 0x08000000-0x1380000, //0x6C80000
    }
};

uboot启动参数:
#define CONFIG_BOOTARGS    "initrd=0x31000000,0x1000000 root=/dev/ram rw init=/linuxrc console=ttySAC0 mem=64M"  //ramdisk
#define CONFIG_BOOTCOMMAND    "nboot 30008000 0 80000;bootm 30008000"

使用
mkimage -n 'Kernel' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d linux-2.6.33.3/arch/arm/boot/zImage /var/lib/tftpboot/uImage
mkimage -n 'Ramdisk' -A arm -O linux -T ramdisk -C gzip -a 0x31000000 -e 0x31000040 -d initrd.gz ramdisk2.gz
做的image

结果只有第一次执行
tftp 0x31000000 initrd.gz
nand erase 0x380000 0x1000000
nand write 0x31000000 0x380000 0x520000
后可以正常启动,重启后就提示找不到Ramdisk了。
若把boot command设成
setenv bootcmd "nboot 30008000 0 80000; nand read 0x31000000 0x380000 0x520000; bootm 30008000 0x31000000"
则一次也不能启动成功。
刚开始怀疑是yaffs2的问题,把yaffs2给取消了,也不mount了,问题依旧。

但是若把rootfs放在yaffs2里,参数设为
setenv bootargs noinitrd root=/dev/mtdblock3 rootfstype=yaffs2 rw console=ttySAC0,115200 init=/linuxrc mem=64M
setenv bootcmd "nboot 30008000 0 80000;bootm 30008000"
则一切正常,但是因为会留下Flash写操作频繁的隐患。


开动FF上网,没有找到问题的解决方法,倒是找到了initramfs的制作方法。既然initramfs比ramdisk更潮,何不试试?
于是把uboot的参数设为
setenv bootargs root=/dev/ram rw init=/init console=ttySAC0 mem=64M
setenv bootcmd "nboot 30008000 0 80000;bootm 30008000"

分区表改为
static struct mtd_partition smdk_default_nand_part[] = {
    [0] = {
        .name    = "U-Boot",
        .size    = 0x60000,
        .offset    = 0,
    },
    [1] = {
        .name    = "Linux Kernel",
        .offset = 0x80000,
        .size    = 0x1300000,
    },
    [2] = {
        .name    = "Yaffs",
        .offset = 0x1380000,
        .size    = 0x08000000-0x1380000, //0x6C80000
    }
};
重新做了个将近11M的内核,
tftp 0x30008000 uImage
nand erase 0x80000 0xC00000
nand write 0x30008000 0x80000 0xB20000

重启一切正常。看来tmpfs还是很有优势的,至少问题没有Ramdisk那么多,那么繁琐,制作系统也灰常简单。



问题是:Ramdisk作为rootfs时,为什么重启后内核找不到rootfs呢? 还是没搞懂。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值