【移动应用开发技术】引导加载程序grub详解_第1页
【移动应用开发技术】引导加载程序grub详解_第2页
【移动应用开发技术】引导加载程序grub详解_第3页
【移动应用开发技术】引导加载程序grub详解_第4页
【移动应用开发技术】引导加载程序grub详解_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】引导加载程序grub详解

上一章讲到,常见的bootloader(引导加载程序)有LILO和grub,LILO有一大缺点,它只能识别0-1023范围内的柱面构成的分区的内核文件,故已逐渐被grub取代。Grub(GRandUnifiedBootloader)是一个来自GNU项目的多操作系统引导程序,它负责加载内核并移交控制权1、Grub版本:

CentOS5、6

Grub0.97

CentOS7

Grub21.962、grub程序由三段组成:

stage1:MBR(0柱面0磁道1扇区)中

stage1_5:MBR随后的扇区

stage2:读取grub.conf配置文件,并实现引导功能的扩展

MBR所给予的空间毕竟太小,容不下较大的引导程序,因此grub程序被分为三段:"stage1"被装入磁盘的MBR中;特殊的"stage1.5"被装入MBR随后的扇区,它能够识别内核和"stage2"所在分区的文件系统格式并帮助引导"stage2",它是"stage1"和"stage2"之间的纽带;"stage2"位于文件系统上。stage2程序和grub.conf可以与内核文件处于不同的分区上(但必须位于同一磁盘),只要"stage1.5"能够驱动它们各自所在的分区。

在linux中,与启动相关的文件(grub、vmlinuz、initramfs)均位于boot目录下3、grub的功能

①提供菜单,并提供交互式接口

e:进入编辑模式

②选择要启动的内核或系统

允许传递引导参数给内核

选择界面可隐藏

③为编辑功能提供保护机制

启用内核文件:

选择运行指定的内核得先输入密码

传递参数:

使用e命令得先输入密码开机后有三秒种的过渡页面,按任意键可进入菜单页面。在菜单页面可用上下键选择所要启动的内核或内核,按e键进入内核编辑模式,按c键进入grub命令行模式4、grub命令行接口:

help:查看帮助,即列出命令列表

root(DEVICE):指定哪个分区为接下来要启动的系统或内核文件所在的分区,例如root(hd0,0)

所有硬盘都被识别为hd,

不同的硬盘基于数字标识,从0开始:如hd0,hd1等

同一个硬盘上的不同分区,也使用数字标识,从0开始:如hd0,0

hd1,5

find(DEVICE)/path/to/file:查找文件。当我们不确定内核文件位于哪个分区上时,可使用该命令;提示:grub支持tab补全

kernel/path/to/kernel_file:指定要运行的内核文件,如kernel/vmlinuz-2.6.32-431.el6.x86_64。

【注】:这里的文件路径是相对于内核文件所在分区而言,其开头的“/”不是指操作系统的根,而是指内核所在的分区,因为grub是直接以该分区为入口找寻内核的。若有单独的boot分区,则不能写成kernel/boot/vmlinuz-2.6.32-431.el6.x86_64;在指定的内核位置后通常还指明要挂载的根分区

initrd/path/to/kernel_file:为要运行的内核指定其可用的ramdisk文件,其版本必须与内核版本保持一致

【注】:grub无法识别逻辑卷,因此kernel与initramfs一定不能放于逻辑卷上

boot:启动此前配置好的内核或系统5、grub.conf

通过grub命令行接口接入系统比较麻烦,为此,grub提供了一个配置文件/boot/grub/grub.conf(它有一个软链接/etc/grub.conf),grub会读取这个配置文件并按配置参数引导系统

参数:

default=:默认选择第几个title配置的内核或系统,各title从0开始编号

timeout=#:过渡页面显示的超时时长;

splashp_w_picpath=/path/to/some_p_w_picpath_file:指定菜单的背景图片;此图片只能为14bits色,xpm格式,gzip压缩;

hiddenmenu:隐藏菜单

titleTILTESTRING:显示于菜单中的标题

root

kernel

initrd

■若由于grub.conf文件错误或丢失而无法自动进入系统,可通过grub命令行引导系统后再手动更改或创建这个文件[root@node2

~]#

cat

/boot/grub/grub.conf

#

grub.conf

generated

by

anaconda

#

#

Note

that

you

do

not

have

to

rerun

grub

after

making

changes

to

this

file

#

NOTICE:

You

have

a

/boot

partition.

This

means

that

#

all

kernel

and

initrd

paths

are

relative

to

/boot/,

eg.

#

root

(hd0,0)

#

kernel

/vmlinuz-version

ro

root=/dev/sda2

#

initrd

/initrd-[generic-]version.img

#boot=/dev/sda

default=0

timeout=5

splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title

CentOS

(2.6.32-431.el6.x86_64)

root

(hd0,0)

kernel

/vmlinuz-2.6.32-431.el6.x86_64

ro

root=UUID=aa0330af-3681-428c-98e2-ccf2e6f0f686

rd_NO_LUKS

rd_NO_LVM

LANG=en_US.UTF-8

rd_NO_MD

SYSFONT=latarcyrheb-sun16

crashkernel=auto

KEYBOARDTYPE=pc

KEYTABLE=us

rd_NO_DM

rhgb

quiet

initrd

/initramfs-2.6.32-431.el6.x86_64.img

[root@node2

~]#

ll

/etc/grub/conf

ls:

cannot

access

/etc/grub/conf:

No

such

file

or

directory

[root@node2

~]#

ll

/etc/grub.conf

lrwxrwxrwx.

1

root

root

22

Aug

6

04:44

/etc/grub.conf

->

../boot/grub/grub.conf

[root@node2

~]#

cp

/boot/{vmlinuz-2.6.32-431.el6.x86_64,initramfs-2.6.32-431.el6.x86_64.img}

/

#将boot目录下的内核和临时根文件复制一份到根分区下

[root@node2

~]#

ls

/

bin

dev

home

lib

lost+found

misc

net

proc

sbin

srv

tmp

var

boot

etc

initramfs-2.6.32-431.el6.x86_64.img

lib64

media

mnt

opt

root

selinux

sys

usr

vmlinuz-2.6.32-431.el6.x86_64

[root@node2

~]#

vim

/etc/grub.conf

...

default=0

timeout=5

splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

title

CentOS

(2.6.32-431.el6.x86_64)

root

(hd0,0)

kernel

/vmlinuz-2.6.32-431.el6.x86_64

ro

root=UUID=aa0330af-3681-428c-98e2-ccf2e6f0f686

rd_NO_LUKS

rd_NO_LVM

LANG=en_US.UTF-8

rd_NO_MD

SYSFONT=latarcyrheb-sun16

crashkernel=auto

KEYBOARDTYPE=pc

KEYTABLE=us

rd_NO_DM

rhgb

quiet

initrd

/initramfs-2.6.32-431.el6.x86_64.img

#添加如下几行,构成一个新的启动项

title

testCentos

#新的标题

root

(hd0,1)

#现在根分区下也有内核和临时根文件,根分区为sda2,故写成(hd0,1)

kernel

/vmlinuz-2.6.32-431.el6.x86_64

ro

root=/dev/sda2

initrd

/initramfs-2.6.32-431.el6.x86_64.img6、grub保护机制:可防止恶意用户随意进入单用户模式修改root密码

①生成密码:

grub-md5-crypt

②保护所有内核,需要在title之外添加

password--md5密码串

③保护使用某内核,则需要在内核对应的title之下添加

password--md5密码串[root@node2

~]#

grub-md5-crypt

#生成密码

Password:

Retype

password:

$1$oWUbV$Sb/PsrhmkE5bUJPMJGn871

[root@node2

~]#

vim

/etc/grub.conf

...

default=0

timeout=5

splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz

hiddenmenu

password

--md5

$1$oWUbV$Sb/PsrhmkE5bUJPMJGn871

#添加于title之外可保护所有内核

title

CentOS

(2.6.32-431.el6.x86_64)

root

(hd0,0)

kernel

/vmlinuz-2.6.32-431.el6.x86_64

ro

root=UUID=aa0330af-3681-428c-98e2-ccf2e6f0f686

rd_NO_LUKS

rd_NO_LVM

LANG=en_US.UTF-8

rd_NO_MD

SYSFONT=latarcyrheb-sun16

crashkernel=auto

KEYBOARDTYPE=pc

KEYTABLE=us

rd_NO_DM

rhgb

quiet

initrd

/initramfs-2.6.32-431.el6.x86_64.img

title

testCentos

password

--md5

$1$oWUbV$Sb/PsrhmkE5bUJPMJGn871

#可保护使用指定内核

root

(hd0,1)

kernel

/vmlinuz-2.6.32-431.el6.x86_64

ro

root=UUID=aa0330af-3681-428c-98e2-ccf2e6f0f686

initrd

/initramfs-2.6.32-431.el6.x86_64.img7、安装grub的方式:

方法1:使用grub-install命令

grub-install[--root-directory=DIR]DEVICE

DEVICE:针对哪个磁盘安装

--root-directory=DIR:指定grub映像文件(主要是“stage2”)的存放位置,默认为当前系统根目录。grub-install会在指定的目录下创建boot/grub/的层级目录,并将生成的“stage2”置于DIR/boot/grub/下。因为内核与initramfs文件通常位于boot目录下,故一般将DIR指定为boot目录的父目录;当然,我们也可以指定为其它目录,但要手动编辑grub.conf文件重新指明内核文件的位置。

例如

mount/dev/sdb1/mnt/boot

grub-install--root-directory=/mnt//dev/sdb

方法2:输入grub命令进入grub命令行

root(hd0,0):相当于上面的--root-directory=DIR

setup(hd0):为哪个磁盘安装

quit:退出

情景1:grub损坏但系统还未关闭或重启,此时可直接使用上面的两种方法修复[root@node2

~]#

dd

if=/dev/zero

of=/dev/sda

bs=400

count=1

#将MBR中的引导加载程序冲刷掉,注意不能殃及分区表

1+0

records

in

1+0

records

out

400

bytes

(400

B)

copied,

0.000324129

s,

1.2

MB/s

[root@node2

~]#

rm

-f

/boot/grub/stage2

#将"stage

2"也删除

[root@node2

~]#

grub-install

/dev/sda

#使用grub-install的方式安装grub

Installation

finished.

No

error

reported.

This

is

the

contents

of

the

device

map

/boot/grub/device.map.

Check

if

this

is

correct

or

not.

If

any

of

the

lines

is

incorrect,

fix

it

and

re-run

the

script

`grub-install'.

#

this

device

map

was

generated

by

anaconda

(hd0)

/dev/sda

[root@node2

~]#

ll

/boot/grub/stage2

#已重新生成"stage

2"

-rw-r--r--

1

root

root

126100

Oct

28

22:19

/boot/grub/stage2

[root@node2

~]#

dd

if=/dev/zero

of=/dev/sda

bs=400

count=1

1+0

records

in

1+0

records

out

400

bytes

(400

B)

copied,

0.000368562

s,

1.1

MB/s

[root@node2

~]#

grub

Probing

devices

to

guess

BIOS

drives.

This

may

take

a

long

time.

GNU

GRUB

version

0.97

(640K

lower

/

3072K

upper

memory)

[

Minimal

BASH-like

line

editing

is

supported.

For

the

first

word,

TAB

lists

possible

command

completions.

Anywhere

else

TAB

lists

the

possible

completions

of

a

device/filename.]

grub>

root

(hd0,0)

root

(hd0,0)

Filesystem

type

is

ext2fs,

partition

type

0x83

grub>

setup

(hd0)

#使用方法二安装grub

setup

(hd0)

Checking

if

"/boot/grub/stage1"

exists...

no

Checking

if

"/grub/stage1"

exists...

yes

Checking

if

"/grub/stage2"

exists...

yes

Checking

if

"/grub/e2fs_stage1_5"

exists...

yes

Running

"embed

/grub/e2fs_stage1_5

(hd0)"...

27

sectors

are

embedded.

succeeded

Running

"install

/grub/stage1

(hd0)

(hd0)1+27

p

(hd0,0)/grub/stage2

/grub/grub.conf"...

succeeded

Done.

grub>

quit

quit

情景2:grub损坏且系统已关闭,这时候可用如下两种方式修复:

方式一:将故障磁盘挂载于其它正常主机上重装grub

①手动将node1的磁盘的grub损毁并关机[root@node1

~]#

dd

if=/dev/zero

of=/dev/sda

bs=400

count=1

1+0

records

in

1+0

records

out

400

bytes

(400

B)

copied,

0.000164892

s,

2.4

MB/s

[root@node1

~]#

shutdown

-h

now

②将node1的磁盘移除并添加到node2上(关于如何在不重启的情况下识别新增硬盘见末尾补充部分)

③挂载node1的分区并安装grub,安装完后卸载[root@node2

~]#

lsblk

NAME

MAJ:MIN

RM

SIZE

RO

TYPE

MOUNTPOINT

sda

8:0

0

30G

0

disk

├─sda1

8:1

0

200M

0

part

/boot

├─sda2

8:2

0

10G

0

part

/

└─sda3

8:3

0

2G

0

part

[SWAP]

sdb

8:16

0

30G

0

disk

#node1的硬盘在node2上被识别为sdb

├─sdb1

8:17

0

200M

0

part

├─sdb2

8:18

0

10G

0

part

└─sdb3

8:19

0

2G

0

part

sr0

11:0

1

4.2G

0

rom

[root@node2

~]#

mkdir

/mnt/boot

[root@node2

~]#

mount

/dev/sdb1

/mnt/boot

[root@node2

~]#

grub-install

--root-directory=/mnt

/dev/sdb

/dev/sdb

does

not

have

any

corresponding

BIOS

drive.

#

注意:若这里提示找不到相应的BIOS驱动,可使用选项--recheck重新检查磁盘,如下:

[root@node2

~]#

grub-install

--root-directory=/mnt

--recheck

/dev/sdb

Probing

devices

to

guess

BIOS

drives.

This

may

take

a

long

time.

Installation

finished.

No

error

reported.

This

is

the

contents

of

the

device

map

/mnt/boot/grub/device.map.

Check

if

this

is

correct

or

not.

If

any

of

the

lines

is

incorrect,

fix

it

and

re-run

the

script

`grub-install'.

(fd0) /dev/fd0

(hd0) /dev/sda

(hd1) /dev/sdb

[root@node2

~]#

umount

/mnt/boot

④从node2上移除node1的硬盘后再装回node1启动即可

方式二:插入系统光盘进入救援模式修复

①将Linux安装光盘放入光驱。硬盘的MBR损坏后,BIOS会自动从光盘引导,进入菜单页面后,选择进入“救援模式”

②系统会检测硬件,引导光盘上的Linux环境,依次提示选择救援模式下使用的语言、键盘以及是否需要设置网络,可按需选择

③接下来系统会查找根分区,出现挂载提示,硬盘的根分区将被挂载到光盘Linux环境的/mnt/sysp_w_picpath目录下;默认选项“continue”表示挂载权限为读写,“Read-only”为只读,如。此处,因为要对系统进行修复,故需要有读写权限,选择“continue”。

④按提示执行“chroot/mnt/sysp_w_picpath”切换根环境并安装grub,然后退出shell并重启即可

chroot:切换根环境,即以指定的目录作为根

用法:chroot/path/to/directory[SHELL]

例如chroot/mnt/sysp_w_picpath/bin/tcsh

#将sysp_w_picpath作为根目录,并运行其中的tcsh补充:如何实现不重启linux而识别新增硬盘?

新增硬盘后,使用如下命令识别:

echo"scsiadd-single-devicewxyz">/proc/scsi/scsi

其中:

w是主机适配器标识,第一个适配器为零(0)

x是主机适配器上的SCSI通道,第一个通道为零(0)

y是设备的SCSI标识

z是LUN号,第一个LUN为零(0)

执行上述命令前,要先查看/proc/scsi/scsi,确定新增硬盘的ID

相反,在不重启系统的情况下将硬盘从系统中移除的命令为:

echo"scsiremove-single-devicewxyz">/proc/scsi/scsi

使用该命令前需确保该硬盘已卸载[root@node2

~]#

lsblk

NAME

MAJ:MIN

RM

SIZE

RO

TYPE

MOUNTPOINT

sda

8:0

0

30G

0

disk

├─sda1

8:1

0

200M

0

part

/boot

├─sda2

8:2

0

10G

0

part

/

└─sda3

8:3

0

2G

0

part

[SWAP]

sr0

11:0

1

4.2G

0

rom

[root@node2

~]#

cat

/proc/scsi/scsi

Attached

devices:

Host:

scsi0

Channel:

00

Id:

00

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论