centos系列的启动流程及基础知识点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了centos系列的启动流程及基础知识点相关的知识,希望对你有一定的参考价值。

下面介绍的是基于Intel x86架构的CentOS系列操作系统的启动流程。


1、Linux系统基础简介

(1)、Linux【系统组成】:内核+应用程序 或 内核+rootfs

(2)、Linux的【运行环境】:内核空间 --------内核进程占用CPU和内存资源总和

                            用户空间 --------应用程序占用CPU和内存资源总和

(3)、【内核】主要具有6个【功能】:进程管理、文件系统管理、内存管理、网络协议管理、驱动管理、内存功能。

  对于内核,有两种设计:单内核、微内核。单内核,是所有功能聚集于一个程序,表现为一个进程。微内核,是所有功能都有单独的子系统。对于Linux系统,采用的是单内核、模块化设计。


(4)、Linux内核的三部分:内核核心文件、内核对象文件、ramdisk

 Linux的【核心文件】 ----------/boot/vmlinuz

 内核【模块文件】 --------/lib/moduls/2.6.32-573.el6.x86_64/kernel

 ramdisk ------------/boot/initramfs-2.6.32-573.el6.x86_64.img  (其以.img结尾)

   centos5的ramdisk 为 /boot/initrd -----------用mkinitrd 工具生成

   centos6/7的ramdisk 为 /boot/initramfs -------用dacut 工具生成(限于7使用),但也兼容mkinitrd

 ramdisk 是双缓冲和双缓存。


2、CentOS6 操作系统启动流程

(1)、POST加电自检

    加电自检中,运用ROM中的Bios程序。主板上ROM中存储的BIOS程序,被主板芯片映射入内存,从而协助CPU完成。

(2)、Bootsequence启动程序

    据BIOS找启动程序,找第一个引导程序。根据BIOS的启动顺序,一次访问各个存储设备,检查其MBR中是否有引导程序,如果有则将引导程序加载至内存,并且将硬件的管理权移交给引导程序。

(3)、引导加载器BootLoader

    一般使用MBR中的grub,应用grub加载文件系统,grub能提供一个用户菜单,命令行接口交互操作。-----------应用grub legacy。

    引导程序grub,开始加载stage1.5,以驱动根文件系统,然后从根设备加载stage2至内存,stage2的代码将会从同一磁盘分区加载kernel至内存,同时将硬件的管理权移交给kernel

(4)、加载内核kernel ----------------内核核心文件放在【基本分区】上

    对内核进行初始化,加载硬件的驱动程序。

    kernel试图挂载根文件系统,如果其内部有直接编译成内核的文件系统驱动程序,则无需其他辅助直接以只读方式挂载根文件系统即可,否则,必须依赖于ramdisk提供的临时根文件系统作为过渡,待根文件系统驱动成功以后,完成切换的工作,以只读方式挂载真正的文件系统。

(5)、加载根文件系统rootfs -----以只读的方式挂载根文件系统。

    如果没有驱动,借助于ramdisk加载驱动。

(6)、运行用户空间的第一个应用程序: /sbin/init。

  CentOS 6的Init程序为:upstart(基于事务驱动)。

  配置文件:/etc/inittab ----------仅定义默认运行级别

            /etc/init/*.conf --------rcS.conf(系统初始化脚本); rc.conf(运行级别关闭或开启系统服务的任务); start-ttys.conf(终端相关的任务); prefdm.conf(图形界面的任务)。

(7)、设定默认运行级别 ----------/etc/inittab

(8)、系统初始化 ------------/etc/init/*.conf

(9)、并行执行任务:定义ctrl+alt+del热键功能;关闭对应级别下应停止的服务,开启对应级别下应开启的服务;电源管理;dbus管理等。根据运行级别,选择打开的终端数量及位置。

(10)、登录提示符

  使用mingetty命令来调用login命令,来为用户打印登录提示符。



3、CentOS5基础

(1)、CentOS基础

  CentOS5的7个运行级别为0-6,0为关机、6为重启、1为单用户模式、2-5为多用户模式,3为多用户的命令行界面,5为多用户的图形化界面。

  

  查看运行级别:# who -r 或 # runlevel

  切换运行级别:# init 0-6


  CentOS5的第一个引用程序为Init,其配置文件为/etc/inittab。配置文件指明系统初始化的任务

  执行【规定的任务】,格式为:id:runlevels:action:process。 action表示启动此任务,通常为sysinit,一般是运行/etc/rc.d/rc.sysinit脚本。所有由rc脚本关闭或启动的链接文件的源文件都在/etc/rc.d/init.d,该目录创建了链接/etc/init.d。

  在init引导启动用户空间进程时,不需要写在系统服务中的内容,写在/etc/rc.d/rc.local脚本中。


(2)、chkconfig命令

  chkconfig命令 ------------查看和管理系统服务的运行状态。

    # chkconfig --list [name]

    # chkconfig --add name

    # chkconfig --del name

  修改/etc/rc.d/rc#.d/,管理系统服务。例如:# chkconfig: 2345 90 60 (其中,2345为运行级别,90为开启的优先级,60为关闭的优先级。)

  单独制定系统服务开启或关闭:# chkconfig [--level levels] name <on|off|reset>

  在init引导启动用户空间进程时,不需要写在系统服务中的内容,写在/etc/rc.d/rc.local脚本中。


(3)CentOS5操作系统的启动流程

    1)、POST加电自检

      加电自检中,运用ROM中的BIOS程序。主板上ROM中存储的BIOS程序,被主板芯片映射入内存,从而协助CPU完成。

    2)、Bootsequence启动程序

      据BIOS找启动程序,找第一个引导程序。根据BIOS的启动顺序,一次访问各个存储设备,检查其MBR中是否有引导程序,如果有则将引导程序加载至内存,并且将硬件的管理权移交给引导程序。

    3)、引导加载器BootLoader

      一般使用MBR中的grub,应用grub加载文件系统,grub能提供一个用户菜单,命令行接口交互操作。-----------应用grub legacy。

      引导程序grub,开始加载stage1.5,以驱动根文件系统,然后从根设备加载stage2至内存,stage2的代码将会从同一磁盘分区加载kernel至内存,同时将硬件的管理权移交给kernel

    4)、加载内核kernel ----------------内核核心文件放在【基本分区】上

      对内核进行初始化,加载硬件的驱动程序。

      kernel试图挂载根文件系统,如果其内部有直接编译成内核的文件系统驱动程序,则无需其他辅助直接以只读方式挂载根文件系统即可,否则,必须依赖于ramdisk提供的临时根文件系统作为过渡,待根文件系统驱动成功以后,完成切换的工作,以只读方式挂载真正的文件系统。

    5)、加载根文件系统rootfs -----以只读的方式挂载根文件系统。

      如果没有驱动,借助于ramdisk加载驱动。

    6)、运行用户空间的第一个应用程序: /sbin/init。

      kernel试图启动第一个进程:/sbin/init,而后kernel转入后台,将用户空间的进程管理任务交给init进程来完成

      配置文件:/etc/inittab  /etc/init/*.conf  /etc/rc.d/rc.sysinit  /etc/rc.d/rc

    7)、执行/sbin/init 和 /etc/inittab文件

    8)、设置默认的运行级别

    9)、执行/etc/rc.d/rc.sysinit脚本,完成系统初始化

    10)、执行/etc/rc.d/rc脚本,关闭对应级别下应停止的服务,开启对应级别下应开启的服务

    11)、设置热键,如:Ctrl+Alt+Del热键功能

    12)、UPS电源的失效与恢复

    13)、生成终端,默认启动图形界面。


4、Bootloader

 grub通用统一加载器有两种,即grub legacy和grub2。

 grub legacy分为三个阶段,分别是第一阶段、第二阶段和中间的1.5阶段。中间阶段的作用是,让第一阶段的引导程序识别第二阶段分区的文件系统。stage2提供了很多功能,其中最重要的是加载操作系统的内核核心文件,还可以提供菜单和交互接口、允许用户编辑菜单、命令行操作模式、具身份验证机制。

 

 grub命令行常用的6个命令如下:

  1)、help:获得grub命令的名称列表

  2)、help GRUB_CMD:特定命令的详细帮助信息

  3)、root (hd#,#):指定grub程序的根设备(磁盘的指定分区)。hd# 为磁盘编号,# 为分区编号,# 一般是从0开始的数字,如0表示第一个分区,如 (hd0,0),表示当前计算机上的第一块磁盘的第一个分区。

  4)、find (hd#,#):指定分区中搜索文件,显示出文件所在的位置

  5)、kernel /PATH/TO/KERNEL_CORE_FILE:本次启动的内核文件的绝对路径。额外内核参数:ro root=/dev/sda3 selinux=0 init=/sbin/init quiet rhgb {1|s|S|single}

  6)、initrd /PATH/TO/initramfs-VERSION-release.img:内核所对应的ramdisk(ramfs)文件


 grub的配置文件为 /boot/grub/grub.conf 和 /etc/grub.conf(链接)。配置文件里的内容如下:

   default=0 ------默认启动菜单项,title是从0开始编号

   timeout=5 ------倒计时

   splashimage=(hd0,0)/grub/splash.xpm.gz -----图片背景

   hiddenmenu ------------(是否)隐藏grub的启动菜单

   password --md5 CRYPTED_PASSWORD ------------菜单的保护密码

   title CentOS 6 (2.6.32-573.el6.x86_64) ------菜单标题,可多个title

     root (hd0,0)

     kernel /vmlinuz-2.6.32-573.el6.x86_64 ro root=UUID=5ebb0e76-bb19-4a80-9c70-0d101c0778e1 nomodeset rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet

     initrd /initramfs-2.6.32-573.el6.x86_64.img

     password --md5 CRYPTED_PASSWORD


5、CentSO7 操作系统启动流程

(1)、POST加电自检

    加电自检中,运用ROM中的BIOS程序。主板上ROM中存储的BIOS程序,被主板芯片映射入内存,从而协助CPU完成。

(2)、Bootsequence启动程序

    据BIOS找启动程序,找第一个引导程序。根据BIOS的启动顺序,一次访问各个存储设备,检查其MBR中是否有引导程序,如果有则将引导程序加载至内存,并且将硬件的管理权移交给引导程序。

(3)、引导加载器BootLoader

  一般使用MBR中的grub2,应用grub2加载文件系统,grub2能提供一个用户菜单,命令行接口交互操作。

(4)、装载引导程序的配置文件:/etc/grub.d /etc/default/grub /boot/grub2/grub.cfg

(5)、加载initramfs驱动模块

(6)、加载内核kernel ----------------内核核心文件放在【基本分区】上

  对内核进行初始化,加载硬件的驱动程序。

(7)、内核以只读方式挂载rootfs,启动systemd进程。

(8)、执行initrd.*.target所有的unit,包括挂载/etc/fstab所有有效的文件系统

(9)、根切换

(10)、systemd执行默认的target



6、centos7基础

 centos7的init程序采用systemd风格,systemctl命令,使用兼容以前的版本,所以也可以使用service类的命令。

Systemd具有许多centos6里面没有的四个特点:(1)、并行开启,即在系统引导的时候可以实现服务的并行开启;(2)、按需激活,即能够实现按需激活进程,即在系统启动时,需要随系统启动服务,其服务进程并没有启动,但是Ststemd为每一个此类服务进程都注册了套接字,我们称这种服务处理方式为“半激活状态”。(3)、快照功能,即能够对当前系统的用户空间的每个进程进行状态快照,以后如果进程出现问题或故障,可以迅速恢复进程状态至过去的某一时候。(4)、服务控制逻辑,systemd内部有一种基于基于依赖关系来定义的服务控制逻辑。

  # systemctl {start|stop|restart|status} name[.service] ----------管理服务

  # systemctl set-default {multi-user.target | graphical.target} ----------设置运行级别

  # systemctl get-default  -----------设置默认运行级别

  # systemctl set-default muti-user.target  ------改回命令行界面


 centos7采用unit文件进行核心管理,由Systemd相关的配置文件进行各种标识、识别、和配置功能的实现。unit文件分为    系统服务类、socket、目标类、快照类等几类。这些配置文件主要保存在以下三个文件中:

    /etc/lib/systemd/system/*

    /etc/systemd/system/* ---------符号链接

    /run/systemd/system/* ---------非配置关键项

 unit常见的8种类型如下:

    Service unit:扩展名为.service ----------用于定义系统服务,可省

    Target unit:扩展名为.target ------------init程序的运行级别

    Decvice unit:扩展名为.device --------内核识别的设备

    Mount unit:扩展名为.mount ------------systemd管理的文件系统的挂载点

    automount unit:扩展名为.automount --------------挂载点的位置

    Socket:扩展名为.socket -------------标识进程间通信的socket文件

    Swap unit:扩展名为.swap ------------标识swap设备

    Path unit:扩展名为.path ------------监控指定目录中的一个文件或一个子目录,没有则自动创建。

 target unit模拟6中的运行级别:

    级别0:runlevel0.target,poweroff.target

    级别1:runlevel1.target,rescue.target

    级别2:runlevel2.target,multi-user.target:

    级别3:runlevel3.target,multi-user.target

    级别4:runlevel4.target,multi-user.target

 systemd的四种实现方式如下:

    (1)、基于socket unit的方式实现进程激活机制

    (2)、基于device unit的方式实现设备的自动识别,挂载

    (3)、基于bus的激活机制

    (4)、基于path的激活机制

 

 如果自行编写unit file,可以直接将文件放置于/etc/systemd/syetem目录中,也可以将其放在/usr/lib/systemd/system/目录中。unit file通常分为三段,分别为 [Unit]、[Service]、[Install],各部分解释如下:

    (1)、[Unit]:定义域Unit类型无关的通用选项。

    常用的选项语句:

      Description ------相关服务描述

      After -------服务启动前依赖的内容

      before ------------依赖此服务启动的服务

      Wants --------指明依赖关系

      Requires -----------指明依赖关系

      Conflict -----------各unit之间可能存在的冲突

      Documentation ---------------管理命令的文档所在位置

    (2)、[Service]:定义与系统服务相关的专用的选项语句。

    常用的选项语句:

      Type ----------定义影响ExecStart及相关参数的功能:simple、forking、oneshot、notify

      EnvironmentFile ------------------环境配置文件

      ExecStart ----------启动此服务所需要运行的命令或脚本

      ExecReload -------------指明重载配置文件所需要运行的命令或脚本

      ExecStop --------------指明停止此服务所需要运行的命令或脚本

      ExecStartPre -----------指明启动ExecStart所指明的命令【之前】所需要运行的命令或脚本

      ExecStartPost -----------指明启动ExecStart所指明的命令【之后】所需要运行的命令或脚本

      Restart ------------表示如果服务遇到意外而终止,则会自动重启该服务

    (3)、[Install]:服务启动或禁用时用到的专用选项语句

      WantedBy ------弱依赖关系

      RequiredBy ---------强依赖关系 


systemctl命令 ---------------控制系统和服务管理

 以下是centos6和centos7实现相同功能,所使用的不同的命令行,及其区别:

 (1)、启动:

    centos6:service NAME start 

    centos7:systemctl start NMAE[.service]

 (2)、停止:

    centos6:service NAME stop

    centos7:systemctl stop NMAE[.service]

 (3)、重启:

    centos6:service NAME restart

    centos7:systemctl restart NMAE[.service]

 (4)、状态:

    centos6:service NAME status

    centos7:systemctl status NMAE[.service]

 (5)、服务开机自启:

    centos6:chkconfig --level runlevels NAME on

    centos7:systemctl enable NAME.service

 (6)、禁止服务的开机自启:

    centos6:chkconfig --level runlevels NAME off

    centos7:systemctl disable NAME.service

 (7)、查看是否开机自启:

    centos6:chkconfig --list NAME

    centos7:systemctl is-enabled NAME.service

 (8)、条件式重启:

    centos6:service NAME condrestart

    centos7:systemctl try-restart NAME.service

 (9)、重载或重启:

    systemctl reload-or-restart NAME.service

 (10)、重载或条件式重启:

    systemctl reload-or-try-restart NAME.service

 (11)、查看是否激活

    systemctl is-active NAME.service

 (12)、查看所有激活:

    systemctl list-units 

    systemctl list-units --type=NUIT_TYPE:查看指定unit类型的处于活跃状态的服务

    systemctl list-units --all:显示所有包括处于活跃状态和处于非活跃状态的各服务

 (13)、查看服务的依赖关系:

    systemctl list-dependencies NAME.service

 (14)、禁止开机自启:

    systemctl mask NAME.service

 (15)、取消禁止的开机自启:

    systemctl unmask NAME.service、

 (16)、运行级别之间的切换:

    centos6:init # 

    centos7:systemctl isolate NAME.target

 (17)、查看运行级别:

    centos6:runlevel :

    centos7:systemctl list-units --type=target --all

             systemctl get-default

 (18)、修改默认运行级别:

    systemctl set-default NAME.target


  # systemctl halt,systemctl poweroff ------关机

  # systemctl reboot ------重启

  # systemctl suspend ------挂起

  # systemctl hibernate --------休眠

  # systemctl hybrid-sleep ----------挂起并休眠


以上是关于centos系列的启动流程及基础知识点的主要内容,如果未能解决你的问题,请参考以下文章

Docker重学系列之基础知识回顾

CentOS 6 启动流程

开机启动及grub基础知识和光盘镜像制作

线程基础知识系列(五)认识volatile

线程基础知识系列(三)线程的同步

redis系列之基础知识与centos下环境搭建