GRUB应用

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后,将原文件删除;通过编辑模式和命令行模式分别启动系统;

  1. 备份文件:

[[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

  1. 系统重启进入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!

时间: 2024-10-19 11:47:54

GRUB应用的相关文章

#24 centos6(RHEL)系列操作系统的启动流程、与命令chkconfig、grub的使用

所有由rc脚本关闭或启动的链接文件的原文件都存在于/etc/rc.d/init.d,系统为了方便使用,为此目录创建了链接/etc/init.d 所有/etc/inid.d(/etc/rc.d/init.d)目录中的脚本执行方式: # /etc/init.d/srv_script {start|stop|restart|status} # service srv_script {start|stop|restart|status} chkconfig命令: chkconfig - updates

详解 linux中的grub

grub是什么: grub是引导操作系统的程序,它会根据自己的配置文件,去引导内核,当内核被加载到内存以后, 内核会根据grub配置文件中的配置,找到根分区所使用的文件系统对应的驱动,通过根分区文件系统 对应的驱动,挂载根分区,从而达到启动操作系统的目的. 在了解grub以前,请先大体上了解一下centos5/6的启动过程,然后再理解grub就更容易了, 还记的我们以前总结过的centos5系统启动流程吗,如下图,此处我们重点讨论下图红框中的步骤. centos5/6中使用grub作为bootl

grub resource>unknown filesystem异常处理

前段时间新装的Ubuntu server 14.04 AMD64位操作系统出问题,没办法只能重装 安装完成后重启然后初始化服务器阵列控制器和防火墙后,弹出 UNKNOWN FILESYSTEM GRUB RESOURCE> 进入不到系统引导界面 当时以为是磁盘分区的问题,重装了Ubuntu7次,问题依旧没解决 最后按照如下指引操作发现问题线索 GRUB RESOURCE>ls hd0,(hd0,gpt1),(hd0,gpt2),(hd0,gpt3) GRUB RESOURCE>ls (h

CentOS6上新增硬盘并安装配置grub文件

实例: 为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区: (1) 为硬盘新建两个主分区:并为其安装grub: (2) 为硬盘的第一个主分区提供内核和ramdisk文件: 为第二个分区提供rootfs: (3) 为rootfs提供bash.ls.cat程序及所依赖的库文件: (4) 为grub提供配置文件: (5) 将新的硬盘设置为第一启动项并能够正常启动目标主机: 新增硬盘并分区 [[email protected]~]# fdisk -l /dev/sdb Disk /dev

win7 +v Ubuntu 16.04 grub rescue 模式下修复 grub

前几天整理了下电脑的分区,合并并删除一些分区,结果导致 grub 被破坏了,Ubuntu进不去了,启动后直接进入了 rescure 模式.后来又折腾了下,终于修复好了,现总结一下. 先说一下我的系统环境,我是 Win7 + Ubuntu 16.04 双系统,先安装的 Win7,后安装的 Ubuntu.采用的是 Windows 引导 Ubuntu 的方式,使用的工具是"EasyBCD 2.3 个人版本".Ubuntu 分区时,"/boot" 是单独分区的.详细分区情况

Grub实践

为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区: (1) 为硬盘新建两个主分区:并为其安装grub: (2) 为硬盘的第一个主分区提供内核和ramdisk文件: 为第二个分区提供rootfs: (3) 为rootfs提供bash.ls.cat程序及所依赖的库文件: (4) 为grub提供配置文件: (5) 将新的硬盘设置为第一启动项并能够正常启动目标主机: 操作步骤: 1.自行为虚拟机额外添加一块硬盘,并设置分区:以/dev/sdb为例,具体操作不再赘述 /dev/sdb1:作

linux命令:系统裁剪之一grub引导

Linux系统裁剪笔记 1.什么裁剪? 本篇文章的主要目的是让笔者和读者更深的认识Linux系统的运作方式,大致内容就是把Linux拆开自己一个个组件来组装,然后完成一个微型的Linux系统,从而达到系统缩减,订制特殊系统. 2.原理 大家都知道,操作系统的启动流程是(主要是Linux):POST->BIOS->MBR(grub)-kernel-->initrd-->sbin/init, POST,BIOS都不是我们管的,所以这里我们从MBR开始,Linux的系统引导先主要是用的g

关于Linux系统上grub的介绍和使用实例

grub(GrandUnified Boot Loader)是有名的引导内核程序(另外一款比较有名的是LILO,嵌入式环境使用U-boot.bootloader),它支持多种硬盘分区类型加载(FAT,ext2,ext3,ext4,minix,FFS等),支持多系统引导等. 1.配置文件:/boot/grub/grub.conf 配置项:         default=#: 设定默认启动的菜单项:落单项(title)编号从0开始:         timeout=#:指定菜单项等待选项选择的时长

Centos 6 –grub legacy及grub修复

一.CentOS 6 grub legacy: 1.启动流程: POST –> Boot Sequence(BIOS) –> Boot Loader –>Kernel(ramdisk) –> rootfs –> switchroot –>             /sbin/init –>(/etc/inittab, /etc/init/*.conf) –> 设定默认运行级别 –> 系统初始化脚本rc.sysinit –> 关闭或启动对应级别的服

CentOS 系统启动流程之GRUB

系统启动之GRUB GRUB(Boot Loader) 从系统启动流程可以得知,在BIOS读取相关信息之后,接下来是去第一个可以启动的设备当中的MBR中读取Boot Loader信息,Boot Loader提供具有菜单功能.直接加载内核信息,以及相关的控制权转交功能.所以说系统启动必须要有Boot Loader,然后才能去加载内核. Boot Loader存储于MBR当中,MBR只有512bytes,其中446bytes存储Boot Loader,但是Boot Loader功能很强大,所以446