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的配置项重新编译内核即可
linux kernel 提示VFS: Cannot open root device "mmcblk0p1" or unknown-block(179,1): error -19等信息后发生panic的更多相关文章
- 嵌入式 VFS: Cannot open root device "mtdblock2" or unknown-block(2,0)
系统启动后,虽然nand驱动表现正常,但是最后挂载rootfs时候出错: Kernel command line: root=/dev/mtdblock2 rw init=/linuxrc conso ...
- 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 ...
- VFS: Cannot open root device "nfs" or unknown-block(0,255)错误的解决
1. 解决办法:在内核配置时候文件系统中选中Root file system on NFS
- Linux Kernel - Debug Guide (Linux内核调试指南 )
http://blog.csdn.net/blizmax6/article/details/6747601 linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级 ...
- 用Qemu模拟vexpress-a9 (一) --- 搭建Linux kernel调试环境【转】
转自:http://www.cnblogs.com/pengdonglin137/p/5023342.html#_label2 阅读目录(Content) 环境介绍: 下载Linux内核 安装arm的 ...
- 用Qemu模拟vexpress-a9 (一) --- 搭建Linux kernel调试环境
参考: http://blog.csdn.net/linyt/article/details/42504975 环境介绍: Win7 64 + Vmware 11 + ubuntu14.04 32 u ...
- How to: Compile Linux kernel 2.6
Compiling custom kernel has its own advantages and disadvantages. However, new Linux user / admin ...
- Linux Kernel 'sctp_v6_xmit()'函数信息泄露漏洞(CVE-2013-4350)
漏洞版本: Linux kernel 漏洞描述: BUGTRAQ ID: 62405 CVE(CAN) ID: CVE-2013-4350 Linux Kernel是Linux操作系统的内核. Lin ...
- 如何进行Linux Kernel 开发
转自:http://www.cppblog.com/flyonok/archive/2011/04/15/144316.html 如何进行Linux Kernel 开发? (Take 3) 译者序:这 ...
随机推荐
- url-loader与file-loader
一开始用url-loader的时候,想着为什么npm run build的时候,不能将图片打包到build images的目录下,原来,没有自己看这样的说明: loader 后面 limit 字段代表 ...
- 页面链接跳转历史URL不记录的兼容处理
1.阻止跳转a标签的链接 2.location.replace(href) 不生成新的历史记录, 但有bug 3.首先通过HTML5 history.replaceState()方法把当前URL地址替 ...
- log4net类库配置、WebService配置
一.类库配置 结构如下图 1.LogUtility类 public class LogUtility { private static readonly log4net.ILog log = log4 ...
- OneThink视图模型进行组合查询!文档组合文档详情
测试方法:twoCate: public function twoCate(){ $where = array( 'category_id'=>43 ); $list = D('TwoView' ...
- poj1463 Strategic game【树形DP】
Strategic game Time Limit: 2000MS Memory Limit: 10000K Total Submissions: 9582 Accepted: 4516 De ...
- 焦作网络赛B-Mathematical Curse【dp】
A prince of the Science Continent was imprisoned in a castle because of his contempt for mathematics ...
- linux加载硬盘过程
查看系统可用磁盘大小: [root@i-mbyar7df ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 ...
- scrapy爬虫系列之一--scrapy的基本用法
功能点:scrapy基本使用 爬取网站:传智播客老师 完整代码:https://files.cnblogs.com/files/bookwed/first.zip 主要代码: ff.py # -*- ...
- python设置redis过期时间
import time import redis if __name__ == "__main__": try: conn=redis.StrictRedis(host='192. ...
- 小米范工具系列之五:小米范WEB口令扫描器
最新版本1.2,下载地址:http://pan.baidu.com/s/1c1NDSVe 文件名 webcracker,请使用java1.8运行 小米范WEB口令扫描器的主要功能是批量扫描web口令 ...