linux内核及centos系统启动流程

Linux组成

Linux: kernel+rootfs(根文件系统)

kernel功能: 进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能

rootfs:程序和glibc

 库:函数集合, function, 调用接口(头文件负责描述)
     过程调用:procedure,无返回值
    函数调用:function
程序:二进制执行文件

内核设计流派:

单内核(monolithic kernel):Linux
把所有功能集成于同一个程序

微内核(micro kernel):Windows, Solaris(hurb)(太完美了没有成功)
每种功能使用一个单独子系统实现

linux设计思想:内核核心仅保留最基本功能,而把其它功能做成子系统;各子系统之间依靠通信完成基本功能

内核

Linux内核特点:

支持模块化:.ko(内核对象有些是驱动模块)
如:文件系统,硬件驱动,网络协议等

支持内核模块的动态装载和卸载

组成部分:

一.核心文件:/boot/vmlinuz-VERSION-release

生成时间是光盘自带的时间,出场时写入的时间,如果没了可以从别处考一个过来

ramdisk:辅助的伪根系统(虚拟文件系统,生成时间是安装时的时间)
    CentOS 5: /boot/initrd-VERSION-release.img    
                虚拟出来的一个磁盘
    CentOS6,7: /boot/initramfs-VERSION-release.img
                虚拟出来的文件系统
    这是一个cpio的文档格式
        cat 。。。|cpio -id

删除/boot/initramfs-VERSION-release.img文件修复

linux内核及centos系统启动流程
这个无法从别处拷贝只能单独生成!
步骤
linux内核及centos系统启动流程
   1.重启进光盘修复
会发现,能进入界面引导界面却不能下一步的生成!这说明可以进入boot,但无法下一步!
2.在/boot下重新生成此文件
linux内核及centos系统启动流程
不切换根的话很多工具会用不了!mkinitrd命令是硬盘上的命令!
注意:最后一步要很长时间才能生成,要耐心等待,结束后exit.exit两次重启

  

二.模块文件:/lib/modules/VERSION-release

注意:虽然安装时内核10M多,其就实除了核心文件是驱动/lib/modules,
根文件系统的驱动有可能和根不相同,你可以访问boot但不一定能访问根,因为根的驱动在根下的lib,
所以boot里面放驱动,把boot加载,从而找到根的驱动把根挂上!
boot又是怎么启动的呢,是前面的grub的工作了!


CentOS 系统启动流程:


linux内核及centos系统启动流程    

1. POST

Power-On-Self-Test,加电自检,是BIOS功能的一个主要部分。负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测。

ramdisk:自检流程!

内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问
ramdisk —> ramfs 提高速度
CentOS 5: initrd 文件,  工具程序:mkinitrd
CentOS 6: initramfs 文件, 工具程序:mkinitrd, dracut

  • ROM:BIOS,Basic Input and Output System,保存着有关计算机系统最重要的基本输入输出程序,系统信息设置、开机加电自检程序和系统启动自举程序等。

  • RAM:CMOS互补金属氧化物半导体,保存各项参数的设定

      按次序查找引导设备,第一个有引导程序的设备为本次启动设备

2.bootloader: 引导加载器,引导程序

  • windows: ntloader,仅是启动OS

  • Linux:功能丰富,提供菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核

      LILO:LInux LOader
      GRUB: GRand Unified Bootloader
          GRUB 0.X: GRUB Legacy, GRUB2
          例如:你装了个双内核,开机的菜单选项就是grub生成的
    • GRUB:

          primary boot loader : 1st stage,1.5 stage
              1.5阶段被放在第一个扇区的后续扇区!(都在0柱面上,所以分区时从1扇区开始分的!)这个扇区装载的就是 boot的驱动!
          secondary boot loader :2nd stage,分区文件
      
          1阶段和1.5阶段这些在/boot/grub下都有(以1 1_5结尾)备份文件(可以删除),但2的不是备份文件,不能删除!!!
    • MBR:只放置了一点grub内容,用来寻找/boot下的驱动模块(1.5阶段)

        446: bootloader, 64: 分区表, 2: 55AA
        由于MBR在硬盘的第一个扇区,不用驱动!

    3.kernel:

    通过boot下的核心文件和boot下的驱动挂载根

    linux内核及centos系统启动流程    

    自身初始化:

    • 探测可识别到的所有硬件设备

    • 加载硬件驱动程序(可能借助于ramdisk加载驱动)

        ramdisk: 加载至内存中,此段内存空间被虚拟成了块设备;
        用于提供硬盘驱动程序;系统安装时临时生成的;
        ramdisk被内核识别为“根文件系统”,即rootfs,常被称作“临时根”;
    • 以只读方式挂载根文件系统(真正的根)

        因为grub下的 grub.conf有写,也写了根的驱动程序所在位置为当下的initramfs-***.img文件
    • 运行用户空间的第一个应用程序:/sbin/init

    4.init:

    • init读取其初始化文件:/etc/inittab

        初始运行级别(RUN LEVEL)
        系统初始化脚本
        对应运行级别的脚本目录
        捕获某个关键字顺序
        定义UPS电源终端/恢复脚本
        在虚拟控制台生成getty
        在运行级别5初始化X
    • 个版本服务启动

      CentOS 5:** SysV init**
        特点:启动用户空间的服务程序,通常通过脚本进行;有依赖关系的服务将被串行启动;
        配置文件:/etc/inittab
      
      CentOS 6: **Upstart**
        特点:守护进程间的通信依赖于D-Bus进行,因此,可基本实现类似并行启动;
        配置文件:/etc/inittab, /etc/init/*.conf
      
      CentOS 7: **Systemd**
        特点:服务只有在第一次被访问到时才会真正启动起来;
        配置文件:/usr/lib/systemd/

      系统初始化总结:

      POST —> BootSequence (BIOS) —> Bootloader(MBR) —> kernel(ramdisk) —> rootfs(只读) —> init(systemd)



    /sbin/init

        Linux系统运行级别:为系统维护的目的而设定,途径是设定启动或关闭服务实现;
            0-6: 7个级别
                0:关闭所有服务;关机
                1:维护模式,单用户模式,sigle模式;此级别可允许root用户直接登录而无须认证;
                2:维护模式,多用户模式,需要用户认让,会启动网络功能,但不支持使用NFS;
                3:正常级别,完全多用户模式,文本界面;
                4:预留级别
                5:正常级别,完全多用户模式,图形界面;
                6:关闭所有服务;重启 
    
            默认级别:3,5
    
            切换级别:
                init [0-6]
                    init 0
                    init 6
    
            查看级别:
                runlevel命令
                who -r

    总结(用户空间的启动流程): /sbin/init (/etc/inittab)
       设置默认运行级别 —> 运行系统初始化脚本,完成系统初始化 —> 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务—> 设置登录终端 [—> 启动图形终端]

    配置文件:/etc/inittab(CentOS 5 6)配置文件格式

    linux内核及centos系统启动流程

    格式:

    每一行定义一种action以及与之对应的process

        id:runlevel:action:process
    任务的标示符:运行级别:任务在什么时候启动,如何启动:启动的到底是什么任务                
    
        id:一个任务的标识符;
        runlevels:在哪些级别启动此任务;#,###,也可以为空,表示所有级别;
        action:在什么条件下启动此任务;
        process:任务;

    action:

    • wait: 切换至此级别运行一次

    • respawn:此process终止,就重新启动之

    • initdefault:设定默认运行级别;process省略

    • sysinit:设定系统初始化方式,此处一般为指定

      • /etc/rc.d/rc.sysinit

    ca::ctrlaltdel:/sbin/shutdown -t3 -r now

    例如:

    设定默认运行级别

     id:3:initdefault:

    定义完成系统初始化的脚本

    si::sysinit:/etc/rc.d/rc.sysinit

    初始化用户空间环境;此脚本会执行许多系统初始化任务;

    启动对应级别下设定为要启动的服务,关闭那些设定为要停止的服务;

    l1:1:wait:/etc/rc.d/rc 1
    l2:2:wait:/etc/rc.d/rc 2
    l3:3:wait:/etc/rc.d/rc 3
    rc是一个脚本,传递一个参数,表示运行这个参数模式的相应脚本
    
    例如:启动虚拟终端:一下内容表示当你在2345级别下切换终端时会自动运行/sbin/mingetty(启动虚拟终端)程序;这就是我们用ctrl+alt+F# 启动虚拟终端的原因
        一般启动6个虚拟终端:
            tty1:2345:respawn:/sbin/mingetty tty1
            tty2:2345:respawn:/sbin/mingetty tty2
            tty3:2345:respawn:/sbin/mingetty tty3
    
    每个虚拟终端启动之后,会立即通过此终端附加一个应用程序(/sbin/mingetty)调用login程序
        打开虚拟终端的程序除了mingetty之外,还有诸如getty等;
    
    如果默认级别为5,还会启动一个图形虚拟终端;会附加X应用程序;

    总结(centos 5用户空间的启动流程): /sbin/init (/etc/inittab)

    设置默认运行级别 —> 运行系统初始化脚本,完成系统初始化 —> 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务—> 设置登录终端 [—> 启动图形终端]

    centos 6:

    (1) CentOS 6的init程序为upstart,其配置文件依然为/etc/init/*.conf;(/etc/inittab 仅用于定义默认运行级别)此些配置遵循upstart语法格式进行编程;

    (2) CentOS 6的服务控制事实上大多数并没有使用upstart脚本来控制,而依然使用的是SysV风格的脚本;

    注意:*.conf为upstart风格的配置文件;                    
        rcS.conf
        rc.conf
        tty.conf
        start-tty.conf

    centos 7

    init程序:systemd,配置文件:/usr/lib/systemd/system/,  /etc/systemd/system/

    完全兼容SysV脚本机制;因此,service命令依然可用;不过,建议使用systemctl命令来控制服务;

    # systemctl  {start|stop|restart|status}  name[.service]

    注意:centos 7 启动时init中的服务没有什么启动流程,服务都是同时并行启动,服务之间的依赖关系在启动时默认不解决;等服务都启动好后才解决依赖问题。(如果你在开机时就只用到三个那么就只启动三个服务,其他都默认不启动,等用到的时候再启动!)


    /etc/rc.d目录讲解

    linux内核及centos系统启动流程

    1 init.d目录

    里面包括了各种系统服务的文件。rc#.d里面的各种文件就是来自此文件,只不过换了个名字

    2./etc/rc->rc.d/rc 此脚本的意义 当init运行等级切换时用于负责启动或停止服务

    linux内核及centos系统启动流程

    意味着:通过/etc/rc.d/rc#.d/下所有链接文件来决定如何启动或关闭服务;

    所有以S开头的,都被传递start参数以启动; 所有以K开头的,都被传递stop参数以停止;

    3./etc/rc.d/rc.sysinit脚本的功能:

    (1) 根据配置文件中的设定来设定主机名(读取/etc/sysconfig/network文件中的HOSTNAME进行);
    (2) 打印文本欢迎信息;
    (3) 激活SELinux和udev;
    (4) 挂载所有定义在/etc/fstab文件中的文件系统;
    (5) 激活swap设备;
    (6) 检测根文件系统,并实现以读写方式重新挂载;
    (7) 设置系统时钟;
    (8) 根据/etc/sysctl.conf文件设定内核参数的值;
    (9) 激活LVM和RAID设备;
    (10) 加载额外的设备驱动程序;
    (11) 清理操作

    4、rc #.d 目录

    此目录保存的文件其实都是init.d下的文件只不过改了下名字,以便于服务启动顺序。
    K*:要停止的服务;K##*,优先级,数字越小,越是优先关闭;依赖的服务先关闭,而后关闭被依赖的;
    S*:要启动的服务;S##*,优先级,数字越小,越是优先启动;被依赖的服务先启动,而依赖的服务后启动;
    linux内核及centos系统启动流程表示系统最后启动,里面没什么,自己可以把一些服务加进去,这样就便于系统开机就启动

    5./etc/init.d/* (/etc/rc.d/init.d/*)脚本执行方式:

    # /etc/init.d/SRV_SCRIPT  {start|stop|restart|status}
    # service  SRV_SCRIPT   {start|stop|restart|status}

    /etc/init.d/SVC_SCRIPTS, 此些脚本遵循LSB服务脚本的定义规范,都接受至少四个最基本的参数,{start|stop|status|restart};
        start
        stop
        restart
        status: 查看服务运行状态;

    6.在此目录下添加脚本的方法:

    linux内核及centos系统启动流程                        

    1.能被添加的服务的脚本定义格式之一:

    #!/bin/bash
    #
    # chkconfig: LLLL(运行级别) NN MM
    # description: 
    LLL表示初始在哪个级别下启动,-表示都不启动 
    
    注意:后边的NN表示S##*中##所代表的数字,数字要小于其它依赖于它的服务(要启动在其他依赖于他的服务之前)
        MM代表K##*中所代表的数字,数字要大于它所依赖的服务的优先级

    2. 添加进各个rc#.d

    chkconfig —add  脚本的名字
    linux内核及centos系统启动流程

    让这个服务脚本受 chkconfig 管理,这样后就会自动的让rc#.d(指明的运行级别下)生成  KNN脚本名字 的文件或S##

    这样以后就能直接用 service 服务名字 {stop|start|status}了

    删除:chkconfig  --del  name
    修改指定的链接类型:

    chkconfig命令

    查看服务在所有级别的启动或关闭设定情形:

    chkconfig [—list] [name]

    linux内核及centos系统启动流程

    添加:SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d)

    chkconfig —add name:为某存放在/etc/init.d的服务在对应的/etc/rc.d/rc0-6.d目录添加符号链接;

    #!/bin/bash
    #LLLL 表示初始在哪个级别下启动,-表示都不启动
    # chkconfig: LLLL nn nn
    #description

    linux内核及centos系统启动流程

    删除:

    chkconfig —del name: 把指定SVC_SCRIPTS的在7个级别符号链接统统删除;

    修改指定的链接类型

    chkconfig [—level levels] name

    – —level LLLL:选项明确指定的级别为on或off, 余下的级别保存原有; 省略时表示2345

    – ntsysv命令

    注意:正常级别下,最后启动的一个服务S99local没有链接至/etc/init.d下的某脚本,而是链接至了/etc/rc.d
    /rc.local (/etc/rc.local)脚本;因此,不便或不需写为服务脚本的程序期望能开机自动运行时,直接放置于此脚本文件中即可。

    原创文章,作者:qzx,如若转载,请注明出处:http://www.178linux.com/45230

    (0)
    上一篇 2016-09-10 20:29
    下一篇 2016-09-10 21:08

    相关推荐

    • Hadoop伪分布式模型

      # java -version # vim /etc/profile.d/java.sh export JAVA_HOME=/usr # yum install java-1.8.0-openjdk-devel # mkdir /bdapps # tar xf hadoop-2.7.4.tar.gz -C /bdapps/ # cd /bdapps # ln…

      2017-12-08
    • lvs DR模型

      LVS 负载均衡 使用lvs部署负载均衡服务器  实现4层tcp调度 lvs一共四种模式   分别是NAT  DR  TUN和FullNAT模式 NAT模式和DR模式部署相对简单而且实用性强 现在部署一下  LVS的DR模型 首先准备三台主机  使用的三台系统都是centos 7…

      2017-05-15
    • bash特性及用户和组的管理相关练习

      1、列出当前系统上所有已经登录的用户的用户名,注意同一个用户登录多次,则只显示一次即可: 2、取出最后登录到系统的用户的相关信息: 3、取出当前系统上被用户当做默认shell最多的那个shell: 4、将/etc/passwd中的第三个字段数值最大的后10个用户的信息全部改为大写后保存至/tmp/maxuser.txt文件中: 5、取出当前主机的IP地址: …

      2017-10-16
    • sed工具的基本用法

      sed -n(不输出模式,不自动打印) sed -d(删除匹配到的内容) sed-e(多点编辑) sed-r(支持扩展正则表达式) sed#,#(地址定界,在此范围中匹配) sed 1~2   sed 2~2 (找奇数行和偶数行) sed =(为打印到的内容编辑行号)  sed!(取反) sed s///(查找替换,支持使用其他…

      Linux干货 2017-05-02
    • rpm包及rmp命令详解

      一、软件运行环境           API: Application Programming Interface              国际标准&nbs…

      Linux干货 2016-08-22
    • 关于shell脚本基础第二篇

                            shell脚本编程基础第二篇 read命令 使用read来把输入的值非配给一个或者多个shell变量,可以提示用户输入一些参数等,此时我们可以使用read命令来完成此功能 re…

      系统运维 2016-08-19