Linux系统启动流程总结

CentOS6 启动流程

概述

  理解操做系统开机引导和启动过程对于配置操做系统和解决相关启动问题是相当重要的。本文结合互联网上各种资料,作一些总结,但愿对你们有一些帮助。启动流程总的划分能够分为4个阶段linux

  • POST加电自检
  • 引导装载程序(GRUB)
  • 内核(kernel)初始化
  • 系统第一个进程初始化

1.POST加电自检

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

  BIOS 上电自检确认硬件的基本功能正常,而后产生一个 BIOS 中断[3] INT 13H,该中断指向某个接入的可引导设备的引导扇区。它所找到的包含有效的引导记录的第一个引导扇区将被装载到内存中,而且控制权也将从引导扇区转移到此段代码。BIOS的任务就完成了,此后将系统启动的控制权移交到MBR部分的代码。c#

  引导扇区是引导加载器真正的第一阶段。大多数 Linux 发行版本使用的引导加载器有三种:GRUB、GRUB2 和 LILO。GRUB2 是最新的,也是相对于其余老的同类程序使用最普遍的。centos

2.引导装载程序(Bootloader)

咱们首先来了解一下MBR,它是Master Boot Record的缩写。硬盘的0柱面、0磁头、1扇区称为主引导扇区。它由三个部分组成,主引导程序(Bootloader)、 硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)服务器

GRUB(全称是 GRand Unified BootLoader),是一个用于计算机寻找操做系统内核并加载其到内存的智能程序网络

GRUB主要包含三个阶段:socket

1)stage1

  stage1是直接被写入到MBR中去的,这样机器一启动检测完硬件后,就将控制权交给了GRUB的代码。也就是上图所看到的前446个字节空间中存放的是stage1的代码。ide

  因为引导记录必须很是的小,它不可能很是智能,且不能理解文件系统结构。所以阶段 1 的惟一功能就是定位并加载阶段 1.5 的代码。为了完成此任务,阶段 1.5 的代码必须位于引导记录与设备第一个分区之间的位置。在加载阶段 1.5 代码进入内存后,控制权将由阶段 1 转移到阶段 1.5。测试

2)stage1.5

  阶段 1.5 的代码必须位于引导记录与设备第一个分区之间的位置。由于有更大的存储空间用于阶段 1.5,且该空间足够容纳一些通用的文件系统驱动程序,如标准的 EXT 和其它的 Linux 文件系统,如 FAT 和 NTFS 等。优化

3)stage2

  GRUB 阶段 2 全部的文件都已存放于 /boot/grub目录及其几个子目录之下。该阶段没有一个相似于阶段 1 与阶段 1.5 的镜像文件。

  GRUB 阶段 2 的主要功能是根据/boot/grub/grub.conf定位和加载 Linux 内核到内存中,并转移控制权到内核。内核的相关文件位于 /boot 目录下,这些内核文件能够经过其文件名进行识别,其文件名均带有前缀 vmlinuz。你能够列出 /boot 目录中的内容来查看操做系统中当前已经安装的内核。

  默认状况下,GRUB 提供了一个已安装内核的预引导菜单,其中包括问题诊断菜单(recuse)以及恢复菜单(若是配置已经设置恢复镜像)。

阶段 2 加载选定的内核到内存中,并转移控制权到内核代码。

3.kernel初始化

  内核文件都是以一种自解压的压缩格式存储以节省空间,它与一个初始化的内存映像和存储设备映射表都存储于 /boot 目录之下。

  initrd(Initial RAM Disk),它在stage2这个步骤就被拷贝到了内存中,这个文件是在安装系统时产生的,是一个临时的根文件系统(rootfs)。由于Kernel为了精简,只保留了最基本的模块,所以,Kernel上并无各类硬件的驱动程序,也就没法识rootfs所在的设备,故产生了initrd这个文件,该文件装载了必要的驱动模块,当Kernel启动时,能够从initrd文件中装载驱动模块,直到挂载真正的rootfs,而后将initrd从内存中移除。

  Kernel会以只读方式挂载根文件系统,当根文件系统被挂载后,开始装载第一个进程(用户空间的进程),执行/sbin/init,以后就将控制权交接给了init程序。

  • 探测可识别到的全部硬件设备
  • 加载硬件驱动程序(借助于ramdisk加载驱动)
  • 以只读方式挂载根文件系统
  • 运行用户空间的第一个应用程序:/sbin/init

4.初始化系统

1)/etc/inittab

内核被加载后,第一个运行的程序即是/sbin/init,该文件会读取/etc/inittab文件(CentOS7已经再也不使用),并依据此文件来进行初始化工做。其实/etc/inittab文件最主要的做用就是设定Linux的运行等级,其设定形式是“:id:5:initdefault:”,这就代表Linux须要运行在等级5上。

2) /etc/rc.d/rc.sysinit

执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统算是基本运行起来了,后面须要进行运行级别的肯定及相应服务的启动。

(1)获取网络环境与主机类型。首先会读取网络环境设置文件"/etc/sysconfig/network",获取主机名称与默认网关等网络环境。

(2)测试与载入内存设备/proc及usb设备/sys。除了/proc外,系统会主动检测是否有usb设备,并主动加载usb驱动,尝试载入usb文件系统。

(3)决定是否启动SELinux。

(4)接口设备的检测与即插即用(pnp)参数的测试。

(5)用户自定义模块的加载。用户能够再"/etc/sysconfig/modules/*.modules"加入自定义的模块,此时会加载到系统中。

(6)加载核心的相关设置。按"/etc/sysctl.conf"这个文件的设置值配置功能。

(7)设置系统时间(clock)。

(8)设置终端的控制台的字形。

(9)设置raid及LVM等硬盘功能。

(10)以方式查看检验磁盘文件系统。

(11)进行磁盘配额quota的转换。

(12)从新以读取模式载入系统磁盘。

(13)启动quota功能。

(14)启动系统随机数设备(产生随机数功能)。

(15)清楚启动过程当中的临时文件。

(16)将启动信息加载到"/var/log/dmesg"文件中。

3) /etc/rc.d/rc脚本

3)执行/etc/rc.d/rc脚本。该文件定义了服务启动的顺序是先K后S,而具体的每一个运行级别的服务状态是放在/etc/rc.d/rc.d(=0~6)目录下,全部的文件均是指向/etc/init.d下相应文件的符号连接。rc.sysinit经过分析/etc/inittab文件来肯定系统的启动级别,而后才去执行/etc/rc.d/rc*.d下的文件。

/etc/init.d-> /etc/rc.d/init.d

/etc/rc ->/etc/rc.d/rc

/etc/rc.d ->/etc/rc.d/rc.d

/etc/rc.local-> /etc/rc.d/rc.local

/etc/rc.sysinit-> /etc/rc.d/rc.sysinit

也就是说,/etc目录下的init.d、rc、rc*.d、rc.local和rc.sysinit均是指向/etc/rc.d目录下相应文件和文件夹的符号连接。咱们以启动级别3为例来简要说明一下。

/etc/rc.d/rc3.d目录,该目录下的内容所有都是以 S 或 K 开头的连接文件,都连接到"/etc/rc.d/init.d"目录下的各类shell脚本。S表示的是启动时须要start的服务内容,K表示关机时须要关闭的服务内容。/etc/rc.d/rc.d中的系统服务会在系统后台启动,若是要对某个运行级别中的服务进行更具体的定制,经过chkconfig命令来操做,或者经过setup、ntsys、system-config-services来进行定制。若是咱们须要本身增长启动的内容,能够在init.d目录中增长相关的shell脚本,而后在rc.d目录中创建连接文件指向该shell脚本。这些shell脚本的启动或结束顺序是由S或K字母后面的数字决定,数字越小的脚本越先执行。例如,/etc/rc.d/rc3.d /S01sysstat就比/etc/rc.d/rc3.d /S99local先执行。

4)/etc/rc.d/rc.local

执行用户自定义引导程序/etc/rc.d/rc.local。其实当执行/etc/rc.d/rc3.d/S99local时,它就是在执行/etc/rc.d/rc.local。S99local是指向rc.local的符号连接。就是通常来讲,自定义的程序不须要执行上面所说的繁琐的创建shell增长连接文件的步骤,只须要将命令放在rc.local里面就能够了,这个shell脚本就是保留给用户自定义启动内容的。

5) /sbin/mingetty

完成了系统全部的启动任务后,linux会启动终端或X-Window来等待用户登陆。tty1,tty2,tty3...这表示在运行等级1,2,3,4的时候,都会执行"/sbin/mingetty",并且执行了6个,因此linux会有6个纯文本终端,mingetty就是启动终端的命令。

CentOS6 启动流程总结

  • 1.POST:通电自检,获取第一个启动设备
  • 2.读取第一个启动设备MBR的引导加载程序(grub)的启动信息
  • 3.加载核心操做系统的核心信息,核心开始解压缩,并尝试驱动全部的硬件设备(ramdisk)
  • 4.启动init进程,依据inittab文件设定运行级别 (inittab用于定义默认运行级别)
  • 5.init进程,执行/etc/rc.d/rc.sysinit文件
  • 6.分别执行/etc/init/rcS.conf、/etc/init/rc.conf、/etc/init/start-ttys.confl来调用命令执行/etc/rc#.d/文件里面定义的是各类服务的启动脚本,能够ls查看,S开头表明开机启动的服务,K开头的是关机要执行的任务。#表明数字,一个数字表明一个运行级别,共7个运行级别,这里就很少说了
  • 7.执行/etc/rc.d/rc.local
  • 8.执行/sbin/mingetty程序,等待用户登陆

    CentOS7 启动流程

CentOS7启动主要特色

CentOS7 的启动流程主要步骤没有很大的区别,主要是CentOS7开始,GRUB开始采用GRUB2版本,原来的init程序,改成了systemd,所以详细解释一下systemd后的启动流程

systemd新特性:

  • 系统引导时实现服务并行启动
  • 按需启动守护进程
  • 自动化的服务依赖关系管理
  • 同时采用socket式与D-Bus总线式激活服务
  • 系统状态快照

CentOS7 启动流程

  • UEFi或BIOS初始化,运行POST开机自检,选择启动设备
  • 引导导装载程序, centos7是grub2,加载装载程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg

  • 加载initramfs驱动模块,加载内核选项,内核初始化,从initramfs根文件系统切换到磁盘根目录,centos7使用systemd代替init

  • systemd执行默认target配置。centos7表面有“运行级别”这个概念,实际是为了兼容之前的系统,每一个所谓“运行级别”都有对应的软链接指向,默认的启动级别/etc/systemd/system/default.target,根据它的指向能够找到系统要进入到哪一个模式。
  • systemd执行sysinit.target
  • systemd启动multi-user.target下的本机与服务器服务
  • systemd执行multi-user.target下面的/etc/rc.d/rc.local
  • systemd执行multi-user.target下的getty.target及登陆服务

### Centos五、Centos六、Centos7服务启动的区别

Sysvinit技术:按照必定顺序执行——>启动太慢。(Centos5)

Upstart技术:Upstart对rc.sysinit脚本作了大量的优化,缩短了系统初始化的启动时间。(Centos6)

Systemd技术:克服sysvinit固有的缺点,采用并行技术,提升系统的启动速度(RedHat7,CentOS7,Ubuntu15等)

总结和经验

相关文章
相关标签/搜索