一.背景

文件系统安装在sd卡的第一个分区中,使用的是ext4文件系统,linux内核版本为4.14

二.思考

在内核启动之前,uboot给内核传递了参数root=/dev/mmcblk0p1,但是为何还会出现:

VFS: Cannot open root device "mmcblk0p1" or unknown-block(179,1): error -19

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

三.扒一扒内核代码

init/do_mouts.c

void __init mount_block_root(char *name, int flags)

{

...  retry:

  for (p = fs_names; *p; p += strlen(p)+1) {
  int err = do_mount_root(name, p, flags, root_mount_data);
  switch (err) {
    case 0:
      goto out;
    case -EACCES:
     case -EINVAL:
    continue;
  }
  /*
   * Allow the user to distinguish between failed sys_open
  * and bad superblock on root device.
   * and give them a list of the available devices
  */
  #ifdef CONFIG_BLOCK
  __bdevname(ROOT_DEV, b);
  #endif
   printk("VFS: Cannot open root device \"%s\" or %s: error %d\n",
   root_device_name, b, err);  此处的打印信息被输出
   printk("Please append a correct \"root=\" boot option; here are the available partitions:\n");此处的打印信息被输出
  
  printk_all_partitions();
  #ifdef CONFIG_DEBUG_BLOCK_EXT_DEVT
   printk("DEBUG_BLOCK_EXT_DEVT is enabled, you need to specify "
  "explicit textual name for \"root=\" boot option.\n");
  #endif
  panic("VFS: Unable to mount root fs on %s", b);  发生panic的地方在这里

...

}

static int __init do_mount_root(char *name, char *fs, int flags, void *data)

{

  struct super_block *s;
   int err = sys_mount(name, "/root", fs, flags, data);  此处返回的err是我们需要关心的,这里的err=-19,那么为何会等于-19呢?
  if (err)
  return err;
  
  sys_chdir("/root");
  s = current->fs->pwd.dentry->d_sb;
  ROOT_DEV = s->s_dev;
  printk(KERN_INFO
  "VFS: Mounted root (%s filesystem)%s on device %u:%u.\n",
   s->s_type->name,
  sb_rdonly(s) ? " readonly" : "",
  MAJOR(ROOT_DEV), MINOR(ROOT_DEV));
  return 0;

}

再分析sys_mount

fs/namespace.c

SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,char __user *, type, unsigned long, flags, void __user *, data)

{

...  

  ret = do_mount(kernel_dev, dir_name, kernel_type, flags, options);

...

}

long do_mount(const char *dev_name, const char __user *dir_name,const char *type_page, unsigned long flags, void *data_page)

{

...

retval = do_new_mount(&path, type_page, sb_flags, mnt_flags,dev_name, data_page);

...

}

/* * create a new mount for userspace and request it to be added into the

 * namespace's tree

*/

static int do_new_mount(struct path *path, const char *fstype, int sb_flags,

int mnt_flags, const char *name, void *data)

{

...

  type = get_fs_type(fstype);
  if (!type)
  return -ENODEV;

...

}

-ENODEV=-19

从最后的get_fs_type可以得知:当前不支持某种文件系统,进而type等于非0,因此就会返回-19这个值

四.解决

当前sd卡上的第一个分区装入的文件系统为ext4,然而内核此时并不支持此文件系统,因此加入CONFIG_EXT4_FS的配置项重新编译内核即可

linux kernel 提示VFS: Cannot open root device "mmcblk0p1" or unknown-block(179,1): error -19等信息后发生panic的更多相关文章

  1. 嵌入式 VFS: Cannot open root device "mtdblock2" or unknown-block(2,0)

    系统启动后,虽然nand驱动表现正常,但是最后挂载rootfs时候出错: Kernel command line: root=/dev/mtdblock2 rw init=/linuxrc conso ...

  2. linux内核挂载根文件系统时报错”VFS: Cannot open root device "ram0" or unknown-block(0,0): error -6“如何处理?

    1. 通过error -6得到: #define ENXIO            6      /* No such device or address */ 2. 解决办法 使能CONFIG_BL ...

  3. VFS: Cannot open root device "nfs" or unknown-block(0,255)错误的解决

    1. 解决办法:在内核配置时候文件系统中选中Root file system on NFS

  4. Linux Kernel - Debug Guide (Linux内核调试指南 )

    http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级 ...

  5. 用Qemu模拟vexpress-a9 (一) --- 搭建Linux kernel调试环境【转】

    转自:http://www.cnblogs.com/pengdonglin137/p/5023342.html#_label2 阅读目录(Content) 环境介绍: 下载Linux内核 安装arm的 ...

  6. 用Qemu模拟vexpress-a9 (一) --- 搭建Linux kernel调试环境

    参考: http://blog.csdn.net/linyt/article/details/42504975 环境介绍: Win7 64 + Vmware 11 + ubuntu14.04 32 u ...

  7. How to: Compile Linux kernel 2.6

      Compiling custom kernel has its own advantages and disadvantages. However, new Linux user / admin ...

  8. Linux Kernel 'sctp_v6_xmit()'函数信息泄露漏洞(CVE-2013-4350)

    漏洞版本: Linux kernel 漏洞描述: BUGTRAQ ID: 62405 CVE(CAN) ID: CVE-2013-4350 Linux Kernel是Linux操作系统的内核. Lin ...

  9. 如何进行Linux Kernel 开发

    转自:http://www.cppblog.com/flyonok/archive/2011/04/15/144316.html 如何进行Linux Kernel 开发? (Take 3) 译者序:这 ...

随机推荐

  1. JavaBean与Map<String,Object>相互转换

    一.为什么要实现javaBean与Map<String,Object>相互转换 Spring中的BaseCommandController对象可以将传递过来的参数封装到一个JavaBean ...

  2. 2012Noip提高组Day1 T3 开车旅行

    题目描述 小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的 城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为 Hi,城市 ...

  3. Linux Netfilter注册钩子点

    注册钩子点首先要包含响应的头文件,因为这应该已经属于对kernel的编程了. #include <linux/module.h> #include <linux/kernel.h&g ...

  4. log4j.properties配置详解与实例(转载)

    转自:http://blog.sina.com.cn/s/blog_5ed94d710101go3u.html 最近使用log4j写log时候发现网上的写的都是千篇一律,写的好的嘛不全,写的全一点的嘛 ...

  5. 170710、springboot编程之启动器Starter详解

    此文系参考网络大牛的,如有侵权,请见谅! Spring Boot应用启动器基本的一共有N(现知道的是44)种:具体如下: 1)spring-boot-starter 这是Spring Boot的核心启 ...

  6. LightOj 1422 Halloween Costumes(区间DP)

    B - Halloween Costumes Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit ...

  7. 2017ACM-ICPC沈阳区域赛

    I-Little Boxes[大数] hdu6225  http://acm.hdu.edu.cn/showproblem.php?pid=6225 题意: 就是给四个大数,输出和. 思路: java ...

  8. c# 公共方法

    MyMeans using System; using System.Collections.Generic; using System.Text; using System.Windows.Form ...

  9. Warm up---hdu4612(缩点,树的直径)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612 给一个无向图, 加上一条边后,求桥最少有几个: 那我们加的那条边的两个顶点u,v:一定是u,v之 ...

  10. 13.Github使用

    我们一直用GitHub作为免费的远程仓库,如果是个人的开源项目,放到GitHub上是完全没有问题的.其实GitHub还是一个开源协作社区,通过GitHub,既可以让别人参与你的开源项目,也可以参与别人 ...