• Linux 引导流程解析


    本文主要记录下linux的引导流程(实例采用centOS 5.5)。

    内容主要如下:引导流程、解析下GRUB的作用。

    一、引导流程

    1.1主要的流程图如下:

    image

     

    1.2每一步的作用

    1)第一步firmware固件自检,主要是进行CMOS/BIOS对硬件进行POST加电自检,在物理层次上对硬件进行检测是否正常。

    2)读取硬盘中MBR的BootLoader(自启动程序,Linux下常用的自启动程序是GRUB)。这一步主要的功能是载入内核。

    3)载入的内核Kernel主要功能是:1、驱动硬件(Kernel中含有大量驱动程序),2、启动init进程。

    4)init进程,主要是读取/etc/inittab文件,执行缺省运行级别,从而继续引导。(需要注意的是它的PID恒为1,0为内核调度器Kernel scheduler)。

    5)/etc/inittab 定义了初始化的操作。 

    内容如下:

    image

    命令主要格式是:id : runlevels : action : process

    [解析]

    id :标识符,一般为两位字或数字

    run-levels :指定运行级别,可以指定多个

    action :指定运行状态

    process :指定要运行的脚本或命令

    其中,

    1、run-levels运行级别有7个,0—6分别如下:

    0 —— halt 关机

    1 —— Single user mode 单用户模式

    2 —— Multiuser,withoutNFS 多用户模式但不带网络(text模式)

    3 —— Full multiuser mode 完整功能的多用户模式(text模式)

    4 —— unused 预留

    5 —— X11 图形化多用户模式

    6 —— reboot 重启

    主要命令:查看当前运行级别 #runlevel、 切换运行级别 #init[0 |1 |2 |3 |4 |5 |6]

    2、而acion中也有几个比较重要的取值:

    ① initdefault:指定系统缺省启动的运行级别(通常用于修复,比如我们要进入单用户模式,则可以将其设置为1)

    image

    ( 由截图中可以知道缺省的run-level是:3)

    ② sysinit:系统启动执行process中指定的命令(每次都会执行)

    image

    (由截图知,无论是哪个运行级别,都会执行/etc/rc.d/rc.sysinit)

    ③ wait:执行process中指定的命令,并等其结束后再运行其他命令

    ④ once:执行process中指定的命令,不等待其结束

    ⑤ ctrlaltdel:按下Ctrl + Alt + Del时执行process指定的命令

    6)initdefault

    如第五步所说到的,主要是读取/etc/inittab中的信息,判断缺省的运行级别是什么。

    7)/etc/rc.d/rc.sysinit

    启动这个脚本。完成系统服务程序的启动,如系统环境变量的设置、设置系统时钟、加载字体、检查加载文件系统、生成系统启动信息日志文件等。(由于是基础服务,如截图所示,默认是将其run-level设置为空::即任何级别,action设置为sysinit。即该脚本在任何运行级别下都要启动,以完成基础服务的启动)【可以自定义自己希望启动的脚本,然后加到这个脚本的最后面,便会在启动时被加载】

    8)基础服务启动后,会执行/etc/rc.d/rc这个脚本

    加载完基础服务后,就要根据不同的运行级别去启动相对应的下的目录,(如3是命令行模式,5是图形模式,他们需要启动的服务不同),但系统如何去加载呢?这就是rc这个脚本的作用了,它的工作原理是先去判断系统的默认运行级别即第6步中的东西,然后再执行相应的rcN.d目录下的服务启动脚本 如图

    image

    9)执行/etc/rc.d/rcN.d目录下的服务启动脚本

    看下该目录下有什么东西:

    image

    [解析]

    S —— start表示要启动的脚本

    K —— kill 表示要关闭的脚本

    数字表示启动顺序,数值小的优先

    1.3自定义服务启动或关闭

    1)关键目录 /etc/rc.d/init.d/ 下,找到相关的服务再对其进行关闭或启动(所以运行级别的脚本都是来自这个目录的软链接)。

    image

    通过服务脚本名 start |stop等操作去启动或关闭服务

    image

    2)自定义服务并启动

    实际上,无论是哪个运行级别,他们要启动的脚本都位于/etc/rc.d/init.d这个目录中,而启动的时候相对应的/etc/rc.d/rcN.d目录中的脚本只是一个软链接,指向的还是init.d这个目录中的脚本

    如图:rc3.d目录中的内容,可以看到都是软链接(概念类似引用)

    image

    了解了上面的原理后,我们就可以定义我们自己的服务脚本,并让系统在引导的时候加载我们的脚本。

    方式有以下几种:

    1、增加软链接 #ln -s

    例子:

    先写好一个脚本,再用 ln –s 脚本名 /etc/rc.d/rcN.d/Sxx脚本名

    这样系统就会在引导运行级别N时就会加载这个脚本

    如:ln  –s  /etc/rc.d/init.d/xx.script  /etc/rc.d/rc3.d/S100xx.script

    这样系统就会在运行级别3时加载我们的xx.script这个服务。(注意脚本放在init.d目录中,并且软链接的名字要用S开头)

    2、使用 chkconfig

    image

    3、使用 ntsysv (图形界面选择)

    用ntsysv –-level N进入对于相应运行级别服务的启动设置

    image

    通过空格选择启动或否(*表示启动),上下方向键选择

    1.4小结

    大概的引导流程就是以上的几步了。

    最后说下如何查看引导日志,主要有两种方式

    1、# dmesg

    记录了内核kernel驱动硬件的信息

    如查询下硬盘eth0的信息:

    image

    2、查看 /var/log/messages的日志信息

    记录了服务的启动信息

    如查看ntpd的启动情况

    image

    二、GRUB解析及应用

    了解了基本的引导流程,我们再来着重看下流程中最重要的自启动程序BootLoader,Linux常用的是GRUB。

    2.1GRUB的配置与运用

    GRUB的配置文件默认位置 /boot/grub/grub.conf (即GRUB它的实际位置在/boot下)

    他有个软链接是 在/etc/grub.conf

    先看下grub.conf

    image

    [解析]

    default 定义缺省启动系统(多系统的时候会用到)

    timeout 定义缺省等待时间

    splashimage 定义GRUB界面图片

    hiddenmenu 隐藏菜单

    title 定义菜单项名称

    root 设置GRUB的根设备

    kernerl 定义内核文件所在位置 ro —只读

    initrd 定义加载镜像文件

    其中root中 (hd0,0) hd为硬盘类型 0为第一块硬盘 ,0为第一个分区

    这个实际上是指定了 /boot所在的硬盘分区

    可以看下/boot目录

    image

    2.2列子

    2.2.1进入单用户模式

    适合场合:忘记root密码、修复系统

    方法:

    1、在启动倒数的时候按ESC进入GRUB操作界面

    image

    e ——编辑当前的启动菜单项

    b ——启动当前的菜单项

    d ——删除当前行

    c ——进入GRUB的命令行模式

    Esc ——返回GRUB启动菜单界面,取消对当前所做的修改

    2、按e进入,再选kernerl按e去编辑kernerl项

    image

    3、在最后加" 1"(空格 1),即运行级别1的单用户模式

    4、按回车确定,再按B重启,便可以进入当用户模式

    image

    在单用户模式下,可以对root密码进行重置(命令 #passwd root)

    同时可以做其他需要修复的操作。

    三、总结

    主要是掌握好系统的引导流程,明白在启动的时候系统的每一步在干什么,这样当系统出现问题了,我们就可以判断出是在哪一步出现了问题。这样才能在寻找解决方案的时候有的放矢,缩小范围。

  • 相关阅读:
    smarty
    js进阶
    JS 基础
    php之面向对象(2)
    php之面向对象(1)
    PHP之图形处理
    PHP代码分离
    PHP文件上传与安全
    PHP substr截取中文字符出现乱码的问题解疑
    关于学习方法
  • 原文地址:https://www.cnblogs.com/Quains/p/2312335.html
Copyright © 2020-2023  润新知