## 第 22 章 Grub
**目录**
[](ch22.html#id3092437)
[硬件基础](ch22s02.html)
[系统引导流程](ch22s02.html#id3092219)
[Grub 介绍](ch22s03.html)
[Grub 术语](ch22s04.html)
[Grub 的根分区](ch22s04.html#id3093728)
[系统根目录所在分区](ch22s04.html#id3093794)
[Grub 配置文件](ch22s05.html)
[Grub 安装](ch22s06.html)
[将 Grub 安装到系统中](ch22s06.html#id3094130)
[将 Grub 安装到 MBR](ch22s06.html#id3094197)
[Grub 使用](ch22s07.html)
## 硬件基础
一块硬盘,它起始的一部分扇区为主引导扇区,包括 MBR(主引导纪录)和 DPT(分区表,您可以阅读[“分区概念”一节](ch08.html#partition "分区概念")中相关内容)
每个分区起始的一部分扇区,为分区引导扇区。
在分区引导扇区之后的部分,为文件系统的索引,文件系统通过它定位文件在硬盘上的位置。不同的文件系统采用不同的索引,例如 FAT 文件系统使用文件分配表和目录区。
绝大多数操作系统,对硬盘的读写操作,通过文件系统来完成,因此引导扇区中的内容,我们不能够在文件系统中进行操作,而需要专用软件,比如引导管理器。
我们对文件进行修改后,操作系统会将文件系统索引中的内容同步。
### 系统引导流程
1. 系统启动时,首先引导至 MBR,将控制权移交安装在 MBR 中的引导管理器![4](https://box.kancloud.cn/2015-10-12_561bcb9508b82.png)
2. 引导管理器装载自身[[39](ch22s02.html#ftn.grub-stage)]
3. 引导管理器读取分区中的配置文件,并按配置文件中预设的参数运行![5](https://box.kancloud.cn/2015-10-12_561bcb95133e7.png)
4. 引导管理器根据您的选择,可能会有如下活动
* 加载内核,启动 Linux 系统检查活动分区,并引导它
* Windows 系统:读取相应分区的引导扇区,将控制权移交该扇区中的引导管理器
> [![4](https://box.kancloud.cn/2015-10-12_561bcb9508b82.png)](ch22s02.html#grub-11) Windows 使用 NTLDR,Linux 通常用 Grub
> [![5](https://box.kancloud.cn/2015-10-12_561bcb95133e7.png)](ch22s02.html#grub-12) 例如,Grub 读取“`/boot/grub/menu.lst`”文件中内容,将可引导系统通过菜单显示
Linux 系统在安装 Grub 时,会提问您安装在 MBR 或者分区引导扇区中。如果将 Grub 安装在分区引导纪录中,您必须确保 MBR 中的引导管理器能够正确的引导至分区引导扇区。
如果您在 MBR 中使用的是 Windows 的引导管理器 NTLDR,完成这件工作会非常困难,因而我们推荐您使用 Grub。
* * *
> [[39](ch22s02.html#grub-stage)] Grub 先装载 MBR 中的 stage1,通过 stage1 来装载文件系统中的 stage2,显示菜单和 Shell 等待用户。
> 有时 stage1 不能识别 stage2 所在分区的文件系统,这就需要装载 stage1.5 来连接 stage1 和 stage2
## Grub 介绍
Grub 主要有以下功能:
* 菜单式选择
* 命令行模式
* 支持开机画面
* 支持大硬盘
其它的功能还有很多,就不一一介绍了。
您可以运行命令 **grub** 启动它。会显示一些版本信息和使用提示,当然还有命令提示符,如下:
```
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>
```
您可以使用 `TAB` 键补全命令和路径,这非常重要,因为 Grub 中路径表示方式与操作系统是不同的,您可能比较陌生,所以尽量用 TAB 补全它,既方便,也不容易出错。
您可以在 _grub>_ 提示符后按 `TAB` 键,会将所有可用的命令显示出来。
呵呵,是不是有点晕,命令可真不少啊!!!其实我们会用到的命令只有两个:**root** **setup**
## Grub 术语
在分区概念章节里,我们已经介绍了 Linux 系统中表示分区的方法 `/dev/sda5`
```
/dev/sdMN M 为 a 起始的小写字母,表示硬盘序号;N 为 1 起始的数字,表示分区序号
```
Grub 中使用的表示方法为 `hd0,1`
```
hdX,Y X 为 0 起始的数字,表示硬盘序号;Y 为 0 起始的数字,表示分区序号
```
留意它们之间的区别:
* N 从 1 开始计数,X 和 Y从 0 开始计数
* N 为 1~4,它是一个主分区;N 为 5 或大于 5,它是第(N-4)个逻辑分区。Y 按分区在硬盘上排列的顺序排列,无论它表示的是主分区还是逻辑分区。
举例来说:
| 分区分布 | 主分区 | 主分区 | 逻辑分区 | 逻辑分区 | 主分区 |
| --- | --- | --- | --- | --- | --- |
| /dev/sdMN | sda1 | sda2 | sda5 | sda6 | sda3 |
| hdX,Y | hd0,0 | hd0,1 | hd0,2 | hd0,3 | hd0,4 |
现在我们来看 **root** 和 **setup** 命令的使用,`sudo grub`进入 Grub 交互模式:
```
grub>root (hd0,1)
grub>setup (hd0)
```
> [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch22s04.html#grub-31) 这个命令将 Grub 的根分区定位为 “(hd0,1)”
> [![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png)](ch22s04.html#grub-32) 这个命令表示将 Grub 安装在“(hd0)”,因为没有指定安装的分区,所以安装位置为 MBR
### Grub 的根分区
为 Grub 配置文件 `grub/menu.lst` 和`stage[[39](ch22s02.html#ftn.grub-stage)]`文件所在分区。假如您单独为 `/boot` 目录挂载了一个分区,那么 Grub 的根分区通常为您系统中 `/boot` 目录所在的分区。
搞错了根分区,Grub 就不能正确读取配置文件,自然不能正确引导。[[40](ch22s04.html#ftn.id3093773)]
### 系统根目录所在分区
Linux 根目录 `/` 的挂载分区。Linux 系统的分区挂载信息保存在文件系统分配表 `/etc/fstab` 文件中
Grub 首先读取根分区[[41](ch22s04.html#ftn.id3093820)]中的 `/boot/grub/menu.lst` 文件,并转到引导分区,如果是 Windows 等系统,则将控制权移动分区引导扇区中的启动管理器。如果是 Linux 系统,则加载内核和设备,并根据 `/etc/fstab` 文件的内容挂载文件系统。
看这个例子:(假设 Grub 安装在 MBR 中,Grub 的安装位置为 `(hd0)`)
```
title Linux
root (hd0,0)
kernel (hd0,1)/vmlinuz-2.6.15-25-686 root=/dev/sda3 ro splash vga=0x31b
initrd (hd0,1)/initrd.img-2.6.15-25-686
boot
```
> [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch22s04.html#grub-41) 这一行表示引导分区为第一块硬盘的第一个分区 (hd0,0)。如果下面也指定了这个参数,那么下面的优先
> [![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png)](ch22s04.html#grub-42) 表示当前系统的 /boot 目录挂载到第一块硬盘的第二个分区 (hd0,1),它是引导分区。一般情况下在 “root”项中指定
> [![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png)](ch22s04.html#43) 表示当前系统的 / 目录挂载到第一块硬盘的第三个分区 (hd0,2) ,内核根据该分区中的 `/etc/fstab` 文件来挂载文件系统
> [![4](https://box.kancloud.cn/2015-10-12_561bcb9508b82.png)](ch22s04.html#grub-44) 同2
* * *
> [[40](ch22s04.html#id3093773)] Windows 等系统的引导分区为它的安装分区,Linux 系统的引导分区为它的 `/boot` 目录所在的分区,也就是 Grub 根分区
> [[41](ch22s04.html#id3093820)] 配置文件中并不能指定 Grub 根分区,它要在 Grub 安装过程中指定
## Grub 配置文件
`/boot/grub/menu.lst` 文件,主要由一些下面这样的块构成的
```
timeout 5
default 0
title Linux
root (hd0,2)
kernel (hd0,2)/boot/vmlinuz-2.6.15-25-686 root=/dev/sda3 ro splash vga=0x31b
initrd (hd0,2)/boot/initrd.img-2.6.15-25-686
boot
title Windows
root (hd0,0)
makeactive
chainloader +1
```
> [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch22s05.html#grub-49) 等待时间,如果用户在这段时间内未进行选择,则引导默认系统
> [![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png)](ch22s05.html#grub-50) 默认系统,从 0 开始计数,每个_title_项为一个系统
> [![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png)](ch22s05.html#grub-51) 标题,title 和分隔符后的内容为 Grub 菜单中显示的条目
> [![4](https://box.kancloud.cn/2015-10-12_561bcb9508b82.png)](ch22s05.html#grub-52) 引导分区
> [![5](https://box.kancloud.cn/2015-10-12_561bcb95133e7.png)](ch22s05.html#grub-55) 表示当前系统的 / 目录挂载到第一块硬盘的第三个分区 (hd0,2) ,内核根据该分区中的 `/etc/fstab` 文件来挂载文件系统
> [![6](https://box.kancloud.cn/2016-01-06_568cdb4f32753.png)](ch22s05.html#grub-56) 以只读模式挂载
> [![7](https://box.kancloud.cn/2016-01-06_568cdb4f41fcc.png)](ch22s05.html#grub-57) 显示启动画面
> [![8](https://box.kancloud.cn/2016-01-06_568cdb4f5948a.png)](ch22s05.html#grub-58) 启动屏幕分辨率
> [![9](https://box.kancloud.cn/2016-01-06_568cdb4f68749.png)](ch22s05.html#grub-53) 设置活动分区
> [![10](https://box.kancloud.cn/2016-01-06_568cdb4f83cf0.png)](ch22s05.html#grub-54) 链式引导
## Grub 安装
### 将 Grub 安装到系统中
```
grub-install --no-floppy --root-directory=/boot /dev/sdM
```
> [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch22s06.html#grub-61) 不使用软盘
> [![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png)](ch22s06.html#grub-62) 文件安装目录,通常不需要指定
> [![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png)](ch22s06.html#grub-63) 目标磁盘
* 这一步只是拷贝 Grub 的文件。如果是修复系统,通常情况下它们已经存在,直接进行下一步就可以
### 将 Grub 安装到 MBR
`sudo grub`进入 Grub 交互模式:
```
grub> find /boot/grub/stage2
(hd0,0)
grub> root (hd0,0)
Filesystem type is xfs, partition type 0x83
grub> setup (hd0)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/xfs_stage1_5" exists... yes
Running "embed /boot/grub/xfs_stage1_5 (hd0)"... 19 sectors are embedded.
succeeded
Running "install /boot/grub/stage1 (hd0) (hd0)1+19 p (hd0,0)/boot/grub/stage2
/boot/grub/menu.lst"... succeeded
Done.
grub> quit
```
> [![1](https://box.kancloud.cn/2015-10-12_561bcb76795ae.png)](ch22s06.html#grub-71) 搜索 stage2 文件所在的分区[[39](ch22s02.html#ftn.grub-stage)],通常就是 Grub 根分区
> [![2](https://box.kancloud.cn/2015-10-12_561bcb768596e.png)](ch22s06.html#grub-72) 返回 Grub 根分区名称
> [![3](https://box.kancloud.cn/2015-10-12_561bcb94ee26f.png)](ch22s06.html#grub-73) 将这个分区设为 Grub 根分区
> [![4](https://box.kancloud.cn/2015-10-12_561bcb9508b82.png)](ch22s06.html#grub-74) 返回 Grub 根分区的文件系统信息
> [![5](https://box.kancloud.cn/2015-10-12_561bcb95133e7.png)](ch22s06.html#grub-75) 将 Grub 安装到 MBR。注意是(hd0)而不是(hd0,0)
> [![6](https://box.kancloud.cn/2016-01-06_568cdb4f32753.png)](ch22s06.html#grub-76) 检查需要的文件是否存在,因为用了 XFS 文件系统,所以需要`xfs_stage1_5`
> [![7](https://box.kancloud.cn/2016-01-06_568cdb4f41fcc.png)](ch22s06.html#grub-77) 将`xfs_stage1_5`嵌入到 MBR,不然 Grub 不能够读取 XFS 分区中的 stage2
> [![8](https://box.kancloud.cn/2016-01-06_568cdb4f5948a.png)](ch22s06.html#grub-78) 将`stage1`安装到 MBR,并指向 `stage2` 和 `menu.lst`
> [![9](https://box.kancloud.cn/2016-01-06_568cdb4f68749.png)](ch22s06.html#grub-79) 退出
* 可以使用`TAB`补全,或者按两次`TAB`列出提示
## Grub 使用
在 Grub 启动菜单中,您可以选择您要的选项,按下 `d` 删除该项;或者按下 `e` 键,进入到编辑模式
修改您的启动参数,完成后回车
按 `b` 键,Grub 将以您修改后的参数引导系统。
在 Grub 启动菜单中,按下 `c` 进入命令模式,操作与交互模式基本相同;只不过最后一个命令是**boot**,而不是**quit**
- 开源世界旅行手册
- 授权
- 致谢
- 序言
- 更新纪录
- 导读
- 如何写作科技文档
- 部分 I. 气候
- 第 1 章 GUI? CLI?
- 第 2 章 UNIX 缩写风格
- 第 3 章 版本号的迷雾
- 第 4 章 Vim 还是 Emacs
- 第 5 章 DocBook 还是 TeX
- 第 6 章 完全用 Gnu/Linux 工作
- 第 7 章 病毒
- 第 8 章 磁盘 分区
- 第 9 章 文件系统
- 第 10 章 发行版介绍
- 第 11 章 编程语言
- 第 12 章 无根的根:无名师的 Unix 心传
- 部分 II. 地理
- 第 13 章 基础知识
- 第 14 章 命令系统
- 第 15 章 基本系统
- 第 16 章 软件管理
- 第 17 章 核心工具集
- 第 18 章 编译工具链
- 第 19 章 图形界面
- 第 20 章 国际化
- 第 21 章 内核
- 第 22 章 Grub
- 第 23 章 服务器
- 第 24 章 Vim 编辑器
- 第 25 章 Emacs 入门
- 第 26 章 正则表达式
- 第 27 章 docbook 指南
- 第 28 章 Git 版本控制系统
- 第 29 章 ConTeXt 入门指南
- 部分 III. 景观
- 第 30 章 终极 Shell -- ZSH
- 第 31 章 完美工作站 Archlinux
- 第 32 章 组织你的意念:Emacs org mode
- 第 33 章 Zsh+screen
- 第 34 章 gentoo stage3
- 第 35 章 硬件问题
- 第 36 章 网络设置
- 第 37 章 自制 LiveCD
- 第 38 章 awesome
- 第 39 章 openbox 工作环境
- 第 40 章 Emacs muse
- 第 41 章 写作工具链
- 第 42 章 使用 lftp
- 第 43 章 Firefox 使用技巧
- 第 44 章 FVWM
- 部分 IV. 地质
- 第 45 章 Unix
- 第 46 章 Gnu
- 第 47 章 软件业自由之神——Richard Stallman
- 第 48 章 Linux
- 第 49 章 GNOME与KDE的战争
- 第 50 章 Vim Emacs
- 第 51 章 年代纪
- 第 52 章 我的选择
- 第 53 章 补遗