CentOS6 启动流程图文解剖(1)


我们在使用Linux操作系统的时候,我们只需按下电源键,等待,然后输入账户和密码就可以使用Linux操作系统了。那么在按下电源到输入账号和密码之前,操作系统都做了些什么?下面就来讲述在这段时间发生的动作。

下面以CentOS6系列为例来讲解Linux的启动流程。

一、Linux启动流程详解

下图就是启动流程的大致过程:

wKiom1PQxc6SML8nAAFcDmK4XC0648.jpg

二、POST加电自检

POST(PowerOnSelfTest)首先对每一个设备进行检查。完成后会寻找存有引导记录的设备,找到后读入操作系统引导记录,然后将系统控制权交给引导记录,并由引导记录来完成系统的顺利启动。

三、MBR引导

MBR(Master Boot Record) MBR记录一般是在磁盘 0 磁道 1 扇区,共512个字节。前446个字节是BootLoder,后 4*16 的 64 个字节是存放分区信息的,最后 2 个字节是校验信息,一般是 55AA。

四、GRUBGRand Unified Bootloader)、加载内核

就是MBR中的前 446 个字节,是BooTLoader的一种,它的作用是要选择要启动的内核。

1、GRUB程序的组成:

wKioL1PQ4efw0SE_AAJbTpZuDV4737.jpg

主要是由device.map,menulst,stage1,stage2,以及一系列的stage1_5组成。对于这些部分我的理解是这样:

  • device.map:存放的是内核文件的根分区
  • menu.lis:是grub.conf的链接文件,但是这个名字我觉得更与它的功能接近,就是菜单列表。里卖弄设置了可以选择的内核菜单。存放于stage2中。
  • stage:用于grub引导程序过大,所以分2段引导,第一段存放在MBR中,第二段存放于内核文件系统中,第一段引导完成后可以找到第二段。 但是,第二段是存放于内核文件系统中的,此时还没有格式化文件系统,如何可以访问到第二段的 menu.lst 呢??就需要借助于中间层 stage1_5,有它来协助 stage1 段来访问 stage2 段。stage1_5通常位于 stage1 字段后的 63 个扇区。 由于stage2 在内存中存放可以使用的文件系统不确定,所以这就是有多个 stage1_5 的原因了。

2、grub.conf 文件参数意义

  1. default=1    # 默认启动的内核title, 0 表示是第一个  
  2. timeout=5    # 默认等待时间  
  3. splashimage=(hd0,0)/grub/splash.xpm.gz    # 指定菜单的背景图片的路径。为xpm格式,采用gzip压缩,只能为14bits色  
  4. hiddenmenu    # 隐藏菜单  
  5. title CentOS (2.6.32-358.el6.x86_64)    # 标题名,用户可自定义  
  6.     root (hd0,0)    # 指定 grub 的根位置  
  7.     # 指定 kernel 文件的位置,还要指出 root系统启动后) 的位置,挂载方式 ro,这项很关键。  
  8.     # 加载后会启动 init 进程。  
  9.     kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS rd_NO_DM LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg0/root  KEYBOARDTYPE=pc KEYTABLE=us rhgb crashkernel=auto quiet rhgb quiet  
  10.     # 在内核启动过程中装载根文件系统时有用  
  11.     initrd /initramfs-2.6.32-358.el6.x86_64.img 
initramfs-2.6.32-358.el6.x86_64.img 的本质是????
  1. # initramfs 是以 gzip 压缩的 cpio 格式的文件。内核启动时将他作为一个临时的根文件系统。  
  2. # grub 的 stage2 将initrd加载到内存里,让后将其中的内容释放到内容中,  
  3. # 内核便去执行init脚本,这时内核将控制权交给了init文件处理。  
  4. # init 它也主要是加载各种存储介质相关的设备驱动程序。当所需的驱动程序加载完后,  
  5. # 会创建一个根设备,然后将根文件系统rootfs以只读的方式挂载。  
  6. # 这一步结束后,释放未使用的内存,转换到真正的根文件系统上面去,同时运行/sbin/init程序,  
  7. # 执行系统的1号进程。此后系统的控制权就全权交给/sbin/init进程了。 

wKioL1PQ7u_RXEQAAAHfgGw63dE269.jpg

如何制作 initramfs 呢?

  1. # 可以使用 dircut 命令,用法如下:  
  2. # 只有在 initramfs 文件损毁的时候会使用到  
  3. [root@server ~]# dracut /mnt/initramfs-`uname -r`.img `uname -r`  
  4. [root@server ~]# du -sh /mnt/initramfs-2.6.32-358.el6.x86_64.img   
  5. 16M /mnt/initramfs-2.6.32-358.el6.x86_64.img  
  6. [root@server ~]# du -sh /boot/initramfs-2.6.32-358.el6.x86_64.img   
  7. 16M /boot/initramfs-2.6.32-358.el6.x86_64.img  
  8. # 详细介绍,可使用这个链接:https://zh.opensuse.org/index.php?title=SDB:Dracut&variant=zh-cn#.E5.90.AF.E7.94.A8_dracut_.E7.94.9F.E6.88.90.E7.9A.84_initramfs 

3、grub的功能

1)提供菜单,并提供交互式接口

e: 进入编辑模式

wKiom1PQ8uLRTFq2AAFFyUCSOSo430.jpg

2)选择要启动的内核或系统

允许传递引导参数给内核

选择界面可隐藏

  1. # 可以自启动是通过 grub 像内核传递参数。  
  2. # 应用之一是:修改 root 密码忘记密码),使用 e 选项,传递单用户指令。 

3)为编辑功能提供保护机制

启用内核文件

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

传递参数

使用e命令得先输入密码

  1. [root@server root]# grub-md5-crypt   
  2. Password:   
  3. Retype password:   
  4. $1$Mp7Rp1$l2wzOILNUqpUhAR7zXvQb0  
  5. # 上面是生成的加密字符串  
  6. # 然后将信息加入到 grub.conf 文件中,格式如下:  
  7. password --md5 $1$Mp7Rp1$l2wzOILNUqpUhAR7zXvQb0  
  8. # 当然加入 grub.conf 文件的位置不同,加密效果也不一样。  
  9. # 加入到 title 之前的话,会加密整个菜单。  
  10. # 加入到 title 指内的话,会加密对应的操作系统的入口。 


相关内容