GRUB应用
GRUB:全称为GNU GRUB,是一个来自GNU项目的启动引导程序。
GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机系统启动时选择希望运行的操作系统。
GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。
GRUB:GRand Unified Bootloader。重要的、标准的启动加载器;
主要用于类Unix系统;Solaris在X86系统上也采用GNU GRUB作为启动器;
GRUB特性:
1、GRUB可动态配置;它在启动时加载配置信息,并允许在启动时修改,如选择不同的内核和initrd。为此目的,GRUB提供了一个简单的类似Bash的命令行界面,它允许用户编写新的启动顺序。
2、GRUB非常轻便。它支持多种可执行格式;它除了可适用于支持多启动的操作系统外,还通过链式启动功能支持诸如Windows和OS/2之类的不支持多启动的操作系统。GRUB支持所有的Unix文件系统,也支持Windows适用的FAT和NTFS文件系统,还支持LBA模式。GRUB允许用户查看它支持的文件系统里文件的内容。
3、GRUB具有多种用户界面。多数Linux发行版利用GRUB对图形界面的支持,提供了定制的带有背景图案的启动菜单,有时也支持鼠标。通过对GRUB的文字界面的设定,可以通过串口实现远程终端启动。
4、GRUB可以从网络上下载操作系统镜像,因此可以支持无盘系统。GRUB支持在启动操作系统前解压它的镜像。
5、与其它启动器不同,GRUB可以通过GRUB提示符直接与用户进行交互。载入操作系统前,在GRUB文本模式屏幕下键入c键可以进入GRUB命令行。在没有作业系统或者有作业系统而没有"menu.lst"文件的系统上,同样可以进入GRUB提示符。通过类似bash的命令,GRUB提示符允许用户手工启动任何操作系统。把合适的命令记录在"menu.lst"文件里,可以自动启动一个操作系统。
6、GRUB拥有丰富的终端命令,在命令行下使用这些命令,用户可以查看硬盘分区的细节,修改分区设置,临时重新映射磁盘顺序,从任何用户定义的配置文件启动,以及查看GRUB所支持的文件系统上的其它启动器的配置。因此,即便不知道一台电脑上安装了什么,也可以从外部设备启动一个操作系统。
7、GRUB采用滚动屏幕选择想要启动的操作系统。通过向"menu.lst"文件中添加相关信息,GRUB可以控制150或者更多的启动选项,在启动时用方向键进行选择。
8、通过链式启动,一个启动器可以启动另一个启动器。GRUB通过2到3行的命令就可以从DOS、Windows、Linux、BSD和Solaris系统启动。
9、尽管GRUB为类Unix系统进行了编译和打包,但也有供DOS和Windows使用的GRUB。GRUB也可以不附带任何操作系统而作为孤立系统安装。从CD上启动时运用GRUB需要1个文件,而从软盘、硬盘和USB设备上启动时需要2个文件。这些文件可以在任何支持GRUB的Linux CD上找到,用户可以很容易的找到它们。
GRUB是Bootloader程序中的一种,位于硬盘0磁道0扇区MBR记录中的前446字节中;
GRUB的版本:
GRUB 第一版本:
GRUB的步骤1包含在MBR中。由于受MBR的大小限制,步骤一所做的几乎只是装载GRUB的下一步骤(存放在硬盘的其它位置)。步骤1既可以直接装载步骤2,也可以装载步骤1.5:GRUB的步骤1.5包含在MBR后面的30千字节中。步骤1.5载入步骤2。
当步骤2启动后,它将呈现一个界面来让用户选择启动的操作系统。这步通常采用的是图形菜单的形式,如果图形方式不可用或者用户需要更高级的控制,可以使用GRUB的命令行提示,通过它,用户可以手工指定启动参数。GRUB还可以设置超时后自动从某一个内核启动。
GRUB第二版本:
一、特性:
GRUB2和grub有很多不同的地方:
1、图形接口;
2、使用了模块机制,通过动态加载需要的模块来扩展功能;
3、支持脚本语言,例如条件判断、循环、变量和函数;
4、支持rescue模式,可用于系统无法引导的情况;
5、国际化语言。包括支持非ASCII码的字符集和类似gettext的消息分类,字体,图形控制台等等;
6、有一个灵活的命令行接口。如果没有配置文件存在,GRUB会自动进入命令模式;
7、针对文件系统、文件、设备、驱动、终端、命令、分区表、OS loader的模块化、层次化、基于对象的框架;
8、支持多种文件系统格式;
9、可访问已经安装的设备上的数据;
10、支持自动解压;
二、设备的命名:
grub2同样以fd表示软盘,hd表示硬盘(包含IDE和SCSI)。设备是从0开始编号,分区则是从1开始,主分区从1-4,逻辑分区从5开始,而grub分区编号是从0开始的;
例如:
(fd0):表示整个软盘;
(hd0,1):表示BIOS中的第一个硬盘的第1个分区;
(hd0,5)/boot/vmlinuz:表示BIOS中的第一个硬盘的第一个逻辑分区下的boot目录下的vmlinuz文件;
GRUB启动后:
一旦选择了启动选项,GRUB把选择的内核载入内存并把控制交给内核。在此步骤中,对于Windows之类不支持多启动标准的操作系统,GRUB也可以通过链式启动把控制传给其它启动器。在这种情况下,其它操作系统的启动程序被GRUB保存了下来;与内核不同,其它操作系统如同直接自MBR启动。类似Windows的启动菜单,也许是另一个启动管理器,它允许在多个不支持多启动的操作系统中做进一步的选择。
GRUB安装:
GRUB的一个重要的特性是安装它不需依附一个操作系统;但是,这种安装需要一个Linux副本。由于单独工作,GRUB实质上是一个微型系统,通过链式启动的方式,它可以启动所有安装的主流操作系统。与LILO不同,修改GRUB的配置文件后,不必把GRUB重新安装到MBR或者某个分区中。
在Linux中,"grub-install"命令是用来把GRUB的步骤1安装到MBR或者分区中的。GRUB的配置文件、步骤2以及其它文件必须安装到某个可用的分区中。如果这些文件或者分区不可用,步骤1将把用户留在命令行界面。
1、安装完系统后,grub默认安装在第一硬盘(hd0)的MBR,其实就是把引导文件boot.img写入硬盘的MBR;用户也可以选择不写入硬盘MBR而是写入Linux分区的引导扇区。启动时根据MBR所提供信息找到启动分区后,加载分区内的GRUB核心文件core.img和配置文件grub.conf,进入选择菜单页面;在菜单画面,按上下键选择要需要的系统菜单项;
2、grub的配置文件:/boot/grub/grub.conf 《==== /etc/grub.conf
[[email protected] grub]# ls -l grub.conf
-rw-------. 1 root root 815 Jul 27 19:56 grub.conf
[[email protected] grub]# ls -l /etc/grub.conf
lrwxrwxrwx. 1 root root 22 Jul 27 19:56 /etc/grub.conf -> ../boot/grub/grub.conf
stage2及内核等通常放置于一个基本磁盘分区;
功用:
(1) 提供菜单、并提供交互式接口
e: 编辑模式,用于编辑菜单;
c: 命令模式,交互式接口;
(2) 加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏此菜单
(3) 为菜单提供了保护机制
为编辑菜单进行认证
为启用内核或操作系统进行认证
编辑模式
命令行模式
grub的命令行接口
help: 获取帮助列表
help KEYWORD: 详细帮助信息
find (hd#,#)/PATH/TO/SOMEFILE:可以查找文件;
root (hd#,#)指定根;
kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的cmdline参数;
例如:init=/path/to/init, selinux=0
initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk;
boot: 引导启动选定的内核;
手动在grub命令行接口启动系统:
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
测试:备份grub.conf后,将原文件删除;通过编辑模式和命令行模式分别启动系统;
- 备份文件:
[[email protected] ~]# cp /boot/grub/grub.conf /root/
[[email protected] ~]# ls /root/grub.conf -l
-rw-------. 1 root root 815 Sep 3 14:44 /root/grub.conf
2、删除文件;
[[email protected] ~]# rm -f /boot/grub/grub.conf
[[email protected] ~]# ls /boot/grub/grub.conf
ls: cannot access /boot/grub/grub.conf: No such file or directory
- 系统重启进入GRUB命令行模式:
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE quiet
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot
便可以正常启动系统;
配置文件:/boot/grub/grub.conf
配置项:
default=#: 设定默认启动的菜单项;落单项(title)编号从0开始;
timeout=#:指定菜单项等待选项选择的时长;
splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径;
hiddenmenu:隐藏菜单;
password [--md5] STRING: 菜单编辑认证;
title TITLE:定义菜单项"标题", 可出现多次;
root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub的"根";
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件;
password [--md5] STRING: 启动选定的内核或操作系统时进行认证;
测试:使用grub-md5-crypt命令为GRUB程序添加菜单编辑认证时的命令和启动选定的内核时认证的命令;
编辑需要密码;
启动也需要密码;
测试:通过编辑grub菜单进入单用户模式,从而修改root密码;
1) 编辑grub菜单(选定要编辑的title,而后使用e命令);
(2) 在选定的kernel后附加
1, s, S或single都可以;
(3) 在kernel所在行,键入“b”命令
(4) 无需登录直接进入shell,使用passwd命令修改密码;
安装grub:
(1) grub-install
grub-install --root-directory=ROOT /dev/DISK
测试:通过在现有系统上添加一块硬盘,在其上安装grub,并通过将本机内核及应用程序复制到新添硬盘的方式使新硬盘能独立启动?
1、添加新硬盘并分区;
[[email protected]~]# fdisk -l /dev/sdb Disk/dev/sdb: 21.5 GB, 21474836480 bytes 255heads, 63 sectors/track, 2610 cylinders Units =cylinders of 16065 * 512 = 8225280 bytes Sectorsize (logical/physical): 512 bytes / 512 bytes I/O size(minimum/optimal): 512 bytes / 512 bytes Diskidentifier: 0xf4aa5725 DeviceBoot Start End Blocks Id System /dev/sdb1 1 14 112423+ 83 Linux /dev/sdb2 15 276 2104515 82 Linux swap / Solaris /dev/sdb3 277 930 5253255 83 Linux
2、格式化分区,1,3为ext4, 2为swap;
[[email protected]~]# mke2fs -t ext4 /dev/sdb1 [[email protected]~]# mke2fs -t ext4 /dev/sdb3 [[email protected]~]# mkswap /dev/sdb2
3、创建挂载目录,并挂载sdb1到该目录下;
[[email protected]~]# mkdir /mnt/boot [[email protected]~]# mount /dev/sdb1 /mnt/boot/ [[email protected]~]# ls /mnt/boot/ lost+found [[email protected] ~]#
4、安装grub至新硬盘的基本文件系统上,使用grub-install, grub-install会自动寻找boot目录,指定根目录时至需指定到boot目录的上一级目录即可;
[[email protected]~]# grub-install --root-directory=/mnt /dev/sdb Probingdevices to guess BIOS drives. This may take a long time. Installationfinished. No error reported. This isthe contents of the device map /mnt/boot/grub/device.map. Check ifthis is correct or not. If any of the lines is incorrect, fix itand re-run the script `grub-install‘. (fd0) /dev/fd0 (hd0)/dev/sda (hd1)/dev/sdb [[email protected] ~]# ls /mnt/boot/ grub lost+found #安装成功;
安装不能生成grub.conf配置文件,需要手工书写;
5、复制内核、initranfs至新硬盘boot目录;
[[email protected]~]# cp /boot/vmlinuz-2.6.32-504.el6.i686 /mnt/boot/vmlinuz [[email protected]~]# cp /boot/initramfs-2.6.32-504.el6.i686.img /mnt/boot/initramfs.img
6、创建配置文件grub.conf
default=0 timeout=5 titleKaLaguiyin‘s System(TEST) root (hd0,0) kernel /vmlinuz ro root=/dev/sda3 init=/bin/bash initrd/initramfs.img
7、为新硬盘的根分区创建常用的一级子目录:
[[email protected]~]# mkdir /mnt/sysroot [[email protected]~]# mount /dev/sdb3 /mnt/sysroot/ [[email protected]~]# cd /mnt/sysroot/ [[email protected]]# ls lost+found [[email protected]]# mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr home rootmnt media
8、复制bash程序到新硬盘的对应目录下;
[[email protected]]# cp /bin/bash /mnt/sysroot/bin/
在复制完bash后也需要将bash所依赖的动态库复制到对应目录下;
查看二进制程序所依赖的动态库使用ldd命令:
[[email protected] sysroot]# ldd /bin/bash linux-gate.so.1 => (0x00d19000) libtinfo.so.5 => /lib/libtinfo.so.5(0x0037d000) libdl.so.2 => /lib/libdl.so.2 (0x00994000) libc.so.6 => /lib/libc.so.6 (0x0014e000) /lib/ld-linux.so.2(0x00fc0000)
复制bash所依赖的动态库:
[[email protected]]# cp /lib/libtinfo.so.5 /mnt/sysroot/lib/ [[email protected]]# cp /lib/libdl.so.2 /mnt/sysroot/lib/ [[email protected]]# cp /lib/libc.so.6 /mnt/sysroot/lib [[email protected]]# cp /lib/ld-linux.so.2 /mnt/sysroot/lib
9、切换根,并测试bash是否可用:
[[email protected]]# chroot /mnt/sysroot/ bash-4.1#ls bash:ls: command not found bash-4.1#cd bash-4.1#
10、 再次修改grub.conf文件,在kernel行末加上: init=/bin/bash
11、 找到磁盘文件,将其作为新建虚拟机的硬盘使用;
12、新建虚拟机,使用已有硬盘!
此时启动将会失败,因为内核默认启用了selinux,故需要通过grub编辑模式在选择init之前输入selinux=0,启动将顺利进行,启动完毕后直接可以使用bash;
13、若想使用其他程序,请按照bash的方式进行;此处不再一一说明;
思路:在使用过程中若不小心破坏了硬盘的前446个字节,即bootloader的存放位置中的数据,在未重启的情况下可以使用以下两种方式恢复GRUB:
1、grub-install - -root-directory=/ /dev/sda 重新安装grub,指定根和硬盘;
2、使用grub命令,进入grub命令模式:
grub>setup(hd0) #指定硬盘即可恢复grub;
若grub损毁后已重启,且系统无法启动时,也可以使用Linux启动介质进入救援模式,使用上述方法恢复,但在安装时注意安装路径问题!
参考资料:
维基百科:GNU GRUB
https://zh.wikipedia.org/wiki/GNU_GRUB
grub2基础教程:
http://xstarcd.github.io/wiki/files/grub2_BasicTutorial.pdf
PS:小弟现在也是正在学习阶段,所以请各位大神勿喷!Thanks!