系统启动流程相关概念

前言:

了解系统内核基本知识

  • 内核功能:进程管理、内存管理、网络协议栈、文件系统、驱动程序、安全功能等 

    • 用户空间:应用程序其中有进程或者线程

    • 运行中的系统可分为两层:内核空间用户空间 

  • 内核设计流派: 

    • 单内核设计:把每种功能集成于一个程序中;例如:linux

    • 微内核设计:每种功能使用一个单独的子系统实现;例如:WindowsSolaris

linux内核的特点: 
支持模块化:.ko(kernel object) 
支持模块运行时动态装载和卸载; 

其中linux内核的组成部分: 
核心文件:/boot/vmlinuz-VERSION-release 
ramdisk: 
centos5:/boot/initrd-VERSION-release.img 
centos6和7:/boot/initramfs-VERSION-release.img 
模块文件:/lib/modules/VERSION-release

系统启动流程

  • 简单描述:

    系统初始化流程: 
    内核级别: POST–>Bootsequence(BIOS)–>Bootloader(MBR)–>kernel(ramdisk)–>rootfs(readonly)–>/sbin/init(/etc/inittab) 
    用户级别: 设置默认运行级别–>运行系统初始化脚本,完成系统初始化rc.sysinit–>关闭对应级别下面要停止的服务,启动对应级别下面要开启的服务–>设置登录终端–>[]启动图像终端]

  • 详细介绍:

    POST:开机自检<加电自检>完成对硬件的检测;是BIOS功能的一个主要部分,负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测;如某些硬件出现错误无法通过检测就导致系统无法启动,POST完成之后将被清出内存;

    Bootsequence(BIOS):按次序查找引导设备,第一个有引导程序的设备就是本次启动用到的设备。进行设备的枚举和初始化,按CMOS的设置所有处于活动状态并且可引导的设备(floppy、CD-ROM、USB、DISK、NFS),加载主引导记录(MBR)到内存中,然后BIOS将控制权给下一步BOOTLOADERBOOTLOADER(MBR):引导加载器,程序;MBR前446bytes; 
    功能:提供一个菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开;而后把系统控制权移交给内核;

    kernel 内核自身初始化
    启动init进程

    init 以守护进程方式存在,是所有其他进程的祖先(PID=1),init 进程非常独特,能够完成其他进程无法完成的任务。 
    程序类型: 
    CentOS5-sysv init 
    配置文件:/etc/inittab 
    CentOS6:upstart(并发启动) 
    配置文件:/etc/inittab/etc/init/*.conf 
    CentOS7systemd 
    配置文件:/usr/lib/systemd/system/ /etc/systemd/system/*

    • 系统进入runlevel

    • 运行系统初始化脚本/etc/rc.d/rc.sysinit

    • 运行指定运行级别对应的目录下的脚本,/etc/rc.d/rc#.d/目录下的服务脚本

    • 捕获组合键的定义

    • 定义电源 fail/restore脚本

    • 启动 getty 和虚拟控制台

    • 用户级别:init通过读取/etc/inittab文件来完成系统初始化过程: 

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

    • 加载设备驱动程序(有可能会借助ramdisk加载驱动);

    • 以只读方式挂载根文件系统;

    • 运行用户空间的第一个应用程序:/sbin/init 

    • LILO:LInux LOader (无法支持大硬盘分区)

    • GRUB 0.X:[centos5,6] grub legacy (经典),各种安卓手机使用 ;

    • GRUB 1.X:[centos7] grub2 

    • Windows:ntloader,仅是启动OS

    • Linux: 

  • linux内核特征之一:使用缓冲和缓存来加速对磁盘上的文件进行访问;

    • ramdisk-(磁盘)转换成ramfs(文件系统),提高速度;

    • centos5 :initrd,工具程序:mkinitrd

    • centos6,7initramfs,工具程序:dracutmkinitrd


工作原理介绍:

MBR(master boot record)主引导记录

MBR共有512bytes,其中446bytes为主引导记录bootloader,另外的64bytes为分区表fat,其中包含4个分区表记录,以16bytes为一个分区划分记录,最后2bytesMBR的有效性检测55AA

GRUB(bootloader)

grub:Grub unified bootloadergrub向用户提供了更好的开机体验,加入了开机的菜单、开机图片等更多的功能,而这种功能bootloader不能提供,grub分为三个阶段(grub legacy):

  • 一阶段: primary boot loader1st stage 分区引导加载 
    功能:此阶段在bootloader中,bootloader不在直接加载内核,而是加载grub的第二阶段;bootloader备份在了/boot/grub/stage1

  • 二阶段:paritionfilesystem driver1.5stage 文件系统接口。功用:提供文件系统驱动,方便虚拟系统的生成,让stage1中的bootloader能识别stage2所在分区上的文件系统;

  • 三阶段:partition /boot/grub2nd stage,分区文件,不支持复杂逻辑软raid等,仅支持基本分区(内核文件只能放在基本磁盘分区上),通过读取 /etc/grub.conf 文件,显示出内核列表,指定了内核镜像和 initrd所在的分区为root,设定内核参数,并加载vmlinuzinitramfs这两个文件到内存中。在这一阶段可以编辑启动项目。如指定根分区root,内核kernelinitrd镜像等;也可以进入grub command line手动写启动信息。 
    功用:1、提供菜单、并提供交互式接口;[e:编辑模式,用于编辑菜单;c:命令接口];2、加载用户选择的内核或操作系统允许传递参数给内核,可隐藏此菜单;3、为菜单提供保护机制,为编辑菜单进行认证,为启动内核或操作系统进行认证;

GRUB管理开机启动的过程分成了三个阶段.。tage1主要负责BIOSGRUB之间的交接。这部分才是真正放在MBR中的bootloader。而后stage1.5是连接stage1stage2之间的通道,起着过渡的作用。最后才是GRUB中真正核心的部分stage2,它可以让用户以选项的方式将操作系统加载、修改选项和内核参数。

kernel工作方式:

工作原理:当内核映像被加载到内存中,并且stage2 的引导加载程序释放控制权之后,内核阶段就开始了,内核在完成自身的初始化之后进行探测可识别的所有硬件设备,由于内核中只包含了少量的硬件驱动,此时会借助内存中的initrd根文件系统加载相关驱动程序。当内核具备访问根文件系统功能时(rootfs),initrd根文件系统将被卸载,并挂载真正的根文件系统。这就是内核的初始化过程,系统已经脱离了 /boot 分区,独立存活在内存中。

  • vmlinuz-xxx内核镜像是一个 zImage(压缩映像,小于 512KB)或一个 bzImage(较大的压缩映像,大于 512KB),它是使用zlib 进行压缩过的内核文件。

  • initramfs-xxx.img是由stage2 引导加载程序加载到内存中的,它会被复制到 RAM 中并挂载到系统上。这个 initrd 会作为 RAM 中的临时根文件系统使用,并允许内核在没有挂载任何物理磁盘的情况下完整地实现引导。initrd文件包括可加载模块的驱动程序,为内核提供可访问磁盘和磁盘上的文件系统的接口,并为其他硬件提供了驱动程序。由于根文件系统是磁盘上的一个文件系统,因此内核通过initrd取得根分区的访问,并挂载真正的根文件系统。这是一个解包的initramfs镜像文件。


用户级别启动

  • 首先系统通过读取/etc/inittab文件来完成系统的初始化过程;

  • inittab文件 

inittab文件表示的为系统init初始化程序用到的配置文件。这个文件负责设置init初始化程序初始化脚本在哪里;每个运行级初始化时运行的命令; 开机、关机、重启对应的命令;各运行级登陆时所运行的命令。 
inittab文件中,每一行定义一种action以及与之对应的process. 

  • 基本格式idrunlevelsactionprocess 

  • ID:一个任务的标识符; 

  • runlevels:在哪些级别启动此任务;#,###,也可以为空,表示所有级别; 

  • action:在什么条件下启动此任务; 

  • process:执行的任务;

runlevel :Sysvinit 读取 /etc/inittab 文件中是否含有 initdefault’项,有则init 将启动默认运行的模式。如果没有默认的运行模式,将进入系统控制台,手动决定进入何种运行模式。

  • 一共有7个(0-6)运行级别: 
    0:关机,shutdown; 
    1:单用户模式(singler user),root用户无须认证,此为维护模式; 
    2:多用户模式(multi user),会启动网络功能,但不会启动NFS,维护模式; 
    3:多用户模式(Full multiuser mode),完全功能模式,文本界面; 
    4:预留级别:目前无特别适合目的,但习惯以同3级别功能使用; 
    5:多用户模式(multi user),完全功能,图形界面; 
    6:重启,reboot; 
    其中默认级别35 
    级别切换:init命令 
    级别查看:who -rrunlevel

  • 其中ACTION常见的有4中动作: 
    1、wait:等待切换至此任务所在的级别时执行一次; 
    2、respawn:一旦此任务终止,就自动重新启动之; 
    3、initdefault:设定默认运行级别; 
    4、sysinit:设定系统初始化方式,此处一般指定/etc/rc.d/rc.sysinit

系统初始化脚本:/etc/rc.d/rc.sysinit

此文件初始化过程中主要功用:

  1. 设置主机名

  2. 设置欢迎信息

  3. 激活UDEVSELINUX

  4. 挂载/etc/fstab文件中定义的所有文件系统

  5. 检测根文件系统,并以读写方式重新挂载根文件系统

  6. 设置系统时钟

  7. 根据/etc/sysctl.conf文件的设置,来设置内核参数

  8. 激活lvm软raid设备

  9. 激活swap设备(此操作在fstab中以执行)

  10. 加载额外设备的驱动文件

  11. 清理操作(过去的lockpid文件)

/etc/rc.d/rc 和/etc/rc.d/rc#.d/ 介绍

  1. rc是个脚本,后面接参数。如: 
    l5:5:wait:/etc/rc.d/rc 5 
    wait意味着init系统将等待rc启动服务脚本 
    i0:0:wait:/etc/rc.d/rc3 
    意味着去启动或关闭/etc/rc.d/rc3.d/目录下的服务脚本所控制服务

  2. rc 根据 runlevel 执行rc#.d目录下启动脚本。每个 runlevel 都有一个对应的 rc#.d 目录; 
    其中在这些目录下存放着很多不同的脚本,文件名以 S 开头的脚本表示在当前runlevel中启动,K开头的脚本表示不在当前runlevel中启动; 
    K*:要启动的服务;K##*,优先级,数字越小,越先关闭;依赖的服务先关闭,而后关闭被依赖的; 
    S*:要启动的服务;S##*,优先级,数字越小,越是优先启动;被依赖的服务先启动,而依赖的服务后启动;

  3. /etc/rc.d/rc#.d 目录下的脚本其实都是一些软链接文件,真实的脚本文件存放在/etc/init.d目录下,也就是说在/etc/init.d目录下的文件会自动以S##scriptK##script的软链接存在于各 runlevel 的目录下

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

init在等待/etc/rc.d/rc执行完毕之后,将在指定的各个虚拟终端上运行/sbin/mingetty,等待用户的登录。 至此,Linux的启动完成
  • tty1:2345:respawn:/usr/sbin/mingetty tty1 
    … 
    tty6:2345:respawn:/usr/sbin/mingetty tty6 
    注意: 
    1、mingetty调用login程序; 
    2、打开虚拟终端的程序出了mingetty之外,还有诸多getty等;


命令行中的操作:

gurb的命令行接口操作

help:获取帮助列表 
help KEYWORD:获取详细帮助信息 
find (hd#,#) /path/to/somefile 
root (hd#,#) 
kernel /path/to/kernel_file:设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的cmdline参数 
例如: 
init=/path/toinitselinux=0 
initrd:/path/to/initramfs_file:设定为选定的内核提供额外文件的ramdisk; 
boot:引导启动选定的内核;

  • 如何识别设备: 
    (hd#,#) 
    hd#:磁盘编号,用数字标示:从0开始编号 
    #:分区编号,用数字标示;从0开始编号 

手动在grub命令行接口启动系统: 
grub> root(hd#,#) 
grub> kernel /vmlinuxz-VERSION-RELEASE ro root/dev/DEVICE 
grub> initrd /initramfs-VERSION-release.img 
grub> boot


在配置文件中操作: 
配置文件:/boot/grub/grub.conf 
配置项: 
default=#:设定默认启动的菜单项:菜单项(title)编号从0开始 
timeout=#:指定菜单项等待选项选择的时长; 
splashimage=(hd#,#)/PATH/TO/XPAM_PIX_FILE:指明菜单背景图片文件路径; 
hiddenmenu:隐藏菜单; 
password [--md5] STRING:菜单编辑认证; 
title TITLE:定义菜单项”标题”,可出现多次; 
root(hd#,#):grub查找stage2kernel文件所在设备分区;为grub的”” 
kernel /PATH/TOVMLINUZ_FILE [PARAMETERS]:启动的内核 
initrd /PATH/TO/INITRAMFS_FILE:内核匹配的ramfs文件; 
password [--md5] STRING:启动选定的内核或操作系统时进行认证;(grub-md5-crypt)

进入单用户模式:
  1. 编辑grub菜单(选定要编辑的title,而后使用e命令);

  2. 在选定的kernel后附加

  3. sSsingle都可以

  4. kernel所在行,键入b命令

安装grub

  1. 在系统中安装: 
    grub-install 
    grub-install --root-directory=ROOT /dev/DISK

  2. 在grub表中安装: 
    grub 
    grub> root (hd#,#) 
    grub> setup (hd#)

原创文章,作者:N22-白蚁,如若转载,请注明出处:/47130

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班

友情链接:万达直属  guoqibee.com  万达娱乐直属  万达娱乐主管QQ  万达开户  万达娱乐主管QQ  万达注册  万达娱乐直属  万达主管