ramdisk启动出错说 no cpio magic

wilos 2009-09-22 05:18:22
ramdisk启动时出现错误:

Unpacking initramfs...<0>Kernel panic - not syncing: no cpio magic

发现报错是在initramfs.c的do_header里,
if (memcmp(collected, "070701", 6)) {
error("no cpio magic");
return 1;
}


我的启动参数是

bootargs root=/dev/ram console=ttyS0,115200
...全文
1448 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wilos 2009-09-25
  • 打赏
  • 举报
回复
跟踪发现到了

prepare_namespace()->mount_root()->mount_block_root()

最后发现错误在于get_fs_names始终返回的是空


在get_fs_names函数里,我发现root_fs_name是空,所以走的是

另外一个流程,来获取文件名。

在另外一个流程中,由于一直没有给文件名赋值,从而导致返回的是空文件名。

这个错误是什么原因导致的?

附get_fs_names代码:

static void __init get_fs_names(char *page)
{
char *s = page;

if (root_fs_names) {
printk("root_fs_names is %s\n",root_fs_names); //我加的语句,从没打印过
strcpy(page, root_fs_names);
while (*s++) {
if (s[-1] == ',')
s[-1] = '\0';

}
} else {
int len = get_filesystem_list(page);
char *p, *next;
page[len] = '\0';
for (p = page-1; p; p = next) {
next = strchr(++p, '\n');
printk("test1"); //我加的打印语句,每次都执行
if (*p++ != '\t')
continue;
printk("test2\n"); //我加的打印语句,从未执行到这里 while ((*s++ = *p++) != '\n')
;
s[-1] = '\0';

}
}
*s = '\0';
printk("finally in get_fs_names, s is %s\n",s);
}

wilos 2009-09-24
  • 打赏
  • 举报
回复
rd_load_image应该是成功了

由于配置了CONFIG_BLOCK

出错在

mount_root里的mount_block_root
wilos 2009-09-24
  • 打赏
  • 举报
回复
配上还是出问题了:


RAMDISK: ext2 filesystem found at block 0
RAMDISK: Loading 4096KiB [1 disk] into ram disk... RAMDISK: Loading 4096KiB [1 d
isk] into ram disk... done.
done.
No filesystem could mount root, tried: No filesystem could mount root, tried:

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)
  • 打赏
  • 举报
回复
哦,你很聪明,知道到源码里分析问题,找到单按。我也在此学习了。
wilos 2009-09-23
  • 打赏
  • 举报
回复
基本找到找到原因了,内核里没有配置CONFIG_BLK_DEV_RAM

static int __init populate_rootfs(void)
{
/* 把内核中附带的 cpio 包填充到 rootfs 中去 */
char *err = unpack_to_rootfs(__initramfs_start, __initramfs_end - __initramfs_start, 0);
if (initrd_start) { /* 如果引导时提供了 initrd 文件 */
#ifdef CONFIG_BLK_DEV_RAM /* 内核支持 ramdisk 的情况 */
err = unpack_to_rootfs((char *)initrd_start, initrd_end - initrd_start, 1); /* 检查是否是 cpio 格式的 */
if (!err) {
unpack_to_rootfs((char *)initrd_start, initrd_end - initrd_start, 0); /* 如果是,就把它填充到 rootfs 中去 */
free_initrd(); /* 释放原来存放 initrd 的空间 */
return 0;
}
/* 如果不是 cpio 格式的,就把 initrd 保存到 rootfs 的 /initrd.image 这个文件里 */
fd = sys_open("/initrd.image", O_WRONLY|O_CREAT, 0700);
if (fd >= 0) {
sys_write(fd, (char *)initrd_start, initrd_end - initrd_start);
sys_close(fd);
free_initrd(); /* 释放原来存放 initrd 的空间 */
}
#else
/* 如果内核不支持 ramdisk,就直接以 cpio 包格式的方式处理 */
err = unpack_to_rootfs((char *)initrd_start, initrd_end - initrd_start, 0);
if (err)
panic(err);
free_initrd(); /* 释放原来存放 initrd 的空间 */
#endif
}
return 0;
}
rootfs_initcall(populate_rootfs);

wilos 2009-09-23
  • 打赏
  • 举报
回复
我不是做cpio,我是做的ramdisk啊

内核为什么会认为我的文件系统是cpio
  • 打赏
  • 举报
回复
mkdir initrd 制作的是ramdisk image

要用cpio命令做出来的才是cpio image

Fedora的image格式一般是cpio image
其它的大多数都是ramdisk image。

两个格式是不一样的
ShowMan 2009-09-22
  • 打赏
  • 举报
回复
亲自做cpio格式的根文件系统。。
wilos 2009-09-22
  • 打赏
  • 举报
回复
制作ramdisk的脚本:


mkdir initrd
dd if=/dev/zero of=initrd.img bs=1k count=40960
mke2fs -F -v -m0 initrd.img
mount -o loop initrd.img initrd
cp -av rootfs/* initrd
sync
umount initrd
sync
gzip -f -9 initrd.img
sync
./mkimage -T ramdisk -C gzip -n 'ANCP Ramdisk Image' -d initrd.img.gz your.ramdisk.u-boot

4,468

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧