解决grub引导错误的一次经历我的电脑上一共是两块硬盘,1块固态硬盘(sda)装了Win7,另外一块普通硬盘(sdb)装了Ubuntu和centos两个系统,系统启动的引导是装在sdb上面的ubuntu的grub2,它负责选择不同的操作系统来启动,OK,背景交代完了,接下来开始讲述我们出现的问题。
昨天晚上给sdb新添加了一个分区,如下:
1 Disk /dev/sdb: 500.1 GB, 500107862016 bytes 2 255 heads, 63 sectors/track, 60801 cylinders, total 976773168 sectors 3 Units = sectors of 1 * 512 = 512 bytes 4 Sector size (logical/physical): 512 bytes / 4096 bytes 5 I/O size (minimum/optimal): 4096 bytes / 4096 bytes 6 Disk identifier: 0xa887a887 7 8 Device Boot Start End Blocks Id System 9 /dev/sdb1 2048 125829119 62913536 83 linux10 /dev/sdb2 125829246 970502711 422336733 f W95 Ext'd (LBA)11 Partition 2 does not start on physical sector boundary.12 /dev/sdb5 125829248 221983352 48077052+ 7 HPFS/NTFS/exFAT13 /dev/sdb6 221983424 228274807 3145692 b W95 FAT3214 /dev/sdb7 228274872 518603944 145164536+ 7 HPFS/NTFS/exFAT15 /dev/sdb8 518604008 782021941 131708967 7 HPFS/NTFS/exFAT16 /dev/sdb9 782024704 918054911 68015104 83 Linux17 /dev/sdb10 918056960 934834175 8388608 83 Linux18 /dev/sdb11 934836224 951613439 8388608 83 Linux19 /dev/sdb12 951615488 960004095 4194304 82 Linux swap / Solaris20 /dev/sdb13 960004159 970502711 5249276+ 83 Linux21 Partition 13 does not start on physical sector boundary.
其中那个13行的sdb6就是我新添加的分区,由于这个分区是在磁盘中间添加的所以就导致后面的分区号全部变了(比如centos的根目录原来装在sdb8,现在变成了sdb9了),我的ubuntu的根目录是装在sdb1中,由于它的分区号还没有改变,所以ubuntu系统还能正常启动,而centos系统就启动不了了!
启动不了我就得去排除错误啊,刚开始我就想着是引导的问题,于是我在ubuntu下面调用了update-grub命令,来更新一下grub2的启动条目,更新的结果是这样的:
Generating grub configuration file ...Found background image: ubuntu_kylin_grub_bg.tgaFound linux image: /boot/vmlinuz-3.13.0-46-genericFound initrd image: /boot/initrd.img-3.13.0-46-genericFound linux image: /boot/vmlinuz-3.13.0-32-genericFound initrd image: /boot/initrd.img-3.13.0-32-genericFound memtest86+ image: /boot/memtest86+.elfFound memtest86+ image: /boot/memtest86+.binFound Windows 7 (loader) on /dev/sda1Found CentOS release 6.6 (Final) on /dev/sdb9done
从上面可以看到,三个操作系统都找到了,现在应该能正常启动了吧,我重启试了试,centos启动还是失败。。。。
后来我有在想,我的centos系统的home目录和var目录是单独的分区,是不是它启动的时候自动挂载出问题了,于是我又去修改centos的/etc/fstab文件,原来我是用分区号来标识分区的(比如/dev/sdb9之类的),这里我就全部改成了用UUID来标识分区。这里还学到了一个小技巧,原来分区的UUID号码都保存在/dev/disk/by-uuid/这个目录下面,都保存的是软链接,ll一下就可以看到它指向哪块硬盘了,如下:
我改了fstab之后,再来重启系统,发现还是不行。这我就非常郁闷了,一直在想问题出在哪里?后来我又看了一下grub2的配置文件(grub.cfg),终于发现问题还是在那个启动命令上面,如下所示:
1 menuentry 'CentOS release 6.6 (Final) (on /dev/sdb9)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osPRober-gnulinux-simple-d24c3228-5ffc-4937-8411-a69681c3b54e' { 2 insmod part_msdos 3 insmod ext2 4 set root='hd1,msdos9' 5 if [ x$feature_platform_search_hint = xy ]; then 6 search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos9 --hint-efi=hd1,msdos9 --hint-baremetal=ahci1,msdos9 d24c3228-5ffc-4937-8411-a69681c3b54e 7 else 8 search --no-floppy --fs-uuid --set=root d24c3228-5ffc-4937-8411-a69681c3b54e fi 9 linux /boot/vmlinuz-2.6.32-504.12.2.el6.i686 ro root=/dev/sdb8 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=128M KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet vga=79110 initrd /boot/initramfs-2.6.32-504.12.2.el6.i686.img11 }
这是grub.cfg文件中关于centos启动的部分,在第九行linux命令中,它选择好了内核以只读命令来挂载根文件系统的时候,选择的分区是sdb8,而此时sdb8已经变成了windows的ntfs分区,所以此时我的系统启动的时候,就会提示一大串的无法识别文件系统类型(ntfs),只要把这里改成sdb9,我的系统就能正常启动了!
^ o ^
启动之后,我还没高兴多久呢,发现在ubuntu下面运行一遍update-grub命令,那么grub.cfg文件又被覆盖了。。没办法,还得继续分析!
经过分析之后,发现centos的那个启动条目是由/etc/grub.d/30_os-prober这个配置文件产生的,而在这个文件中,linux-boot-prober命令最终生成了grub.cfg文件中的第9行中root命令后面跟着的分区名!而这个linux-boot-prober命令就是查找给定的分区名中的类似于"menu.lst"的配置文件,结果我最终发现,问题还是出在centos系统的配置文件上,如下所示:
1 title CentOS (2.6.32-504.12.2.el6.i686)2 root (hd0,9)3 kernel /boot/vmlinuz-2.6.32-504.12.2.el6.i686 ro root=/dev/sdb8 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=128M KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet vga=7914 initrd /boot/initramfs-2.6.32-504.12.2.el6.i686.img
我原来只改了第2行的root命令选择的分区,而没有改第三行中root命令选择的分区,这样我的系统还是启动不了。。
OK,把centos的配置文件一改,问题总算都是解决了!^ . ^