linux开机启动流程


linux开机启动流程
linux开机启动流程
linux开机启动流程

加电开机
BIOS(Basic Input Output System)基本输入输出系统启动,POST自检(Power-On-self-test)

开机BIOS自检–> 检查CPU,硬盘等硬件信息

BIOS这个大程序里面有3个小程序:基本输入输出的程序、开机后自检程序和系统自启动程序
BIOS是个人电脑启动时加载的第一个软件。它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。
CMOS:是主板上用来存储我们的配置信息的地方–》相当于BIOS的存储信息得地方

BIOS启动后,第一件事情就是执行POST自检阶段,主要针对系统的一些关键设备是否存在或者是功能是否正常,如:内存、显卡等,如果在POST过程中系统设备存在致命的问题,BIOS将会发出声音来报告检测过程中出现的错误,声音的长短及次数对应着系统的错误类型。POST过程会非常快速,对用户几乎感觉不出来。

显卡初始化:在POST过程中,BIOS会去查找显卡的BIOS,并且去调用显卡BIOS的代码,由显卡BIOS去初始化显卡,这个时候显示器一般会显示一些初始化的信息,同时系统BIOS也会去查找其它设备的BIOS,分别调用她们的初始化代码来初始化设备。

/boot启动顺序

硬件自检结束后,BIOS这个时候将控制权交给下一阶段的启动程序,但是这个时候BIOS需要知道“下一个阶段要启动的程序具体放在了哪一个设备上”也就是我们平时说的BIOS下的启动顺序,但排在第一位的是优先转交的设备,这个叫做启动顺序。

启动顺序,我们日常工作中可以开机进入BIOS的去调节启动设备的优先级。

MBR主引导记录

MBR【Major Boot Record】引导–> 主分区引导【读取0磁道0柱面1扇面的前446字节–> 确定服务器的启动方式【一般是硬盘启动,有时候也有CD_ROM启动】

BIOS按照设定好的启动顺序,将控制权交给排在第一位的存储设备,即开始从第一位设备中读取设备的MBR,并且将程序放在0x7c000的内存地址位中。

MBR:存储设备中的第一个扇区,磁盘最前面的512Byte,称为“主引导扇区”(Master boot record,缩写为MBR)

这个时候计算机会去读取该设备的第一个扇区,也就是读取最前面的512个字节。如果这512个字节的最后两个字节是0x55和0xAA,表明这个设备可以用于启动;如果不是,表明设备不能用于启动,BIOS会继续去找下一个设备,并将控制权转交给”启动顺序”中的下一个设备。

GRUB阶段

GRUB【GRand Unified Bootloader】引导 –> 确定加载某个系统【GRUB是GUN项目的多操作系统启动程序】
grub引导阶段

grub第1.5和第2阶段,信息默认存放在扇区中,如果使用grub-install生成的第2阶段的文件是存放在/boot分区中的。

为了加载内核系统,不得不加载/boot分区,而加载/boot分区,要有/boot分区的驱动,/boot分区驱动是放在/boot分区中的啊,我们好像进入死循环了,Linux是怎么解决的呢?就是靠放在1.5阶段中的数据,放在第一个扇区后的后续扇区中,第1.5阶段和2阶段总共27个扇区。

第1.5阶段:mbr之后的扇区,识别stage2所在的分区上的文件系统。

第2阶段:开机启动的时候看到Grub选项、信息,还有修改GRUB背景等功能都是stage2提供的,stage2会去读入/boot/grub/grub.conf或者menu.lst等配置文件。

加载内核kernal和initramfs

加载内核kernal和vmlinuz–> 【cat /proc/version或uname -a即可查看内核版本信息】
引导内核阶段

加载内核,核心开始解压,启动一些最核心的程序。

为了让内核足够的轻小,硬件驱动并没放在内核文件里面。

kernel内核开始初始化,用systemd来代替centos6以前的init程序
先执行initrd.target
包括挂载/etc/fstab文件中系统,挂载之后,就可以切换到根目录了。

从initramfs根文件系统切换到磁盘的根目录
systemd执行默认target配置
centos7表面有“运行级别”这个概念,实际是为了兼容以前的系统,每个所谓“运行级别”都有对应的软连接指向,默认的启动级别/etc/systemd/system/default.target,根据它的指向可以找到系统要进入到哪个模式。

模式:

0 ==> runlevel0.target, poweroff.target 关机
1 ==> runlevel1.target, rescue.target 单用户模式
2 ==> runlevel2.target, multi-user.target 多用户模式
3 ==> runlevel3.target, multi-user.target 多用户模式,不能使用nfs
4 ==> runlevel4.target, multi-user.target 没有用
5 ==> runlevel5.target, graphical.target 图形界面
6 ==> runlevel6.target, reboot.target 重启

0,3,6比较重要
systemctl -all查看所有服务
systemctl get-default #得到默认级别
systemctl set-default multi-user.target #设置级别

systemd阶段

运行systemd进程 --> Linux启动的第一个进程【ps -ef | grep /sbin/init】pstree -p
systemd执行sysinit.target
systemd启动multi-user.target下的本机与服务器服务
systemd执行multi-user.target下面的/etc/rc.d/rc.local
Systemd执行multi-user.target下的getty.target及登录服务
getty.target我们也眼熟,它是启动终端的systemd对象。如果到此步骤,系统没有指定启动图形桌面,到此就可以结束了,如果需要启动图形界面,要在此基础上启动桌面程序。

systemd执行graphical图形化需要的服务
至此系统启动完成,可以正常使用。

读取cat /etc/inittab

读取cat /etc/inittab -> 确定Linux的启动级别和加载自启动设备–> init进程执行/etc/rc.d/rc.sysinit (设置主机名,网络等信息)

启动内核模块,执行不同级别的脚本程序 --> 根据自启动级别加载该级别下的自启动程序 /etc/rc.d/rc3.d/*

执行/etc/rc.d/rc.local --> 记录系统自启动的是非系统软件、命令、环境变量等初始化信息
编写开机脚本

执行/bin/login登录程序,启动mingetty(终端登录进程),进入系统登陆界面

初始化用户的环境变量->>别名 函数 变量

首先执行/etc/profile ~/.bashprofile
再执行~/.bashrc /etc/bashrc

远程登录或者直接登录会执行四个文件

只是运行bash,只会运行
~./bashrc
/etc/bashrc