Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3055960
  • 博文数量: 535
  • 博客积分: 15788
  • 博客等级: 上将
  • 技术积分: 6507
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-07 09:11
文章分类

全部博文(535)

文章存档

2016年(1)

2015年(1)

2014年(10)

2013年(26)

2012年(43)

2011年(86)

2010年(76)

2009年(136)

2008年(97)

2007年(59)

分类: LINUX

2012-05-22 11:34:46

1、BIOS将控制权交给硬盘的主引导区,MBR。(stage1)
2、MBR中的bootloader通过内置的地址加载stage1.5。
3、bootloader通过stage1.5内容,将分区中的stage2加载。
4、stage2此时就可以在文件系统中奖grub.conf设置文件加载,让用户看到选项画面。


/boot 目录分为两大部分,一个是/boot目录下除grub目录以外的所有文件,这些是Linux的内核以及内核启动相关的一些文件;另一个就是grub下的所有文件,grub引导器启动所需的所有文件都在grub目录下。

主要包含以下几部分文件
1、config-2.6.18-238.12.1.el5
内核配置文件,文件里的内容就是编译内核时的配置文件。

2、 initrd-2.6.18-238.12.1.el5.img

linux2.6以后已经改为initramfs,initial ram file system。initrd强调的是disk,需要mount,mount时需要涉及到file system,而initramfs则是file system,跳过disk,直接就是file system。关于initramfs,查看http://blog.chinaunix.net/uid-1838361-id-3490862.html


以下是对 initrd 与 initramfs 的概念性比较:

initrd initramfs
Image 压缩过的文档 (如 ext2 + gzip)  封装过的文档 (cpio + gzip)
实际用途 block device (RAM disk) tmpfs
首先执行的程序 /linuxrc /init
挂在rootfs方式 

                                          將欲載入的 rootfs 掛載於某個目錄,再 pivot_root 切換 rootfs

更多:http://blog.linux.org.tw/~jserv/archives/001954.html

      使用 switch_root


initialized ram disk初始化RAM磁盘。


GRUB会在内核启动前把initrd装入内存,该文件的作用是生成一个RAM磁盘,并在其上形成根文件系统,内核启动时会在访问真实的磁盘根文件系统前访问这个RAM磁盘中的根文件系统。对于image-initrd这个类型的来说,内核执行完initrd这个阶段以后,会返回到内核,继续内核初始化,然后由内核去调用真实文件系统中的init。
为什么使用initrd?为了在各种硬件平台上启动,initrd的作用之一就是加载硬件驱动模块,从而可以在内核中只包含最基本的硬件驱动既可以,将加载不同硬件驱动的任务交给initrd。
关于initrd的另一个作用是支持usb启动,由于usb从驱动加载到真正可用的过程较慢,在内核访问usb时,USB设备可能还没初始化完成,将该过程放入到initrd中可以进行延迟,完成正确加载和引导。

可以将initrd文件解开。
cp initrd-2.6.32-220.13.1.el6.x86_64kdump.img  /tmp
cd /tmp
mv initrd-2.6.32-220.13.1.el6.x86_64kdump.img  initrd-2.6.32-220.13.1.el6.x86_64kdump.gz
gunzip initrd-2.6.32-220.13.1.el6.x86_64kdump.gz
cpio -id < initrd-2.6.32-220.13.1.el6.x86_64kdump.gz
解压后,可以看到目录结构:
bin  etc    lib64  modules  sbin       sys      tmp  var
dev  init  lib   mnt    proc     scriptfns  sysroot  usr
几个概念
1)目录结构:当kernel激活加载initrd时,并没有任何系统的目录架构,这时会先以initrd所提供的目录当做是系统的暂时目录。
2)lib目录:里面存放很多的模块,也就是驱动程序。该目录中所存放的模块都是开机所必须加载的模块。

3)init文件:是initrd中的脚本文件,kernel在访问initrd时,会依次文件按其内容依序完成。


关于initramfs

查看 http://blog.chinaunix.net/uid-1838361-id-3490862.html

可以讲initramfs解开

cp /boot/initramfs-2.6.32-279.el6.i686.img  /tmp

查看文件类型:

[root@xiajc 2]# file initramfs-2.6.32-279.el6.i686.img 
initramfs-2.6.32-279.el6.i686.img: gzip compressed data, from Unix, last modified: Sat Feb 16 19:46:07 2013, max compression
可以看到也是gizp压缩过的文件

mv initramfs-2.6.32-279.el6.i686.img initramfs-2.6.32-279.el6.i686.img.gz

gunzip initramfs-2.6.32-279.el6.i686.img.gz

查看解压后的文件类型

[root@xiajc 2]# file initramfs-2.6.32-279.el6.i686.img 
initramfs-2.6.32-279.el6.i686.img: ASCII cpio archive (SVR4 with no CRC)
解开cpio文件

cpio -id <  initramfs-2.6.32-279.el6.i686.img

解开后可以看到目录结构:

bin
cmdline
dev
dracut-004-283.el6
emergency
etc
init
initqueue
initqueue-finished
initqueue-settled
initqueue-timeout
lib
mount
pre-pivot
pre-trigger
pre-udev
proc
sbin
sys
sysroot
tmp
usr
var



3、vmlinuz-2.6.18-238.12.1.el5
这个就是Linux可引导的、压缩的内核文件。
vmlinuz文件就是开机时所用的kernel,其名字的由来是因为当初Linux可以拿硬盘空间当作虚拟内存使用,因而有virtual memory的字眼,而压缩过的linux便成为linuz,组合起来就是vmlinuz(virtual memory linuz).


4、System.map内核符号映射表
System.map是一个静态的内核符号映射表。

/boot/grub目录
device.map
以文件中的设备内容为主,将bootloader写入到所对应的实体磁盘驱动器中。

stage1
BIOS加电自检完成以后,假设系统从硬盘启动,则BIOS做的最后一件事情就是读取该磁盘的0道0面1扇区,即我们常说的MBR,它只有512字节大小。
MBR共由三部分组成: 1、Bootloader就是引导代码,起作用主要是加载第二阶段启动(即stage2)
2、Partition table分区表
3、Magic Number,用以校验该MBR的有效性。

stage1.5
所有带有stage1_5字样的文件,都和文件系统有关,stage1_5在stage1和stage2之间运行,它包含了一些常见文件系统的识别能力,这些文件的存在,意味着grub可以从多种文件系统中读取和加载linux内核。

stage2
stage2的文件尺寸超过了512字节的大小,所以grub本身并不能放到mbr中去,mbr那446字节的作用,主要就是找到这个stage2,它读取menu.list文件显示系统引导菜单,识别不同的引导指令,并完成vmlinuz和initrd的加载,其实,这个就是真正的grub了。


总结:
启动中最重要的东西:mbr/stage1、grub/stage2、kernel/vmlinuz,三者是最核心的。staage1_5的作用是使grub有处理更多文件系统的灵活能力,而initrd使内核启动更加灵活,在不同的平台上,对不同的硬件,使用不同的驱动,从而减小静态内核的尺寸。

注:关于grub的故障排除,可以查看《Linux操作系统之奥秘》
阅读(2272) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~