Linux启动流程讲解


要了解linux系统的启动流程,先要了解系统的组成

    关于系统的组成:
        内核+根文件系统组成
       

        内核:由内核核心文件和模块文件组成
            1.内核核心文件:一般位于/boot/目录下,命名为vmlinuz-VERSION(版本号)
            2.模块文件:位于/lib/modules/VERSION/目录下,存放着内核的众多功能组件(如驱动)
            3.initrd:位于/boot下,一般命名为initramfs-VERSION,此文件相当于一个简装版的根文件系统,在内核无法挂载文件系统是加载,辅助内核完成真正的根文件系统挂载
       

    补充一些基本概念:(方便在流程讲解中容易理解)

        (1)CMOS:主板上的一块可读写的RAM芯片,保存系统的硬件配置信息
        (2)BIOS:基本输入输出系统,写入主板ROM芯片的微系统
        (3)MBR:Master Boot Record,共512字节,446字节boot loader,64字节分区表
        (4)boot loader:启动管理程序,linux启动管理程序为grub或lilo
   

    系统启动的简要流程:
   BIOS开机自检 --> 加载boot loader --> boot load加载内核文件到内存 --> 内核初始化,最后启动init进程 --> init初始化,启动登陆终端

    系统的简单启动流程如以上所示,要了解其中的细节,大概需要分为两层来展开,内核层面和用户层面,以下启动流程基于grub展开


    内核层面:

    1.开机自检:启动电源后,BIOS会读取CMOS中的硬件信息,完成自检后读取“第一启动设备的第一扇区”中的boot loader程序grub 
        
    2.grub引导有三个阶段:stage1、stage1_5、stage2

        stage1:此阶段并不是直接引导内核,而是指向第二扇区的stage1_5

        stage1_5: 识别文件系统并加载stage2

        stage2:找到内核并解压至内存,功成身退

       

    3.内核初始化,并尝试以只读方式挂载根文件系统,根文件系统挂载后,内核便加载驱动,最后内核启动第一个进程init

        若内核无法完成根文件系统挂载,则需要加载initramfs文件来辅助根的挂载


    用户空间层面      
    4. init程序初始化系统环境,通过读取inittab获取运行级别,加载初始化脚本/etc/rc.d/rc.sysinit,根据相应的运行级别完成服务的停止和启动,最终启动终端
     
    注意:initramfs是非必须的,取决于内核是否能挂载根文件系统


   
init初始化:(CentOS 5的初始化流程)
    init是内核完成初始化最后一步启动的系统第一的进程,其PID为1,init读取inittab配置文件设定运行级别, 然后读取/etc/rc.d/rc.sysinit初始化脚本,完成系统环境初始化,按照运行级别加载和关闭相关服务(相关运行级别服务信息,通过遍历/etc/rc.d/下对应运行级别的目录中的符号连接,符号连接指向/etc/rc.d/ini.d目录下的脚本文件)
    最终启动终端
 
        配置文件:/etc/inittab            
         配置系统运行级别 

[root@johnson_linux ~]# cat /etc/inittab 
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
id:3:initdefault:

          0 - halt (系统直接关机)
          1 - single user mode (单人模式,无需登录,用于维护)
          2 - Multi-user, without NFS (无NFS服务的多用户系统)
          3 - Full multi-user mode (有网络功能的命令行模式)
          4 - unused (系统保留功能)
          5 - X11 (加载X Window,与3相似)
          6 - reboot (重新启动)

         注意:默认runlevel不要设置成0或6,否则系统将会不停关机个重启

        配置文件相关语法:
         id:runlevel:action:process
          id:任务标示
          runlevel:运行此任务的级别
          action:启动此任务的条件
          process:任务
            
        action:
         wait:等待切换至此任务所在的级别时执行一次:
         respawn:一旦此任务终止,就自动重新启动之:
         initdefault:设定默认运行级别:此时,process省略:
         sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit脚本:

         例子:2:2:wait:/etc/rc.d/rc6.d
          表示切换至2级别要执行一次rc.6的配置文件

    在服务初始化时,优先级别高的服务会先被停止或者启动,被依赖的服务其启动优先级应该高于被依赖的服务,停止优先级应该低于被依赖的服务

    /etc/rc.d/rc.sysinit
        初始化脚本文件,init通过加载此脚本文件初始化系统环境
        初始化信息
         (1) 设置主机名
         (2) 设置欢迎信息
         (3) 激活udev和selinux
         (4) 挂载/etc/fstab文件中定义的所有文件系统
         (5) 检测根文件系统,并以读写方式重新挂载根文件系统
         (6) 设置系统时钟
         (7) 根据/etc/sysctl.conf文件来设置内核参数
         (8) 激活lvm及软raid设备
         (9) 激活swap设备
         (10) 加载额外设备的驱动程序
         (11) 清理操作


    /etc/rc.d/*.d
     rc.d目录下存放以$runevelrc.d命名的文件,内容是对应runlevel
     应该停止和启动的服务的符号链接,符号连接指向的是/etc/rc.d/init.d目录下的脚本文件

    /etc/rc.local:初始化流程最后指定执行的脚本文件,可通过此文件设定开机自动启动程序

    chkconfig:查看运行级别的服务信息
     查看
      chkconfig [--list] [name]
     添加
      chkconfig --add name
     删除
      chkconfig --del name
     修改
      chkconfig [--level LEVEL] name {no|off|reset}
      不指定level默认为2345



你可能感兴趣的:(linux,init,启动流程)