Linux系统启动流程简析

在日常生活中,我们开机的操作一般为按下电源键,等待系统自己起来就好了。这开机的过程看似简单,但其中却包含着十分复杂的各种小过程。以Linux为例,其流程为下图所示:wKiom1aFACbDrmkvAAixY_zIucM656.jpg


 

一、POST

首先,先介绍下BIOSPOST的概念。

BIOSBasic Input Output System,即基本输入输出系统,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。

POSTPower on self test,即加电自检,它是BIOS功能的一个部分,责完成对CPU、主板、内存、软硬盘子系统、显示子系统(包括显示缓存)、串并行接口、键盘、CD-ROM光驱等的检测。主要检查硬件的好坏。

当我们按下电源键时,BIOS就会先启动POST功能,检查自身硬件的状态并反馈,如果硬件有问题则会导致系统启动失败。如果硬件正常,则进入下一步。

 

二、BootSequence

bootsequence为启动顺序,可在BIOS中设置。如下图:

wKiom1aD7WeQ-JbxAAAmqNytQ_U960.png

 

BIOS会根据次序查找各引导设备,其查找到的第一个有引导程序(bootloader)的设备即为本次启动要用到的设备。

以硬盘启动为例,BIOS此时去读取硬盘驱动器的第一个扇区(MBR512字节),然后执行里面的代码。实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、并执行。

至此,BIOS的任务就完成了,此后将系统启动的控制权移交到MBR部分的代码。

 

三、BootloaderMBR

MBRMaster Boot Record,即主引导记录,是硬盘驱动器上的第一个扇区,它的大小为512Bytes,由三个部分组成。分别为主引导程序(Bootloader)、硬盘分区表DPTDisk Partition table)和硬盘有效标志(55AA),其大小分别为446Bytes64Bytes2Bytes

BootLoader是在操作系统内核运行之前运行的程序。它可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。

Linux中,常用的bootloadergrublilo,我们以grub为例:

grubGrand Uniform Bootloader,它是一个多重操作系统管理器,可以引导不同的操作系统。一般来说,它的引导有2个阶段stage1stage2

stage1stage1的代码是存放在MBR中的前446Bytes中的,也就是说,BIOS会先把它加载到内存中执行。stage1没有识别文件系统的能力,它仅仅是是stage2的入口。

stage1_5stage1_5MBR之后的扇区,它可以让stage1中的bootloader识别stage2所在的分区上的文件系统,是stage1stage2之间的桥梁。

stage2:现在可以访问/boot/grub/中的stage2文件,并将其装入内存中执行。它的作用为:

1)提供菜单、并提供交互式接口

    e:编辑模式,用于编辑菜单

    c:命令模式,交互式接口

2)加载用户选择的内核或操作系统

    允许传递参数给内核

    可隐藏此菜单

3)为菜单提供了保护机制

    为编辑菜单提供认证

    为启用内核或操作系统提供认证

 

四、Kernel

stage2被装入内存中执行后,它会去解析/boot/grub/grub.conf文件,并根据该配置文件来加载Kernel(内核)镜像和initrd至内存。此时,内核将得到系统控制权并立即初始化系统中各设备并做相关的配置工作,其中包括CPUI/O、存储设备等。

initrdbootloader initialized RAM disk,即为bootloader初始化的内存盘。因为内核在初始化系统各硬件设备时需要加载不同的驱动程序,而每个系统的硬件架构并不是相同的,内核编译了一部分硬件驱动,而另一部分则被放置在initrd中。

实际上Linux的内核镜像仅是包含了基本的硬件驱动,在系统安装过程中会检测系统硬件信息,根据安装信息和系统硬件信息将一部分设备驱动写入initrd。这样在以后启动系统时,一部分设备驱动就放在initrd中来加载。

注:initramfsinitrd的升级优化。

内核在获得控制权初始化后,会去执行initrd中的init脚本,这时内核将控制权交给了init文件处理。当所需的驱动程序加载完后,会创建一个根设备,然后将根文件系统rootfs以只读的方式挂载。这一步结束后,释放未使用的内存,并通过switchroot转换到真正的根文件系统上面去,同时运行/sbin/init程序。此后系统的控制权就全权交给/sbin/init进程了。

 

五、/sbin/init

1、运行级别:

/sbin/init进程是用来初始化系统的进程,它是所有进程的父进程。当/sbin/init进程获得了系统的控制权之后,它会先读取/etc/inittab文件来确定系统的运行级别。

CentOS6.7/etc/inittab文件:

[root@localhost initrd]# vim /etc/inittab 

# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)

id:3:initdefault:
~                                                                                                               
~                                                                                                               
~                                                                                                               
~

 

运行级别是为了系统的运行或维护等目的而设定的机制,一共有7个级别,分别用数字0-6表示:

0:关机,shutdown

1:单用户模式(single user),root用户,无需认证;维护模式

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

3:多用户模式(multi user),完全功能模式;文本界面,无图形界面

4:预留级别:目前无特别使用目的,但习惯以同3级别功能使用

5:多用户模式(multi user),完全功能模式,图形界面

6:重启,reboot

默认级别一般为35

 

2、系统初始化

确定运行级别后,/sbin/init程序会读取/etc/rc.d/rc.sysinit这个系统初始化脚本进行系统初始化操作,包括以下部分:

a、读取/etc/sysconfig/network/文件来设置主机名

b、设置欢迎信息

c、激活udevselinux

d、挂载/etc/fstab文件中定义的所有文件系统

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

f、设置系统时钟

g、根据/etc/sysctl.conf文件来设置内核参数

h、激活lvm及软raid

i、激活swap设备

j、加载额外设备的驱动程序

k、清理操作

 

3、服务的启停

系统初始化之后,系统就可以使用了,但是往往还需要启动一些相应的服务来使用网络或主机功能。此时/sbin/init程序会读取/etc/rc.d/rc文件并根据运行级别来判断停止某些服务并启动某些服务。S

需要启停的服务脚本都存放于/etc/rc$runlevel.d/目录下,其中K开头的脚本为要关闭的服务脚本,K后面的数字越小,优先级越高,需先关闭。而S开头的脚本为要开启的服务脚本,S后面的数字越小,优先级越高,需先启动。实际上,所有/etc/rc$runlevel.d/目录下的脚本均为/etc/init.d/目录下的脚本链接。

 

4、启动终端

在启动所有需要的服务后,系统会启动终端或图形终端来等待用户登录。至此,整个系统启动流程就结束了。


5、执行用户自定义引导程序/etc/rc.d/rc.local。其实当执行/etc/rc.d/rc3.d/S99local时,它就是在执行/etc/rc.d/rc.localS99local是指向rc.local的符号链接。就是一般来说,自定义的程序不需要执行上面所说的繁琐的建立shell增加链接文件的步骤,只需要将命令放在rc.local里面就可以了,这个shell脚本就是保留给用户自定义启动内容的。

 

六、总结

简要流程:

POST-->BootSequence(启动顺序)-->BootLoaderMBRgrub-->Kennelinitrd-->rootfsreadonly-->switchroot-->/sbin/init-->设置默认运行级别-->运行系统初始化脚本,完成系统初始化-->关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务-->设置登录终端[-->启动图形终端]

 

参考:www.magedu.com

          http://blog.chinaunix.net/uid-23069658-id-3142047.html

     http://www.linuxidc.com/Linux/2014-03/97862.htm

本项目是一个基于SSM(Spring+SpringMVC+MyBatis)后端框架与Vue.js前端框架开发的疫情居家办公系统。该系统旨在为居家办公的员工提供一个高效、便捷的工作环境,同时帮助企业更好地管理远程工作流程。项目包含了完整的数据库设计、前后端代码实现以及详细的文档说明,非常适合计算机相关专业的毕设学生和需要进行项目实战练习的Java学习者。 系统的核心功能包括用户管理、任务分配、进度跟踪、文件共享和在线沟通等。用户管理模块允许管理员创建和管理用户账户,分配不同的权限。任务分配模块使项目经理能够轻松地分配任务给团队成员,并设置截止日期。进度跟踪模块允许员工实时更新他们的工作状态,确保项目按计划进行。文件共享模块提供了一个安全的平台,让团队成员可以共享和协作处理文档。在线沟通模块则支持即时消息和视频会议,以增强团队之间的沟通效率。 技术栈方面,后端采用了Spring框架来管理业务逻辑,SpringMVC用于构建Web应用程序,MyBatis作为ORM框架简化数据库操作。前端则使用Vue.js来实现动态用户界面,搭配Vue Router进行页面导航,以及Vuex进行状态管理。数据库选用MySQL,确保数据的安全性和可靠性。 该项目不仅提供了一个完整的技术实现示例,还为开发者留下了扩展和改进的空间,可以根据实际需求添加新功能或优化现有功能。
本项目是一个基于SSM(Spring+SpringMVC+MyBatis)后端框架与Vue.js前端框架开发的网上球鞋竞拍系统。该项目旨在为球鞋爱好者提供一个便捷、高效的在线竞拍平台,用户可以在此平台上浏览、搜索、竞拍心仪的球鞋,并参与到各种有趣的竞拍活动中。 系统的主要功能包括用户注册登录、球鞋信息展示、竞拍活动创建与管理、实时竞拍以及交易安全保障等。用户可以通过注册账号后,浏览平台上发布的各类球鞋信息,包括品牌、型号、颜色、尺码以及当前竞拍状态等。系统支持用户创建和管理自己的竞拍活动,设定竞拍规则和时间,同时提供实时竞拍功能,确保公平、透明的交易过程。 在技术实现上,后端采用SSM框架进行开发,Spring负责业务逻辑层,SpringMVC处理Web请求,MyBatis进行数据库操作,保证了系统的稳定性和扩展性。前端则使用Vue.js框架,结合Axios进行数据请求,实现了前后端分离,提高了开发效率和用户体验。 数据库设计方面,系统采用了MySQL数据库,存储用户信息、球鞋信息、竞拍活动等数据,确保数据的安全性和完整性。此外,项目还包含了详细的文档资料,包括需求分析、系统设计、数据库设计以及测试报告等,为项目的实施和维护提供了有力的支持。 该项目不仅适合作为计算机相关专业学生的毕业设计题目,也适合Java学习者进行实战练习,通过在此基础上进行功能扩展和改进,可以进一步提升编程技能和项目管理能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值