一.背景

文件系统安装在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. Android反编译技术总结

    一.Apk反编译工具及其使用方法 1.原理 学习反编译之前,建议先学习一下Apk打包的过程,明白打包完成后的Apk里面都有什么文件,各种文件都是怎么生成的. 这里有两篇AndroidWeekly中推荐 ...

  2. ELK基础学习

    第壹部分:Elasticsearch 一 .Elasticsearch增删改查1.数据写入:HTTP method:POSTURL:http://127.0.0.1:9200/index-docs-n ...

  3. SPF难以解决邮件伪造的现状以及方案

    邮件伪造的现状 仿冒域名 私搭邮服仿冒域名: 例如某公司企业的域名是example.com,那么攻击者可以搭建一个邮服,也把自己的域名配置为example.com,然后发邮件给真实的企业员工xxx@e ...

  4. SpringMVC XXX-servlet.xml ApplicationContext.xml

    因为直接使用了SpringMVC,所以之前一直不明白xxx-servlet.xml和applicationContext.xml是如何区别的,其实如果直接使用SpringMVC是可以不添加applic ...

  5. 阿里云搭建SVN服务器

    1:安装svn apt-get install subversion 2. 开启svn服务器 svnserve -d 检查是否开启:ps aux | grep svnserve 若出现如下内容: wk ...

  6. 公民身份号码校验码算法(C#版)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  7. Redis讲解

    buffer  缓冲  用于写 cache  缓存  用于读 redis 支持持久化 安装redis yum -y install redis 配置文件/etc/redis.conf 是否在后台运行 ...

  8. You don't have permission to access

    局域网内配置Discuz,web端访问server端,出现以下反馈: Forbidden You don't have permission to access / on this server. 网 ...

  9. Linux下使用iotop检测磁盘io使用情况

    介绍 Linux下的IO统计工具如iostat, nmon等大多数是只能统计到per设备的读写情况, 如果你想知道每个进程是如何使用IO的就比较麻烦. iotop 是一个用来监视磁盘 I/O 使用状况 ...

  10. tomcat设置编码格式utf8

    利用request.setCharacterEncoding("UTF-8");来设置Tomcat接收请求的编码格式,只对POST方式提交的数据有效,对GET方式提交的数据无效! ...