linux kernel 提示VFS: Cannot open root device "mmcblk0p1" or unknown-block(179,1): error -19等信息后發生panic


一.背景

文件系統安裝在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的配置項重新編譯內核即可

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM