重装了下系统,用上了LVM

LVM:

  • 物理卷PV
  • 卷组VG:将物理卷划分为可分配的逻辑块
  • 逻辑卷LV:多个逻辑块组成固定大小

流程:多个磁盘/分区/raid-->多个物理卷PV-->合成卷组VG-->从VG划分出逻辑卷LV-->格式化LV,挂载使用。

参考:

VFS: Cannot open root device 解决思路

理论

VFS: Cannot open root device \"%s\"(A) or %s(B): error %d(C)\n"
Please append a correct \"root=\" boot option; here are the available partitions:\n
VFS: Unable to mount root fs on %s(D)
以上是 init/do_mounts.c 文件中的 函数mount_block_root 做的打印

表示  利用所有的文件系统 调用 do_mount_root  对 一个分区(通过是您指定的) 进行了挂载,但是还是挂载失败
上面的信息就是打印出来的帮助您定位错误的信息

内核会针对不同的情况对 A B C D 进行填充
A : 如果您指定的是 root=/dev/hda2 ,那么 A 为 "/dev/" 后面的 hda2
	如果您指定的是 root=/xxx/hda2(前五个字节不为"/dev/") ,那么 A 为 /xxx/hda2
B : 根据您指定的 root=/dev/hda2 , 根据ROOT_DEV = name_to_dev_t(root_device_name); 算出来的设备号,从而算出来的主次设备号,格式 为 unknown-block(主设备号,次设备号)
C : do_mount_root 的返回值,返回值的定义在 内核代码中的 include/uapi/asm-generic/errno-base.h
D : 和B一样

实例

  • 1
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:

-------------------------------------------------------------+++

A为 mmcblk0p1
B为 unknown-block(179,1)
C为 19

A的格式是对的,mmc设备的分区名请参考 Documentation/block/cmdline-partition.txt
B表示 已经找到了mmc设备的驱动, 因为主次设备已经出来了,且是对的. 请参考 Documentation/devices.txt
C为19 表示 #define ENODEV      19  /* No such device */ 


这个问题的结论是
	1.有驱动
	2.可查磁盘名级分区名是否正确
	3.可查对应的文件系统

  • 2
VFS: Cannot open root device "mtdblock5" or unknown-block(0,0): error -6

-------------------------------------------------------------+++

A为 mtdblock5
B为 unknown-block(0,0)
C为 -6

A的格式是对的
B 0 = reserved as null device number ,表示没找到该设分区的设备号,驱动可能有问题
C -6 #define ENXIO        6  /* No such device or address */


这个问题的结论是
	1.查驱动是否存在
	2.可查磁盘名级分区名是否正确
	3.可查对应的文件系统

  • 3
VFS: Cannot open root device "nfs" or unknown-block(0,255)
-------------------------------------------------------------+++
内核中nfs设置不对

  • 4
No filesystem could mount root, tried:  ext3 ext2 cramfs vfat msdos iso9660 romfs  
kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,3)
------------------------+++
磁盘分区被格式化为xxx文件系统,内核镜像无该xxx文件系统的支持
  • 5
一般挂载不上的话,会有打印 here are the available partitions:
然后在下面打印如下

Please append a correct "root=" boot option; here are the available partitions:
0300	16777216	hda 	driver:	ide-disk
	0301 	499873		hda1
	0302	16277152 	hda2
1600	4194302 hdc 	driver: ide-cdrom
0800 	2097152 sda 	driver: sd
	0801	2096451	sda1
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)

--------------+++
以下为注释
0300(十六进制数)	16777216(有多少个磁盘扇区)	hda(磁盘名) 	driver(所用的驱动):	ide-disk
	0301(十六进制数) 	499873(有多少个扇区)		hda1(分区名)
	0302	16277152 	hda2
1600	4194302 hdc 	driver: ide-cdrom
0800 	2097152 sda 	driver: sd
	0801	2096451	sda1
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)

init=xxx 中 xxx 的格式

name_to_dev_t 函数的注释

1. 十六进制数
	0x302 302 0X302
		//3为主设备号,2为此设备号
		//0xaaabb
		//aaa代表主设备号
		//bb代表设备号码
2.带冒号的数对
	3:2 
		// 只能是%u:无符号十进制整数
		// 3 为主设备号
		// 2 为此设备号
3. /dev/nfs
	// setenv bootargs 'noinitrd mem=64M console=ttySAC0 root=/dev/nfs nfsroot=192.168.0.3:/nfs ip=192.168.0.5'

4. 不以数字结尾的字符串且代表磁盘
	/dev/sda : 代表第1个硬盘
	
5. 	以数字结尾的字符串且代表分区
	/dev/sda1 : 代表第1个硬盘的第1个分区

6.  已数字结尾的字符串且代表磁盘
	/dev/mmcblk0:代表第1个mmc设备
7.  如果磁盘名以数字结尾,则分区名需要加p : /dev/<disk_name>p<decimal>
	/dev/mmcblk0p1
6.	PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF

如果不为这几种,则返回 return (0,0).