一.背景

文件系统安装在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. Microsoft Web Application Stress Tool 使用

    为了测试数据的准备性,首先需要删除缓存和Cookies等临时文件.启动IE后打开“工具”菜单下的“Internet”选项命令,在打开的“Internet选项”窗口的“常规”选项卡中,单击“Intern ...

  2. [WIFI] WIFI 破解(初级)

    话不多说,先来看看字典破解 wpa2 的效果 =================================== ========================================= ...

  3. 【Android】Android 发送短信和打电话的方法

    发送短信的方法 有两种方法可以实现发送短信,其一是使用intent-startActivity,URI数据格式为"smsto:num",调用的action为Intent.ACTIO ...

  4. JavaScript获取地址栏的参数!

    第一种方式:手动解析 “location”对象 console.log(window.location); 使用这个对象做跳转: window.location.href=""; ...

  5. 【JavaScript算法】---快速排序法

    一.快速排序法概念 我们将一个杂乱无章的数组进行一个快速排序,可以先从一个数组中取一个中间值,将一个数组一分为2,左边的数组跟中间值进行比较,小的放在左边,大的放在右边.比较完毕后再次取中间值,再次比 ...

  6. java 标识符与变量

    一.Java 标识符三要素 1.标识符由字母.下划线(_).美元符号($)或者字母组成. 2.标识符应以字母.下划线(_).美元符开头. 3.标识符字符大小写敏感,长度无限制. 标识符最重要的就是 见 ...

  7. django-mvc

    而对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序.服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理.应用程序则负责具体的逻辑处 ...

  8. Python高级编程技巧(转)

    译文:http://blog.jobbole.com/61171/ 本文展示一些高级的Python设计结构和它们的使用方法.在日常工作中,你可以根据需要选择合适的数据结构,例如对快速查找性的要求.对数 ...

  9. SQL Server简洁查询正在运行SQL(等待事件)

    通常我们可以使用 sp_who2 我们希望更加简洁的信息,下面这个查询使用系统表sys.sysprocesses,以及sys.dm_exec_sql_text做OUTER APPLY. T-SQL是这 ...

  10. ArcEngine和GDAL读写栅格数据机制对比(一)

    最近应用AE开发插值和栅格转等值线的程序,涉及到栅格读写的有关内容.联想到ArcGIS利用了GDAL的某些东西,从AE的OMD中也发现RasterDataset和RasterBand这些命名和GDAL ...