什么是GRUB
GNU GRUB(GRand Unified Bootloader简称“GRUB”)是一个来自GNU项目的多操作系统引导启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。
当/etc/grub2/中的grub.cfg文件丢失或损坏后,开机后因文件丢失则无法正确引导启动操作系统。那么在这种情况下,依然可以通过GRUB来手动引导启动操作系统。以下将在虚拟机中RHEL7.0的环境中来模式实现。
GURB的引导过程
查看 /boot/grub2/grub.cfg 可以看到GRUB中,在选中菜单后是如何启动系统的,如下:
### BEGIN /etc/grub.d/10_linux ###
menuentry 'Red Hat Enterprise Linux Server, with Linux 3.10.0-123.el7.x86_64' --class red --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-123.el7.x86_64-advanced-e9bd41c7-f4e9-46e7-951b-677850232bcc' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_msdos
insmod xfs
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' ee0abc65-4eeb-4e20-92b0-1c04a8e8691d
else
search --no-floppy --fs-uuid --set=root ee0abc65-4eeb-4e20-92b0-1c04a8e8691d
fi
linux16 /vmlinuz-3.10.0-123.el7.x86_64 root=UUID=e9bd41c7-f4e9-46e7-951b-677850232bcc rord.lvm.lv=rhel/root crashkernel=auto rd.lvm.lv=rhel/swap vconsole.font=latarcyrheb-sun16 vconsole.keymap=us rhgb quiet LANG=en_US.UTF-8
initrd16 /initramfs-3.10.0-123.el7.x86_64.img
}
以上可以看出,当在GRUB中选中一个系统并回车确定后,可以看到GRUB做了以下4个主要步骤:
1.给root先赋予一个初始值;
2.挂载内核,并再次对root赋值为真实的根分区;
3.加载驱动;
4.boot引导;
准备工作
1.首先需要明白我们的根目录的文件系统是哪里?
通过 df 命令可以查询到
[root@localhost Desktop]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 18G 3.0G 15G 17% /
devtmpfs 905M 0 905M 0% /dev
tmpfs 914M 84K 914M 1% /dev/shm
tmpfs 914M 8.9M 905M 1% /run
tmpfs 914M 0 914M 0% /sys/fs/cgroup
/dev/sda1 497M 119M 379M 24% /boot
/dev/sr0 3.5G 3.5G 0 100% /media
[root@localhost Desktop]#
可以看到我的/dev/mapper/rhel-root 是根目录的位置。
2.gurb.cfg中root的初始值
在grub.cfg中看到 set root='hd0,msdos1'
然后删除/boot/grub2/下面的grub.cfg文件,然后重启。
[root@localhost Desktop]# rm -rf /boot/grub2/grub.cfg
[root@localhost Desktop]# reboot
手动引导
重启之后进入到GRUB的命令提示符,按照以上GRUB的启动步骤,直接输入以下命令:
grub>set root=(hd0,msdos1)
grub>linux16 /vmlinuz-3.10.0-123.el7.x86_64 root=/dev/mapper/rhel-root ro
grub>initrd16 /initramfs-3.10.0-123.el7.x86.64.img
grub>boot
回车确认后,BRUB就开始启动系统了。
在上面过程中,加载的内核和驱动其实都是在/boot/目录中的内核文件和驱动文件,在输入过程中可以通过TAB键补全。
恢复grub.cfg
在进入系统后,我们要恢复之前删除的grub.cfg文件
[root@localhost Desktop]# grub2-mkconfig > /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-123.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-123.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-e6b7fcb586e64947b1e83544a55a7115
Found initrd image: /boot/initramfs-0-rescue-e6b7fcb586e64947b1e83544a55a7115.img
done
[root@localhost Desktop]#
--------------------------------------
以上环境是VMware中的RHEL7.0操作系统。
安装双系统的朋友也可以通过grub来手动引导到你想要的系统。
本人电脑安装的是windows7 和 RHEL7.0两个系统,手动引导windows7的时候则是一下方式:
grub>set root=(hd0,msdos1)
grub>chainloader +1
grub>boot
对于给root赋予初始值的步骤,可以通过ls命令查看:
grub>ls
(hd0)(hd0,msdos2)(hd0,msdos1)(fd0)
也有朋友提到可以不用赋予初始值,本人测试在不用赋予初始值的情况下,RHEL7也正常引导。但是Windows7则不行。