EBB-11、Linux启动流程

一、Linux开机流程

(一)power on 开机后加载BIOS(Basic Input Output System,基本的输入输出系统),BIOS加载

          CMOS中所存放的当前主机各项硬件配置、系统时间、连接设备等信息;然后运行POST自检,

          检查硬件设备,再检查启动设备,读取MBR(主引导记录(Master Boot Record)),转接给操

          作系统。

BIOS与CMOS的区别

BIOS与CMOS都是存储器。二者的区别是BIOS为只读存储器ROMEPROM),而CMOS为随机存储器RAM);BIOS中存储 的是程序,而CMOS中存储的是普通信息。

CMOS中保存着BIOS程序的设置结果。而且,CMOS中的用户信息和常规设置需要在BIOS程序引导计算机启动后才能载入 。


引导程序称为boot loader,

1、存放在MBR中。512字节分为三部分:

1) Boot loader 446字节,相当于指针程序,

clip_image002

  如果是双系统,会出现两个选项。


  注意:操作系统不仅会向MBR中写入相应的系统启动程序,还会在系统安装的分区或文件系统上的

             第一个扇区保存操作系统安装的另外一份boot loader。

             windows的boot loader不具备控制权的转交功能。linux的GNU GRUB启动引导程序支持控制  

            权的转交。所以安装windows和Linux双系统,要先装windows。

2)Partition table(分区表)64字节,

3)Magic Number(检验码)2字节(校验位必须为55AA,否则boot loader启动无效)。


(二)相关目录

1、boot目录:

clip_image004

  vmlinuz-2.6.18-194.el5 当前系统的内核文件

  initrd-2.6.18.-194.el5.img 系统的工具箱

  System.map-2.6.18-194.el5 系统kernel中的变量的对应表(kernel的索引文件)

  Symvers-2.6.18-194.el5.gz 模块的符号信息

  config-2.6.18-194.el5 系统kernel的配置文件

2、grub目录:

clip_image006

  stage1 bootloader的第一部分,指向调用stage2

  *1_5的文件,是stage1到stage2中间过程需要加载的中间程序,主要是文件驱动等,支持对应的文

             件系统;支持对应的文件系统后,就可以读取stage2

  stage2 bootloader的第二部分,grub的主要程序


 1)grub开始运行,grub配置文件为grub.conf

    vi grub.conf查看

clip_image008

    default=0 指定默认启动引导配置。0表示选择第一个。如果系统有两个系统是用title做为系统  

    的分隔符,第一个title后面就是第一个系统,用0表示。

    timeout=5 就是默认在启动选择界面停留的时间,单位是秒。等待5秒自动进入默认操作系统

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

    hd0表示当前主机中的第一块硬盘 ;

    ,后面的0代表第一个分区。

    splash.xpm.gz gzip格式压缩的xpm文件,xpm是一种图形格式,该文件为开机过程中显示的红色

    背景

    splashimage是grub启动背景画面,如果是自己写grub.conf文件,可以不用写。

    hiddenmenu 不是一个参数,是开机倒计时不显示选单的功能 。去掉后直接显示选单。

    title title后面就是系统在启动时候显示的文字

    每一个title都是启动选单中显示的文字,到下一个title 中间的部分都是对引导选项的相关配

    置。

    root 指开机过程中grub加载的根文件系统位置

   (hd0,0) 第一块硬盘的第一个分区

    kernel 当前指定的内核文件,内核所在位置和名称

    /vmlinuz-2.6.18-194.el5

    ro root=LABEL=/ rhgb quiet 内核参数

    ro read only以只读方式挂接/根文件系统,

    root 为内核重新指定根目录

    LABEl=/ 以卷标名的方式描述一个分区,可以指定为相应的设备名,如/dev/sda2。

    以卷标方式表示的优点是避免磁盘加载前后出现的问题。

    现在挂接的是真正的根目录(为了避免根目录被破坏,以只读方式挂接)。

    rhgb彩色模式,表示redhat graphics boot,就是会看到图片来代替启动过程中显示的文本信

    息,这些信息在启动后用dmesg也可以看到

    quiet 静默模式,表示在启动过程中只有重要信息显示,类似硬件自检的消息不会显示

    initrd 在redhat3、4、5版本下都是以initrd方式加载内核工具箱。

    /initrd-2.6.18-194.el5.img加载的目录封装的是最基本的模块.。

    initrd文件在内存中会解压缩,内核把它当成/来挂接。

clip_image010


    cpio:不支持读取,只支持输入(最开始用于备份磁带)。

    cpio -iv < initrd-2.6.18-194.el5.img 将文件传输给cpio,然后删掉原文件,该目录显示为

clip_image012

    加载到内存,内核将initrd文件当成/来进行挂接;然后运行init第一个进程。文件类型、内容  

    如图所示

clip_image014

    vi init

clip_image016

    init脚本中创建了/dev及子目录、设备文件。

clip_image018

    insmod加载模块,/lib/下的ehci-hcd.ko, ohci-hcd.ko,uhci-hcd.ko这三个模块是三种不同的  

    USB芯片的驱动模块。

clip_image020

    最后一条命令switchroot,切换根目录,该命令的的结果是把当前根目录的设置从initrd转换为  

    硬盘上真正的根目录。现在是以只读的方式挂接根文件系统。

    总结:内核读取到内存中,initrd在内存中挂接成内存中的文件系统,内核先将initrd内存中的

               文件系统当成根来进行挂接,运行initrd内部的initrd程序(这个initrd程序其实是一个

               脚本,这个脚本加载了一系列配置),切换到硬盘上真正的根,然后再运行硬盘上initrd

               程序。

              模块文件保存在/lib/modules中,这就是/lib目录必须挂载到/目录下的原因。


3、grub出现故障如何修复

1)切换到grub目录下,查看grub.conf文件

clip_image022

2) 查看grub.conf文件

  vi grub.conf

clip_image024

  注意:只有在redhat按照这个过程执行,redhat规定所有的配置文件以.conf文件结尾;

             标准的linux系统下,加载的是menu.lst(软链接文件,指向grub.conf)。


3)执行rm -f grub.conf,删掉grub.conf

4)然后将grub的bootloader 破坏掉,

 dd if=/dev/zero of=/dev/sda bs=446 count=1

 从/dev/zero(虚拟文件,读取的时候显示无限个0)文件中抽取数据,写到/dev/sda;执行结果是用

 0把当前硬盘的头446个字节覆盖。

5)执行reboot重启

6)显示Operating system not found未安装系统,系统无法引导

clip_image026

7)使用光盘的rescue模式修复

(1)进入光盘安装界面,

clip_image028

(2)按F5键进入Rescue模式

clip_image030

(3)输入linux rescue回车

clip_image032

(4)选择安装语言,默认English,点击OK

clip_image034

(5)键盘模式默认us,点击OK

clip_image036

(6)询问是否开启网络,当前用不到,所以点击No

clip_image038

(7)是否扫描当前的分区系统,自动挂接和加载,点击Continue

clip_image040

(8)提示找到分区,并挂接到/mnt/sysimage

clip_image042

(9)执行chroot /mnt/sysimage

clip_image044

(10)现在可以找到硬盘根目录,重新安装grub,利用grub安装程序重写硬盘的MBR。使用grub-install

   命令,查看使用方法

clip_image046

    --root -directory=DIR 指定安装grub的root目录

    --grub -shell=FILE 使用一个文件定义grub的shell程序

    --recheck 检查device map文件。如果存在的话.按照devicemap声明的设备名,搜索设备。

    devicemap文件属性:

clip_image048

(11)执行grub-install --root-directory=/ --recheck /dev/sda(指定安装的设备,安装设备指的

     某块硬盘,不是某个分区)

clip_image050

clip_image052

(12)然后重新启动,进入grub.shell,(一般直接修改grub.conf文件)

clip_image054

(13)查看root已经识别(hd0,0),修改kernel参数、initrd参数,加载完毕

clip_image056

(14)输入boot,开始加载内核启动系统。

clip_image058

(15)进入系统,现在如果重新启动,依然出现grub提示符。因为/boot/grub下的grun.conf文件仍未

           恢复,完全修复系统还需要重新编写grub.conf文件文件

clip_image060

     vi grub.conf输入如下内容

clip_image062

(16)再次重新启动,系统已经修复完毕。

注意:为了避免硬盘MBR损坏后无法,需要备份分区表。

          备份命令

          dd if=/dev/sda of=/root/bacup.img bs=512 count=1

         sda硬盘的头512字节的数据保存到/root/bacup.img文件。

         clip_image064


        如果系统分区表,bootloader损坏,进入rescue修复模式,使用dd命令即可恢复。


(三)grub的结束是当前内核以只读方式挂载根文件系统。然后运行磁盘上的init程序

    (/sbin/init)。

clip_image066

     这个init程序作用是找到系统配置文件(/etc/inittab),并且指定runlevel(系统运行级

     别)。

     vi /etc/inittab

clip_image068

     runlevel模式

     0 关机

     1单用户维护模式

     2 多用户模式,但不加载网络服务

     3 字符界面

     4 系统保留,尚未使用

     5 图形模式

     6 重启

     id:5 系统默认启动模式

     /etc/rc.d/rc.sysinit 开机启动脚本

     vi /etc/rc.d/rc.sysinit

clip_image070

     /etc/inittab文件中

clip_image072

     分别指定不同的runlevel级别下服务启动的脚本;

     l0 表示标签;

     0 表示不同runlevel级别;

     wait等待前一个脚本运行完毕再运行下一个脚本;

     脚本的内容:

clip_image074

     该目录下的软链接文件以K打头的服务系统脚本是不启动的:以S打头的是启动的。数字代表启

     动或关闭的顺序,如果数字相同则按照ASCII码的顺序排列。

     链接的是/etc/rc.d/init.d/目录下的脚本

clip_image076

     不同的runlevel启动级别区别是因为启动的服务脚本不同


      特殊的是rc0.d,关机模式

clip_image078

      除了开启着两个服务(杀死所有进程,关机),其余全部关闭。

clip_image080

你可能感兴趣的:(grub,BIOS,MBR,cmos,开机流程)