Linux系统启动过程

开机过程简述 

开机BIOS自检,加载硬盘。
读取MBR,并进行Boot Loader引导。
加载内核kernel,Kernel检测硬件和加载驱动程序。
启动init进程,依据inittab文件设定运行级别
init进程,执行rc.sysinit文件来准备软件执行的操作环境。
启动内核模块,执行不同级别的脚本程序。
执行/etc/rc.d/rc.local。
启动mingetty,进入系统登陆界面。

开机过程详解

BIOS

BIOS(Basic Input / Output System),又称基本输入输出系统,可以视为是一个永久地记录在ROM中的一个软件,是操作系统输入输出管理系统的一部分。早期的BIOS芯片确实是"只读"的,里面的内容是用一种烧录器写入的,一旦写入就不能更改,除非更换芯片。现在的主机板都使用一种叫Flash EPROM的芯片来存储系统BIOS,里面的内容可通过使用主板厂商提供的擦写程序擦除后重新写入,这样就给用户升级BIOS提供了极大的方便。
BIOS的功能由两部分组成,分别是POST码和Runtime服务。POST阶段完成后它将从存储器中被清除,而Runtime服务会被一直保留,用于目标操作系统的启动。BIOS两个阶段所做的详细工作如下:
步骤1:上电自检POST(Power-on self test),主要负责检测系统外围关键设备(如:CPU、内存、显卡、I/O、键盘鼠标等)是否正常。例如,最常见的是内存松动的情况,BIOS自检阶段会报错,系统就无法启动起来;
步骤2:步骤1成功后,便会执行一段小程序用来枚举本地设备并对其初始化。这一步主要是根据我们在BIOS中设置的系统启动顺序来搜索用于启动系统的驱动器,如硬盘、光盘、U盘、软盘和网络等。我们以硬盘启动为例,BIOS此时去读取硬盘驱动器的第一个扇区(MBR,512字节),然后执行里面的代码。实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、并执行。
至此,BIOS的任务就完成了,此后将系统启动的控制权移交到MBR部分的代码。

系统引导 

MBR是Master Boot Record的缩写。硬盘的0柱面、0磁头、1扇区称为主引导扇区。它由三个部分组成,主引导程序(Bootloader)、 硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA),其结构图如下所示:
磁盘分区表包含以下三部分:
Partition ID  (5:延申  82:Swap   83:Linux   8e:LVM     fd:RAID)
Partition起始磁柱
Partition的磁柱数量
通常情况下,诸如lilo、grub这些常见的引导程序都直接安装在MBR中。

加载内核检测硬件

通过Boot Loader的管理加载Kernel文件之后Linux就会将内核解压到内存中,并利用内核的功能开始测试与驱动各个周边设备。
需要注意的是:Linux内核会以自己的功能重新检测一次硬件,而不一定会使用BIOS检测到的硬件信息,也就是说,内核此时开始接管BIOS后的工作。
内核文件:/boot/vmlinuz
为了硬件开发商与其他内核功能开发者的便利,Linux内核可以通过动态加载内核模块的,这些内核模块存放的目录:/lib/moudles。

init进程与runlevel

内核加载完毕进行硬件检测与驱动程序加载后,此时主机的硬件应该已经准备就绪了,此时内核会主动调用第一个进程:/sbin/init。/sbin/init的PID是1,其主要的功能是准备软件的执行环境。
所有的配置都是通过init的配置文件/etc/inittab来规划,/etc/inittab中有一个重要的设置选项,那就是默认的run level:
许多程序需要开机启动。它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon。init进程的一大任务,就是去运行这些开机启动的程序。但是,不同的场合需要启动不同的程序。Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。也就是说,启动时根据"运行级别",确定要运行哪些程序。  
Linux系统有7个运行级别(runlevel): 

运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动

运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆

运行级别2:多用户状态(没有NFS)

运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式

运行级别4:系统未使用,保留

运行级别5:X11控制台,登陆后进入图形GUI模式

运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

开始加载各项系统服务走之前,得先设置好整个系统环境,主要利用/etc/rc.d/rc.sysinit脚本程序来进行系统环境设置。
通过外部第一号参数($1)来取得想要执行的脚本目录,即由/etc/rc.d/rc*.d(*=0~6)所有的文件均是指向/etc/init.d下相应文件的符号链接。rc.sysinit通过分析/etc/inittab文件来确定系统的启动级别,然后才去执行/etc/rc.d/rc*.d下的文件。
rc*.d目录下都是一些符号链接文件,这些链接文件都指向init.d目录下的service脚本文件,命名规则为K+nn+服务名或S+nn+服务名,其中nn为两位数字。系统会根据指定的运行级别进入对应的rcN.d目录,并按照文件名顺序检索目录下的链接文件
对于以K开头的文件,系统将终止对应的服务。
对于以S开头的文件,系统将启动对应的服务。

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

有任何想启动时就进行的工作时,都可以将它写入到/etc/rc.d/rc.local中,那么该工作就会在启动的时候被自动加载。

登录

根据/etc/initatab的设置加载终端机或X window界面

Debian的runlevel

0 – Halt,关机模式
1 – Single,单用户模式
2 - Full multi-user with display manager (GUI)
3 - Full multi-user with display manager (GUI)
4 - Full multi-user with display manager (GUI)
5 - Full multi-user with display manager (GUI)
6 – Reboot,重启

查看运行级别

runlevel

由此可知ubuntu的默认启动级别为2。
ubuntu下rc.local 的位置是/etc。

转载于:https://www.cnblogs.com/xiaojianliu/articles/9433803.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值