|
新买了一台电脑,主要配置是i5-2500K,8G内存,1TB硬盘。
看了网上的介绍和例子,将整个硬盘作为一个vg,使用grub-1.99,目前暂用genkernel,安装成功。
分区结构比较简单:
/dev/sda 物理硬盘
/dev/sda1 物理分区
/dev/vg0 将/dev/sda1作为lvm卷组(vg0)
/dev/vg0/root lvm逻辑卷(root),系统盘,100G,mount到“/”,/boot也在里面。
/dev/vg0/data lvm逻辑卷(data),数据盘,100G,剩余空间以后慢慢分。
创建vg和lv不再详述了。
genkernel按照说明注意要加--lvm参数。
gentoo缺省安装grub-0.97,修改/portage/package.keywords以安装grub-1.99-rc2,grub-1.99还依赖os-prober:
# We need Grub2
<=sys-boot/os-prober-1.47 **
<sys-boot/grub-3.00 **
grub-1.99就是grub2了,grub2的配置方法和grub不同,用两条命令进行配置:
grub2-mkconfig 这条命令会自动识别/boot下的kernel image和initrd image,生成相应的启动项
我的/boot里只有一套kernel和initrd,所以生成了2个启动项,一个是正常启动,另一个是安全模式
grub2-install --no-floppy /dev/sda 安装grub到mbr
这一套搞定后,启动失败。进行定位:
1. grub菜单成功显示了
2. 已经显示了initrd的启动信息(加载驱动的信息)
3. 最后的提示是找不到root分区。
4. 按照选项进入initrd的shell,我的内核参数是root=/dev/mapper/vg0-root,查看/dev目录,没有这个设备文件
5. 在shell中执行initrd提供的lvm vgchange -ay命令,设备文件就出现了
按启动流程,grub2已经找到了lvm分区,加载了kernel和initrd,完成了任务
initrd应负责加载lv,再让内核切换过去,问题现象说明initrd加载lv失败,initrd没配好
找了半天,最后解开initrd走读其中的脚本:
1. 脚本/etc/init.script中,存在:
if [ "${USE_LVM_NORMAL}" = '1' ]
then
...
2. 找给这个变量赋值的地方,是在/init脚本中:
CMDLINE='cat /proc/cmdline'
...
for x in ${CMDLINE}
do
case "${x}" in
...
# Start Volume manager options
dolvm)
USE_LVM_NORMAL=1
dolvm2)
bad_msg 'Using dolvm2 is deprecated, use dolvm ..."
USE_LVM_NORMAL=1
...
3. initrd的/proc/cmdline就是内核参数,看样子是因为少设了dolvm这个内核参数所以导致initrd.scripts脚本没有执行lvm初始化操作
4. 试验手工修改grub2-mkconfig自动生成的/boot/grub/grub.cfg,(该文件的注释要求禁止修改),启动成功。
最后总结和几个没想明白的地方:
1. 能够做全硬盘lvm完全得益于grub2对lvm分区的支持。
2. 完成后我去/usr/src/linux/Documentation/kernel-parameters.txt中查找dolvm,没找到,难道dolvm只是给initrd用的?
3. 后来我再google,网上已经有对dolvm参数的说明:http://www.gentoo-wiki.info/HOWT ... LVM2_root_partition
也就是说dolvm是gentoo专用的内核参数?那为什么不在执行genkernel --lvm生成initrd时就直接把USE_LVM_NORMAL设为1? |
|