当前位置: 澳门新濠3559 > 操作系统 > 正文

首先系统会启动POST程序来对内部的各个配件进行

时间:2019-11-08 15:11来源:操作系统
今天,我们主要来谈谈计算机系统的启动流程 Linux启动过程 简述linux操作系统启动流程 以CentOS 5、6为例 系统启动流程大体可以表示为POST加电自检--BIOS根据其中的启动顺序--MBR设备的b

今天,我们主要来谈谈计算机系统的启动流程

Linux启动过程

简述linux操作系统启动流程

以CentOS 5、6为例
系统启动流程大体可以表示为POST加电自检-->BIOS根据其中的启动顺序-->MBR设备的bootloader(GRUB)-->启动Kernel(中间可能需要借助ramdisk加载根文件系统并进行rootfs转换)-->Init-->Runlevel关闭和启动对应的服务进程。
上述过程从Init开始就是用户空间的启动操作了,CentOS 5、6、7的Init启动机制有所不同,所以Init的启动过程会有所区别:
CentOS 5:systemV
CentOS 6:Upstart
CentOS 7:systemd
下面的过程以systemV的Init机制为基础:

澳门新濠3559 1

CentOS_boot.png

  1. BIOS
    BIOS(Basic Input/Output System),基本输入输出系统,该系统存储于主板的ROM芯片上,计算机在开机时,会最先读取该系统,然后会有一个加电自检过程,这个过程其实就是检查CPU和内存,计算机最基本的组成单元(控制器、运算器和存储器),还会检查其他硬件,若没有异常就开始加载BIOS程序到内存当中。BIOS主要的一个功能就是存储了磁盘的启动顺序,BIOS会按照启动顺序去查找第一个磁盘头的MBR信息,并加载和执行MBR中的Bootloader程序,若第一个磁盘不存在MBR,则会继续查找第二个磁盘(PS:启动顺序可以在BIOS的界面中进行设置),一旦BootLoader程序被检测并加载内存中,BIOS就将控制权交接给了BootLoader程序。

  2. MBR
    MBR(Master Boot Record),主引导记录,MBR存储于磁盘的头部,大小为512bytes,其中,446bytes用于存储BootLoader程序,64bytes用于存储分区表信息,最后2bytes(魔术字)用于MBR的有效性检查。

  3. GRUB
    Grand Unified Bootloader,多系统启动程序,其执行过程可分为三个步骤:

  • Stage1:这个其实就是MBR中的启动引导程序,由于只有446字节不能实现复杂的功能,它的主要工作就是查找并加载第二段Bootloader程序(stage2),但系统在没启动时,MBR根本找不到文件系统,也就找不到stage2所存放的位置,因此,就有了stage1_5
  • 首先系统会启动POST程序来对内部的各个配件进行自检澳门新濠3559,先通过一张图来简单了解下整个系统启动的流程。Stage1_5:安装在MBR之后的磁盘扇区,该步骤就是为了识别文件系统,进而可以进入stage2
  • Stage2:GRUB程序会根据/boot/grub/grub.conf文件查找Kernel的信息,然后开始加载Kernel程序,当Kernel程序被检测并在加载到内存中,GRUB就将控制权交接给了Kernel程序。
    PS:实际上这个步骤/boot还没被挂载,GRUB直接识别grub所在磁盘的文件系统。
  1. Kernel
    内核,Kernel是Linux系统最主要的程序,实际上,Kernel的文件很小,只保留了最基本的模块,并以压缩的文件形式存储在硬盘中,当GRUB将Kernel读进内存,内存开始解压缩内核文件。
  • 讲内核启动,应该先讲下initrd这个文件:
    initrd(Initial RAM Disk),它在stage2这个步骤就被拷贝到了内存中,这个文件是在安装系统时产生的,是一个临时的根文件系统(rootfs)。因为Kernel为了精简,只保留了最基本的模块,因此,Kernel上并没有各种硬件的驱动程序,也就无法识rootfs所在的设备,故产生了initrd这个文件,该文件装载了必要的驱动模块,当Kernel启动时,可以从initrd文件中装载驱动模块,直到挂载真正的rootfs,然后将initrd从内存中移除。
  • Kernel会以只读方式挂载根文件系统,当根文件系统被挂载后,开始装载第一个进程(用户空间的进程),执行/sbin/init,之后就将控制权交接给了init程序。
  1. Init
    该程序就是进行OS初始化操作,实际上是根据/etc/inittab(定义了系统默认运行级别)设定的动作进行脚本的执行,第一个被执行的脚本为/etc/rc.d/rc.sysinit,这个是真正的OS初始化脚本,这个脚本的任务有:
  • 激活udev和selinux;
  • 根据/etc/sysctl.conf文件,来设定内核参数;
  • 设定系统时钟;
  • 装载硬盘映射;
  • 启用交换分区;
  • 设置主机名;
  • 根文件系统检测,并以读写方式重新挂载根文件系统;
  • 激活RAID和LVM设备;
  • 启用磁盘配额;
  • 根据/etc/fstab,检查并挂载其他文件系统;
  • 清理过期的锁和PID文件
    上述都执行完后,根据配置的启动级别,执行对应目录底下的脚本,最后执行/etc/rc.d/rc.local这个脚本(所以很多自定义的启动脚本可以写入这个文件中),至此,系统启动完成。
    关于init程序的配置文件路径,除了/etc/inittab外,还有/etc/init/*.conf,及/usr/lib/systemd/system/(CentOS7)。
  1. Runlevel
    运行级别,不同的级别会启动的服务不一样,init会根据定义的级别去执行相应目录下的脚本,Linux的启动级别分为以下几种
  0:关机模式

  1:单一用户模式(直接以管理员身份进入)

  2:多用户模式(无网络)

  3:多用户模式(命令行)

  4:保留

  5:多用户模式(图形界面)

  6:重启

在不同的运行级别下,/etc/rc.d/rc这个脚本会分别执行不同目录下的脚本

Run level 0 – /etc/rc.d/rc0.d/
Run level 1 – /etc/rc.d/rc1.d/
Run level 2 – /etc/rc.d/rc2.d/
Run level 3 – /etc/rc.d/rc3.d/
Run level 4 – /etc/rc.d/rc4.d/
Run level 5 – /etc/rc.d/rc5.d/
Run level 6 – /etc/rc.d/rc6.d/

这些目录下的脚本只有K*和S*开头的文件,K开头的文件为开机需要执行关闭的服务,S开头的文件为开机需要执行开启的服务。

前言

一个正常的Linux系统通常俩说开关机的机会不多,但是如果能够清楚了解linux系统开机的流程,对于系统维护来说是有益无害的,与此同时也能加深对Linux系统的了解。

下图为Centos 6 Linux系统启动的大体流程,可以概括为:POST加电-->BIOS-->GRUB-->kernel-->init 五个阶段。

澳门新濠3559 2

Linux系统启动流程

 

 

简述grub启动引导程序配置及命令行接口详解

POST加电自检

Linux系统在接通电源后,首先系统会启动POST程序来对内部的各个配件进行自检,若自检过程中发现错误,则有可能出现下述两种情况:若出现的错误为严重错误,则系统会停机,无法开启;若出现的错误为非严重错误,则系统会发出报警提示或声音报警,用户可根据相关提示判断错误的类型。

1、BIOS启动

前言:

grub启动引导程序配置

grub的配置文件/boot/grub/grub.conf,该配置文件的信息如下:

    grub.conf: 

    #boot=/dev/sda

    default=0        #设定默认启动的title的编号,从0开始

    timeout=5       #等待用户选择的超时时间

    splashimage=(hd0,0)/boot/grub/splash.xpm.gz    #GRUB的背景图片

    hiddenmenu     #隐藏菜单

    title CentOS (2.6.18-194.el5PAE)      #内核标题

        root (hd0,0)         #内核所在的设备hd表示硬盘,第一个0是硬盘号,第二个0是分区号

        kernel /vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/     #内核文件路径以及传递给内核的参数

        initrd /initrd-2.6.18-194.el5PAE.img                            #ramdisk文件路径

BIOS

加电自检完后,系统启动进入了BIOS阶段。在此阶段系统会启动Boot Sequence来查找各引导设备,当查找到第一个有引导程序的设备时,该设备即为本次启动要用到的设备。随后BIOS会读取该引导设备中的MBR来进行系统启动的下一阶段。MBR表通常为硬盘的第一个扇区,大小为512字节,其中前446个字节为bootloader,其后紧跟的64个字节为分区表,剩下两个字节为结束标识。

BIOS是写入到主板上的一个韧体(韧体就是写入到硬件上的一个软件程序)。开机的时候,BIOS是计算机系统会主动执行的第一个程序。BIOS主要的一个功能就是存储了磁盘的启动顺序,它会按照启动顺序去读取能够开机的硬盘的第一个扇区的MBR信息

  Linux是一种自由和开放源代码的类UNIX操作系统。该操作系统的内核由林纳斯·托瓦兹在1991年10月5日首次发布。在加上用户空间的应用程序之后,成为Linux操作系统。Linux是自由软件和开放源代码软件发展中最著名的例子。

grub 命令行用法

  1. 进入GRUB的命令行模式
    开机后grub引导菜单

    澳门新濠3559 3

    grub1.png

  • 输入c即可进入grub命令行模式
grub>
  • 输入e可对进入选定的菜单项的编辑

    澳门新濠3559 4

    grub2.png

  1. 获取GRUB命令行帮助
    在grub>提示符的后面输入help
grub> help


如果需要得到某个指令的帮助,就在 help 后加空格跟指令,比如:
grub>help kernel
  1. cat查看文件内容
    有时我们不知道Linux的/boot分区,以及/ 根分区所在的位置,要查看/etc/fstab的内容来得知,这时,我们就要用到cat (hd[0-n],y)/etc/fstab 来获得这些内容,注意要灵活使用tab键命令补齐的功能
grub> cat (hd0,  #输入hd0,然后再按tab键会跳出hd0有的分区
grub> cat (hd0,2)/etc/fstab  #显示所在分区的/etc/fstab文件信息
  1. root (hd[0-n,y) 指令来指定/boot所在的分区
比如我们确认/boot在(hd0,0)
grub> root (hd0,0)
  1. kernel 指令,用来指定Linux的内核,及/所在的分区
  • 如果我们已经通过root (hd[0-n],y) 指定了/boot所在的分区,语法有两个:
    • 如果/boot和Linux的/位于同一个分区,应该是下面的一种格式;
grub> kernel /boot/vmlinuz在这里按tab键来补齐,就看到内核全称了 ro root=根所在的路径
    • 如果/boot有自己独立的分区,应该是;
grub> kernel /vmlinuz在这里按tab键来补齐,就看到内核全称了 ro root=根所在的路径
例如
grub> kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=[fstab文件中查询到的root所在的挂载UUID]
  1. initrd 命令行来指定initrd文件
grub> initrd /boot/initr  #在这里tab来补齐有可能是initrd,也可能是initramfs
grub> initrd /boot/initrmfs-2.6.32-696.el6.x86_64.img

如果/boot是独立的一个分区
grub> initrd /initr  #在这里tab来补齐
grub> initrd /initrmfs-2.6.32-696.el6.x86_64.img
  1. boot命令来引导系统
grub>boot
  1. grub的保护机制
    grub可以通过设置密码来保护配置文件不被轻易的修改,方法为:
  • 在配置文件的title之上添加 password --md5 md5生成的密码 (用于启动时保护配置文件编辑)
  • 在配置文件的某个title之内添加password --md5 md5生成的密码 (用于保护此项内核不被轻易启动 或编辑)
  • 生成md5密码的命令:grub-md5-crypt
  1. grub-install重建grub
重建grub到第一硬盘mbr
grub-install /dev/sda
  1. grub救援模式
    如果系统无法启动,利用CentOS安装光盘进入Rescue installed system救援模式
进入命令行后,使用命令
#chroot /mnt/sysimage #挂载原系统的根,此路径在进入救援模式后有提示
挂载根后即可进行各种命令行操作了,例如重装grub
#grub-install /dev/sda

GRUB

在BIOS读取了MBR后,系统就来到了GRUB启动引导阶段。其实Linux还有一个启动工具叫LILO,但是其全面性和灵活性都不及grub,还容易因为配置的失误导致MBR错误。GRUB引导阶段大致分为三个阶段:
1、1st stage:启动Boot loader来加载2nd stage的内容至内存中。
2、1.5 stage:位于MBR的分区表中,能够识别出2nd stage所在的分区上的文件系统。
3、2nd stage :读取配置文件/etc/grub/grub.conf,该文件为grub启动提供了菜单及加载的kernel位置,当kernel被成功加载到内存中的时候,系统进入到kernel启动阶段。

2、读取MBR

  接触Linux的时间也不算短了,一直都是直接使用Linux操作系统进行一些工作,很少去了解系统从开机到能使用的整个过程,感觉有需要好好理解下整个系统的启动过程,故写这篇博客加深一下理解。

实现kickstart文件制作与光盘镜像制作

kernel

当系统启动来到了kernel阶段,kernel为Linux系统的核心程序。进入kernel阶段后,系统会先探测可识别的所有硬件设备,随后kernel会加载硬件驱动程序,并在内存中生成一个临时的只读的rootfs系统。这个临时的rootfs系统通常是由initrd文件生成的,该文件在grub的2nd stage就被拷贝进内存,该文件包含了必要的驱动模块,在挂载了真正的rootfs后,initrd才会从内存中被移除掉。在运行了临时的rootfs系统后,系统将开始运行第一个程序/sbin/init。
在Centos 6中系统的初始化程序是/sbin/init,但是到了Centos 7 则该用了systemd作为系统的初始化程序。

磁盘的第一个扇区(大小为512bytes)主要记录两个信息:主引导分区(MBR)和分区表。其中,MBR大小为446bytes用于存储引导加载程序(BootLoader),分区表大小为64bytes记录硬盘分区状态,最后2bytes用于MBR的有效性检查。BIOS启动的目的就是让MBR中引导加载程序启动

 

关于kickstart

kickstart是一个定义了Linux安装过程的配置文件,比如系统语言、键盘选项、要在系统中使用的时区、如何对磁盘进行分区、应该安装哪些软件包等。有了这个文件可以解放双手,让Linux安装过程按照我们预先定义的要求进行自动化安装,同时部署大量主机时十分有用。一般centos系统安装后,会在root目录下生成一个名为anaconda-ks.cfg的kickstart配置文件
ks文件主要由三个部分组成:

  1. 命令段:用于配置系统
install  #出现install可代表下面为安装配置命令段
cdrom    #安装介质
lang zh_CN.UTF-8    #安装语言
keyboard us    #键盘类型
selinux --enforcing    #是否开启selinux
timezone --utc Asia/Shanghai    #时区、系统时钟是否使用UTC时间
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
  1. 软件包段:选择要安装的软件包组及软件包
@core    #安装
@base    #安装
lftp    #安装
-zsh    #这里说明不安装,但如果有其他安装的文件需要依赖其时,也会安装
  1. 脚本段:安装前后执行的脚本
%pre    #安装过程开始之前执行的脚本;所能够执行的操作较少,因为是anaconda加载的简洁版的shell环境
%post    #所有软件包安装完成之后执行的脚本;由于是此时系统已安装完成,所以是完整的shell环境

init初始化

到了这个阶段,系统开始进行完成启动前的初始化操作,其实际上是根据/etc/inittab的设定进行脚本执行。第一个执行的脚本为/etc/rc.d/rc.sysinit,这是系统的初始化脚本,其完成的操作有下述几点:
1)设置主机名;
2)设置欢迎信息;
3)激活udev和selinux;
4)挂载/etc/fstab文件中定义的所有文件系统;
5)检测根文件系统,并以读写方式重新挂载根文件系统;
6)设置系统时钟;
7)根据/etc/sysctl.conf文件来设置内核参数;
8)激活lvm及软raid设备;
9)激活swap设备;
10)加载额外设备的驱动程序;
11)清理过期的锁和进程文件;

执行完成后,根据配置/etc/inittab文件中定义启动级别执行对应级别目录下的脚本,最后执行/etc/rc.d/rc.local脚本文件完成系统启动。

3、引导加载程序(Boot loader)

先通过一张图来简单了解下整个系统启动的流程,整个过程基本可以分为POST-->BIOS-->MBR(GRUB)-->Kernel-->Init-->Runlevel。下面会详细说明每个过程的作用。

利用ks文件安装系统

在boot提示符指定本机的网络参数和kickstart配置文件,配置文件中又设定了安装源(一般自建http、ftp服务器和yum源),执行下面的命令后,系统会自动结合kickstart文件,实现快速安装系统

  1. 利用光盘引导后,在CentOS安装界面按ESC键进入boot提示符

    澳门新濠3559 5

    kickstart1.png

在boot提示符后键入安装命令

例如指定了网络配置、ks文件路径
boot:linux ip=192.168.1.106 netmask=255.255.255.0 gateway=192.168.1.1 dns=192.168.1.1 ks=http://10.1.1.100/centos6-x86_64.cfg
  1. 指定kickstart配置文件的路径
支持以下格式:
CD            ks=cdrom:/directory/ks.cfg
硬盘驱动器     ks=hd:device/directory/ks.cfg 
FTP服务器      ks=ftp://server.mydomain.com/directory/ks.cfg
HTTP服务器     ks=http://server.mydomain.com/directory/ks.cfg
HTTPS服务器    ks=https://server.mydomain.com/directory/ks.cfg
NFS服务器      ks=nfs:server.mydomain.com:/directory/ks.cfg
其它设备       ks=file:/device/directory/ks.cfg

Runlevel

runlevel运行级别,不同的运行级别对应的运行的服务不一样,init程序会根据相应的级别去执行相应目录下的脚本,Linux的启动级别分为:

级别 说明 对应目录
0 关机模式 /etc/rc.d/rc0.d/
1 单用户模式 /etc/rc.d/rc1.d/
2 多用户模式(不加载网络驱动) /etc/rc.d/rc2.d/
3 多用户模式(常规模式) /etc/rc.d/rc3.d/
4 保留 /etc/rc.d/rc4.d/
5 图形化模式 /etc/rc.d/rc5.d/
6 重启 /etc/rc.d/rc6.d/

上述各级别对应的目录下包含着各种以K和S开头的脚本文件,K开头的表示系统启动后需要关闭的服务,S开头表系统启动后需要开启的服务。

目前常用的引导加载程序就是grub,它是一支可读取内核文件并让其执行的软件。grub程序会根据/boot/grub/grub.conf文件查找Kernel的信息,然后开始加载Kernel程序,当Kernel程序被检测并在加载到内存中,grub就将控制权交接给了Kernel程序

澳门新濠3559 6

kickstart文件制作

  1. 利用图形化工具system-config-kickstart制作ks文件
运行system-config-kickstart
~]# system-config-kickstart

澳门新濠3559 7

ks1.jpg

澳门新濠3559 8

ks2.jpg

澳门新濠3559 9

ks3.jpg

澳门新濠3559 10

ks4.jpg

澳门新濠3559 11

ks5.jpg

澳门新濠3559 12

ks6.jpg

澳门新濠3559 13

ks7.jpg

澳门新濠3559 14

ks8.jpg

澳门新濠3559 15

ks9.jpg

澳门新濠3559 16

ks10.jpg

  1. 制作包含ks文件的光盘映像
将制作好的ks文件和安装光盘中的isolinux文件夹都复制到一个文件夹下例如/tmp/mykickstart下
]# ls
isolinux  ks.cfg
编辑/isolinux/isolinux.cfg文件
]# vim /isolinux/isonux.cfg
在文件中添加新的label并设置成默认选项,将原来的默认default行删除
label linux
  menu label ^Install CentOS based mykickstart
  menu default
  kernel vmlinuz
  append initrd=initrd.img ks=cdrom:/ks.cfg
#此处指定了ks文件所在的路径
在ks.cfg和isolinux文件夹共同的父目录的父目录即/tmp下执行
]# mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 6.9 by mykickstart" -b isolinux/isolinux.bin -c isolinux/boot.cat -o /tmp/centos6.9_by_ks.iso mykickstart
]# ls
mykickstart  centos6.9_by_ks.iso
光盘映像制作完成

4、Kernel加载

图1-1:系统启动流程

内核(Kernel)是Linux系统最主要的程序,它的作用就是进行硬件检测并加载驱动程序。由于Kernel为了精简且以压缩的文件形式存储在硬盘中,故只保留了最基本的模块,并没有各种硬件的驱动程序,也就无法识rootfs所在的设备,故产生了initrd这个文件。该文件是在安装系统时产生的,是一个临时的根文件系统(rootfs)。它装载了必要的驱动模块,当Kernel启动时,可以从initrd文件中装载驱动模块,直到挂载真正的rootfs,然后将initrd从内存中移除。硬件驱动成功后,Kernel会主动调用init进程

BIOS

5、启动Init进程

  BIOS(Basic Input/Output System),基本输入输出系统,该系统存储于主板的ROM芯片上,计算机在开机时,会最先读取该系统,然后会有一个加电自检过程,这个过程其实就是检查CPU和内存,计算机最基本的组成单元(控制器、运算器和存储器),还会检查其他硬件,若没有异常就开始加载BIOS程序到内存当中。详细的BIOS功能,这边就不说了,BIOS主要的一个功能就是存储了磁盘的启动顺序,BIOS会按照启动顺序去查找第一个磁盘头的MBR信息,并加载和执行MBR中的Bootloader程序,若第一个磁盘不存在MBR,则会继续查找第二个磁盘(PS:启动顺序可以在BIOS的界面中进行设置),一旦BootLoader程序被检测并加载内存中,BIOS就将控制权交接给了BootLoader程序。

init是系统启动的第一个进程,是所有进程的父进程,打个比喻它就是女娲的级别,所有的人类(进程)都是它造出来的,所有干这行的同学们在kill进程的时候千万不要执行kill -9 init,你干掉了造物主,你说会是什么后果,那就是自己作死。init会根据/etc/inittab中设定的动作进行脚本的执行,init执行第一个脚本/etc/rc.d/rc.sysinit来准备软件执行的操作环境(如网络、时区、设定主机名,挂载文件系统等)。系统的操作环境准备好之后,接下来就是系统服务的启动

 

6、根据Run-level 进行服务启动

MBR

runlevel,系统运行级别(Linux系统有7个级别,哪7个请自行百度),不同的级别会启动的服务不一样,init会根据定义的级别去执行相应目录下(/etc/rc.d/rcN.d)的脚本,该目录下的脚本只有K*和S*开头的文件,K开头的文件为开机需要执行关闭的服务,S开头的文件为开机需要执行开启的服务

  MBR(Master Boot Record),主引导记录,MBR存储于磁盘的头部,大小为512bytes,其中,446bytes用于存储BootLoader程序,64bytes用于存储分区表信息,最后2bytes用于MBR的有效性检查。

7、用户自定义开机启动程序

 

完成默认runlevel指定的各项服务的启动后,系统最后会自动执行/etc/rc.d/rc.local这个脚本(该脚本的作用请看大标题),至此,系统启动完成,你可以看到登录界面啦

GRUB

 

  GRUB(Grand Unified Bootloader),多系统启动程序,其执行过程可分为三个步骤:

                                                  ——我今天才知道,我之所以漂泊就是我还没有成为大侠

    Stage1:这个其实就是MBR,它的主要工作就是查找并加载第二段Bootloader程序(stage2),但系统在没启动时,MBR根本找不到文件系统,也就找不到stage2所存放的位置,因此,就有了stage1_5

    Stage1_5:该步骤就是为了识别文件系统

    Stage2:GRUB程序会根据/boot/grub/grub.conf文件查找Kernel的信息,然后开始加载Kernel程序,当Kernel程序被检测并在加载到内存中,GRUB就将控制权交接给了Kernel程序。

    PS:实际上这个步骤/boot还没被挂载,GRUB直接识别grub所在磁盘的文件系统,所以实际上应该是/grub/grub.conf文件,该配置文件的信息如下:

    grub.conf: 

    #boot=/dev/sda

    default=0        #设定默认启动的title的编号,从0开始

    timeout=5       #等待用户选择的超时时间

    splashimage=(hd0,0)/boot/grub/splash.xpm.gz    #GRUB的背景图片

    hiddenmenu     #隐藏菜单

    title CentOS (2.6.18-194.el5PAE)      #内核标题

        root (hd0,0)         #内核文件所在的设备

        kernel /vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/     #内核文件路径以及传递给内核的参数

        initrd /initrd-2.6.18-194.el5PAE.img                            #ramdisk文件路径

 

 

 Kernel

  Kernel,内核,Kernel是Linux系统最主要的程序,实际上,Kernel的文件很小,只保留了最基本的模块,并以压缩的文件形式存储在硬盘中,当GRUB将Kernel读进内存,内存开始解压缩内核文件。讲内核启动,应该先讲下initrd这个文件,

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

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

 

Init

  init,初始化,顾名思义,该程序就是进行OS初始化操作,实际上是根据/etc/inittab(定义了系统默认运行级别)设定的动作进行脚本的执行,第一个被执行的脚本为/etc/rc.d/rc.sysinit,这个是真正的OS初始化脚本,简单讲下这个脚本的任务(可以去看看实际脚本,看看都做了什么):

  1、激活udev和selinux;2、根据/etc/sysctl.conf文件,来设定内核参数;3、设定系统时钟;4、装载硬盘映射;5、启用交换分区;6、设置主机名;7、根文件系统检测,并以读写方式重新挂载根文件系统;8、激活RAID和LVM设备;9、启用磁盘配额;10、根据/etc/fstab,检查并挂载其他文件系统;11、清理过期的锁和PID文件

  执行完后,根据配置的启动级别,执行对应目录底下的脚本,最后执行/etc/rc.d/rc.local这个脚本,至此,系统启动完成。

  

Runlevel

  runlevel,运行级别,不同的级别会启动的服务不一样,init会根据定义的级别去执行相应目录下的脚本,Linux的启动级别分为以下几种

  0:关机模式

  1:单一用户模式(直接以管理员身份进入)

  2:多用户模式(无网络)

  3:多用户模式(命令行)

  4:保留

  5:多用户模式(图形界面)

  6:重启

 

  在不同的运行级别下,/etc/rc.d/rc这个脚本会分别执行不同目录下的脚本

  • Run level 0 – /etc/rc.d/rc0.d/
  • Run level 1 – /etc/rc.d/rc1.d/
  • Run level 2 – /etc/rc.d/rc2.d/
  • Run level 3 – /etc/rc.d/rc3.d/
  • Run level 4 – /etc/rc.d/rc4.d/
  • Run level 5 – /etc/rc.d/rc5.d/
  • Run level 6 – /etc/rc.d/rc6.d/

  这些目录下的脚本只有K*和S*开头的文件,K开头的文件为开机需要执行关闭的服务,S开头的文件为开机需要执行开启的服务。

编辑:操作系统 本文来源:首先系统会启动POST程序来对内部的各个配件进行

关键词: