启动流程

linux系统开机启动过程描述

当按下电源键后计算机硬件会主动读取BIOS来加载硬件信息及进行硬件系统的自我测试,之后系统会主动读取第一个可启动的设备(由BIOS设置的),此时就可以读入引导装载程序了(Boot Loader)。 
引导装载程序可以指定使用哪一个内核文件来启动,并实际加载内核到内存当中解压缩与执行,此时内核就能够开始在内存内活动,并检测所有硬件信息与加载适当的驱动程序来使主机开始运行。 
等到内核检测硬件与加载驱动程序完毕后,主机系统开始运行后,此时linux才会调用外部程序开始准备软件执行的环境,并且实际加载所有系统运行所需要的软件程序。最后系统就会开始等待用户的登录与操作。

简单来说:

  1. 加载BIOS的硬件信息与进行自我测试,并依据设置取得第一个可启动设备;
  2. 读取并执行第一个启动设备内MBR(主引导分区)的Boot Loader(即是gurb等程序);
  3. 依据Boot Loader的设置加载Kernel,Kernel会开始检测硬件与加载驱动程序;
  4. 在硬件驱动成功后,Kernel会主动调用init进程(/sbin/init),而init会取得runlevel信息;
  5. init执行/etc/rc.d/rc.sysinit文件来准备软件的操作环境(如网络、时区等);
  6. init执行runlevel的各个服务的启动(script方式);
  7. init执行/etc/rc.d/rc.local文件;
  8. init执行终端机模拟程序mingetty来启动login程序,最后等待用户登录。

BIOS

BIOS(Basic Input Output System)加载完硬件信息后,进行开机自检,然后开始执行硬件检测的初始化,并配置PnP设备,之后再定义出可启动的设备顺序,接下来开始进行启动设备的数据读取。

MBR

MBR(Master Boot Record,主引导分区)。每块硬盘的第一个扇区内含有446 Bytes的MBR区域。如果主机上有多块硬盘,系统会依据BIOS的设置,选择某块硬盘的MBR读取引导装载程序。 
系统的MBR指的是第一个启动设备的MBR。

BootLoader

由于我们的系统软件大多放置到硬盘中,所以BIOS会指定启动的设备,好让我们可以读取磁盘中的操作系统内核文件。但由于不同的操作系统的文件系统格式不相同,因此我们必须要以一个引导装载程序(Boot Loader)来处理内核文件加载的问题。

加载内核检测硬件

当通过Boot Loader的管理而开始读取内核文件后,接下来,Linux就会将内核解压缩到内存当中,并利用内核的功能开始测试与驱动各个周边设备,包括存储设备、CPU、网卡、声卡等。此时Linux内核会以自己的功能重新检测一次硬件,而不一定会使用BIOS检测到的硬件信息。也就是说内核此时才开始接管BIOS后的工作。 
内核文件一般放再/boot里面。

第一个进程init

在内核加载完毕之后进行完硬件检测与驱动程序加载后,此时你的主机硬件应该已经准备就绪了,此时内核会主动调用第一个进程/sbin/init。 
/sbin/init最主要的功能就是准备软件执行的环境,包括系统的主机名、网络设置、语系处理、文件系统格式以及其他服务的启动等。而所有的操作都会通过init的配置文件,即是/etc/inittab来规划,而inittab内还有一个很重要的设置选项,runlevel。

init处理系统初始化流程/etc/rc.d/rc.sysinit

/etc/inittab中si::sysinit:/etc/rc.d/rc.sysinit,这表示开始加载各项系统服务之前,得先设置好整个系统环境,主要是利用/etc/rc.d/rc.sysinit这个shell脚本来设置好系统的环境。

启动系统服务与相关启动配置文件

启动系统服务/etc/rc.d/rc。 
相关启动配置文件/etc/sysconfig。 
加载内核让整个系统准备接受命令来工作,再经过/etc/rc.d/rc.sysinit的系统模块与相关硬件信息的初始化后,我们还需要启动系统所需的各项服务,这样主机才能提供我们相关的网络或主机功能。 
依据/etc/inittab中runlevel的设置值来决定启动的服务选项。

下面是各个runlevel服务启动的各项脚本放置处。 
/etc/inittab中:

   l0:0:wait:/etc/rc.d/rc 0  l1:1:wait:/etc/rc.d/rc 1  l2:2:wait:/etc/rc.d/rc 2  l3:3:wait:/etc/rc.d/rc 3  l4:4:wait:/etc/rc.d/rc 4  l5:5:wait:/etc/rc.d/rc 5  l6:6:wait:/etc/rc.d/rc 612345671234567

格式: 
id:runlevel:action:process

对/etc/rc.d/rc 3解释:

  • 由/etc/rc.d/rc 3可以取得/etc/rc3.d/这个目录来准备处理相关的脚本程序;
  • 找到/etc/rc3.d/K??*开始的文件,并进行“/etc/rc3.d/K??*stop操作”;
  • 找到/etc/rc3.d/S??*开始的文件,并进行“/etc/rc3.d/S??*start操作”;

根据上图我们可以发现全是连接文件,连接到服务启动目录/etc/init.d/去。

用户自定义开机启动程序/etc/rc.d/rc.local

有任何想要在启动时就进行的工作,直接将它写入/etc/rc.d/rc.local,那么该工作就会在启动的时候被自动加载,而不必等到登录系统后去启动。

根据/etc/inittab的设置加载终端机

在完成了系统所有服务的启动后,接下来Linux就会启动终端机来等待用户登录。

/etc/inittab中

   1:2345:respawn:/sbin/mingetty tty1
  2:2345:respawn:/sbin/mingetty tty2
  3:2345:respawn:/sbin/mingetty tty3
  4:2345:respawn:/sbin/mingetty tty4
  5:2345:respawn:/sbin/mingetty tty5
  6:2345:respawn:/sbin/mingetty tty6123456123456

init执行终端机模拟程序mingetty来启动login程序,最后等待用户登录。

(1)POST加电自检

POST(PowerOnSelfTest)首先对每一个设备进行检查。完成后会交给BIOS寻找存有引导记录的设备,找到后读入操作系统引导记录,然后将系统控制权交给引导记录,并由引导记录来完成系统的顺利启动。

(2)MBR引导

MBR(Master Boot Record) MBR记录一般是在磁盘 0 磁道 1 扇区,共512个字节。前446个字节是BootLoder,后 4*16 的 64 个字节是存放分区信息的,最后 2 个字节是校验信息,一般是 55AA。

(3)GRUB(GRand Unified Bootloader)、加载内核

就是MBR中的前 446 个字节,是BooTLoader的一种,它的作用是要选择要启动和加载内核的。

(4)kernel

Linux属于单核系统:Kernel+各种外围模块组成。通过grub加载内核后(有可能会借助于ramdisk加载驱动),内核开始自我解压并工作通过虚拟根文件系统initrfs 调用init工作。

ramdisk:内核中的特性之一:使用缓冲和缓存来回事对磁盘上的文件访问;

CentOS 5: initrd,  工具程序:mkinitrd

CentOS 6: initramfs, 工具程序:mkinitrd, dracut

(5)启动init程序(/sbin/init)

init程序的类型:

SysV: init, CentOS 5

配置文件:/etc/inittab

Upstart: init, CentOS 6

配置文件:/etc/inittab, /etc/init/*.conf

Systemd:systemd, CentOS 7

配置文件:/usr/lib/systemd/system, /etc/systemd/system

/sbin/init程序有0-6,七个级别

0:关机

1:单用户模式(root, 无须登录), single, 维护模式;

2: 多用户模式,会启动网络功能,但不会启动NFS;维护模式;

3:多用户模式,正常模式;文本界面;

4:预留级别;可同3级别;

5:多用户模式,正常模式;图形界面;

6:重启

默认级别为3,5,配置文件是/etc/inittab

每一行定义一种action以及与之对应的process

配置文件中四个字段的定义:id:runlevel:action:process

action:(action的选项)

wait: 切换至此级别运行一次;

respawn:此process终止,就重新启动之;

initdefault:设定默认运行级别;process省略;

sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit;

init程序启动以后首先运行脚本/etc/inittab来读取级别,如果你指定级别,就按指定级别运行,不是就是用默认的3级别;

然后运行/etc/rc.d/rc.sysinit这来初始化脚本;

运行完后会执行/etc/rc.d/rc#.d
    /etc/rc.d 目录中存放着123456运行级别的目录,

每一个rc#.d里都包含很多K或S开头的文件这些都是链接文件,这些文件代表这个级别需要启动和关闭的服务,K开头表示需要关闭的服务,S开头表示需要关闭的服务

K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务;

S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务;

chkconfig命令:查看和管理每个级别下的服务的状态

查看服务在所有级别的启动或关闭设定情形:

chkconfig [--list] [name]或者直接chkconfig

添加:  chkconfig --add name  可以将自己写的一些脚本,让此命令统一管理

这条命令是在每个级别里面创建对应的K或S开头的文件,创建什么类型的文件要根据/etc/rc.d/init.d (/etc/init.d)的配置文件

我们测试一下,编辑一个配置文件/etc/rc.d/init.d/testsrv

删除:  chkconfig --del name 服务不由chkconfig这种机制来管理

修改指定的链接类型:

chkconfig [--level levels] name <on|off|reset>

--level LLLL: 指定要设置的级别;省略时表示2345

使用这个命令修改下chkconfig --level 45 testsrv off

前面执行完了,会执行/etc/rc.d/rc.local脚本,此脚本是启动过程中最后启动的一个脚本。

因此不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令可以放在/etc/rc.d/rc.local中

最后会执行 /bin/login 登录用户。至此系统启动过程完成

时间: 2024-10-01 17:18:48

启动流程的相关文章

#24 centos6(RHEL)系列操作系统的启动流程、与命令chkconfig、grub的使用

所有由rc脚本关闭或启动的链接文件的原文件都存在于/etc/rc.d/init.d,系统为了方便使用,为此目录创建了链接/etc/init.d 所有/etc/inid.d(/etc/rc.d/init.d)目录中的脚本执行方式: # /etc/init.d/srv_script {start|stop|restart|status} # service srv_script {start|stop|restart|status} chkconfig命令: chkconfig - updates

#23 centos5(RHEL)系列操作系统的启动流程、与命令mkinitrd、dracut的使用

centos(RHEL)系列操作系统的启动流程:Intel x86兼容架构: Linux的系统组成:内核 + 应用程序  GUN/Linux:单纯的指Linux内核: 从硬盘存储和启动操作系统的角度: Linux的系统组成:内核 + 根文件系统(rootfs) 内核功能:进程管理,文件系统管理,内存管理,网络协议,驱动程序,安全功能,... Linux系统的系统运行环境可以分为两部分: 内和空间:内核代码(系统调用) 就是内核进程占用的CPU和内存资源的总和: 用户空间:应用程序(进程或线程)

CentOS 6开机启动流程实验篇

CentOS 6开机启动流程实验篇 centos 系统的启动流程 grub 破坏Linux的核心文件再修复体验系统启动流程 CentOS 6开机启动的具体详情请参见理论篇! 了解了系统启动的基本流程,以下我们通过"破坏式实验",即破坏系统启动过程中的一些关键环节,使系统无法启动,然后我们再通过修复这些文件使得系统正常重启,进而体验Linux系统的启动流程,这些关键环节包括破坏grub三个stage(stage1.stage1-5.stage2) 中的任何一个阶段,甚至是整个grub;

u-boot启动流程分析(2)_板级(board)部分

转自:http://www.wowotech.net/u-boot/boot_flow_2.html 目录: 1. 前言 2. Generic Board 3. _main 4. global data介绍以及背后的思考 5. 前置的板级初始化操作 6. u-boot的relocation 7. 后置的板级初始化操作 1. 前言 书接上文(u-boot启动流程分析(1)_平台相关部分),本文介绍u-boot启动流程中和具体版型(board)有关的部分,也即board_init_f/board_i

CentOS开机启动流程简介

我们都知道按下电脑电源键后,屏幕上会一闪而过很多信息,然后显示登录界面,然后输入用户名,密码就可以畅享网络世界了.那么这中间到底发生了什么呢,今天就让我们来简单探讨一下CentOS的简易版开机启动流程吧. 第一阶段:通电自检过程 我们都知道电脑所有数据指令都是在内存上才能被cpu处理的吧,我们还知道内存在断电后其上面的所有数据都会丢失吧,那么开机的时候内存应该是没有东西的吧,那上面都不能干了,更别说启动一个操作系统了,其实啊,我们内存并不只是我们常见的那个内存卡,很多硬件都会映射一段内存到cpu

Cocos2d-x3.3RC0的Android编译Activity启动流程分析

本文将从引擎源代码Jni分析Cocos2d-x3.3RC0的Android Activity的启动流程,以下是具体分析. 1.引擎源代码Jni.部分Java层和C++层代码分析 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveXV4aWt1b18x/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" > watermark/2/text/aHR0cDov

centos启动流程[转]

启动流程概览 在硬件驱动成功后,Kernel 会主动呼叫 init 程序,而 init 会取得 run-level 资讯: init 运行 /etc/rc.d/rc.sysinit 文件来准备软件运行的作业环境 (如网络.时区等): init 运行 run-level 的各个服务之启动 (script 方式): init 运行 /etc/rc.d/rc.local 文件: init 运行终端机模拟程序 mingetty 来启动 login 程序,最后就等待使用者登陆啦:    init,/etc

System进程的启动流程第二部分

继System进程的启动流程第一部分,我们接着分析com.android.server.SystemServer的main函数.如下: public class SystemServer { ...... native public static void init1(String[] args); ...... public static void main(String[] args) { ...... init1(args); ...... } public static final vo

UI开发----基础视图和程序启动流程(delegate)

//  Create by 郭仔  2015年04月13日22:10:23 今天介绍的基础视图包括:UITextField.UIButton 一.定义UITextField: 创建UITextField与创建UILabel的步骤很相似.? 1.开辟空间并初始化(如果本类有初始化?方法,使?用?自?己的;否则 使?用?父类的).? 2.设置?文本显?示.输?入相关的属性? 3.添加到?父视图上,?用以显?示? 4.释放 UITextField * textField = [[UITextField

第5章2节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 启动流程概览(原创)

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在所难免.有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息. 每个应用都会有一个入口方法来供操作系统调用执行,Monkey这个应用的入口方法就是在Monkey.java这个类里面的,也就是说Monkey.java就是整个Monkey应用的入口类. Monkey作为一个命令行应用,