POST(Power On Self Test)加电自检 --> BIOS(Boot Sequence)--> MBR(bootloader)-->Kernel --> initrd --> rootfs(/sbin/init)
下面对每一个启动流程做详细解释:
POST(Power OnSelf Test)加电自检
计算机本身不执行任何程序,所以系统必须要完成自举的过程,在CPU的控制下将RAM芯片中的某个程序映射到ROM的地址空间,并执行其中的指令完成系统硬件健康状况检查,例如存储设备、网卡、CPU声卡等其他硬件设备是否完好。当检查完成后,所有硬件或基本、核心硬件没有问题,则下一个启动流程——>BIOS
BIOS(Boot Sequence)
按照BIOS所设定的系统启动流程,根据引导次序(Boot Sequence)自上而下的寻找对应存储设备上操作系统的MBR存在,则会读取MBR中的bootloader
MBR(bootloader)
会根据MBR所指引的活动分区上寻找系统分区中的bootloader,bootloader称为是一段程序,占据446字节。在bootloader当中配置了所要引导操作系统的内核所在位置,因此BIOS被载入内存以后,当它实现将控制权限转交给bootloader以后,bootloader接收整个系统的控制权限,而后根据用户的选择去读取相应操作系统中的内核,并将内核装载入内存的某个空间位置,解压缩,这时kernel就可以在内存中活动,并根据kernel本身功能在内存当中探索硬件并加载硬件驱动程序并完成内核初始化,bootloader会将控制权限转交给内核。
Kernel内核(初始化)
我们知道kernel是完成探索硬件及加载硬件驱动程序,并以读写的方式挂载根文件系统。那么这里就出现一个比较诡异的问题,是什么问题?
我们又知道,要想访问真正的根文件系统(rootfs)的话,就必须加载根文件系统中的设备,这时根文件系统用没有挂载,要挂载根文件系统又得加载根文件系统中的驱动程序,那怎么办呢?这里就用到了initrd文件了。
探索硬件——>加载驱动(initrd)——>挂载根文件系统——>rootfs
(/sbin/init)
initrd功能介绍
其实说白了initrd就是一个虚拟的文件系统,里面有/、lib、bin、sbin、usr、proc、sys、var、dev、boot等一些目录,其实你会发现里面的目录有点像真的/,所以我们称之为虚拟的根文件系统,作用就是将kernel和真的根文件系统建立联系,让kernel去initrd中加载根文件系统所需要的驱动程序,并以读写的方式挂载根文件系统,并让执行用户当中第一个进程init。
/sbin/init(/etc/inittab)
/sbin/init启动会用到/etc/inittab所定义的条目,如:默认登录级别id:3:initdegault:(这里就是默认启动3级别)
下面就来说一下/etc/inittab所工作那些内容:
/etc/inittab
默认运行级别
0: halt
1: single user mode(单用户维护模式)
2: multi user mode, without NFS(不支持NFS功能)
3: multi user mode,text mode(字符界面)
4: reserved(系统保留)
5: multi user mode, graphic mode(图形界面)
6: reboot(重启)
系统初始化(/etc/rc.d/rc.sysinit)
检测,并以读写方式挂载根文件系统
设定主机名
检测并挂载/etc/fstab中其它文件系统
启动swap分区
初始化外围硬件设备驱动
根据/etc/sysctl.conf设定内核参数
激活udev和selinux
激活LVM和RAID设备
清理过期锁文件和PID文件
装载键映射——>键盘上每个键的功能
运行指定级别的服务脚本
/etc/rc.d/init.d/
/etc/rc.d/rc#.d
rc0-rc6
K* ##只要以K开头文件均执行stop工作
S* ##只要是以S开头的文件均执行start工作
0-99 (执行次序,数字越小先被执行)
init执行/etc/rc.d/rc/local
init执行中断机模拟程序mingetty来启动login进程,最后等待用户登录
下面说一下/etc/inittab格式及语法:
【设置选项】:【runlevel】:【init操作行为】:【命令选项】
设置选项:
代表init主要工作选项
运行级别:
0-6
init操作行为:
initdefault:代表默认运行操作选项
sysinit:代表系统初始话操作选项
ctrlaltdel:代表重启的相关设置
wait:代表上一个命令执行结果后方执行下面的操作
respawn:代表后面字段可以无限制再生(reboot)
命令选项:
一些命令,不过通常都是脚本
init处理流程:
根据/etc/iittab设置进行处理:以默认级别3说明:id:3:initdefault:
default runlevel ——> /etc/rc.d/rc.sysinit ——> /etc/rc.d/rc5.d ——> ctrlatdel ——>set "pf" and "pr" ——> mingetty ——>login
init处理系统初始初始化流程/etc/rc.d/rc.sysinit(设置文件系统环境)
取得网络环境与主机类型——>/etc/sysconfig/network
测试与挂载内存设备/proc及/sys
selinux
启动系统的随机数生成器
设置终端机字体
设置系统启动过程中的欢迎界面
设置系统时间与时区设置/etc/sysconfig/clock
接口设备检测
用户自定义模块加载——./etc/sysconfig/modules/*modules
根据/etc/sysctl.conf设置内核参数
初始化软件磁盘阵列——>/etc/mdadm.conf
初始化LVM文件系统功能
fsck检测磁盘文件系统
磁盘配额
检测,并以读写方式重新挂载根文件系统
清除清除过程当中的临时文件
将启动的相关信息 ——> /var/log/dmesg
启动服务与相关启动配置文件(/etc/rc.d/rc # &/etc/sysconfig )
以默认级别3说明:id:3:initdefault:
l3:3:wait:/etc/rc.d/rc 3
找到/etc/rc.d/rc3.d
以K*开头的文件,并运行/etc/rc.d/rc3.d/K* stop
以S*开头的文件,并运行/etc/rc.d/rc3.d/S* start
/etc/rc.d/rc#.d/里面的文件链接的都是/etc/rc.d/init.d的文件
用户自定义开机启动程序(/etc/rc.d/rc.local)
可以根据自己的需求将一些执行命令或是脚本写到/etc/rc.d/rc.local里,当开机时,就可以加载啦
根据mingetty程序调用login让用户登录->用户登录(完成系统启动)
Linux启动过程中几个重要配置文件的执行过程
Linux 登录后,配置执行顺序为(Debian Serials Capable):/etc/environment -> /etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) -> ~/.bashrc -> /etc/bashrc -> ~/.bash_logout
关于各个文件的作用,在LinuxSir上找到了以下说明:
(1)/etc/environment:此配置文件设置基本的PATH变量,及系统当前语言变量,虽然比较短,但却在系统启动中占据举足轻重的作用,比如如下是我的系统中的内容:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"
LANGUAGE="zh_CN:zh:en_US:en"
LANG="zh_CN.UTF-8"
(2)/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置。
(3)/etc/bash.bashrc: 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取。
(4)~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。
(5)~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。
(6)~/.bash_logout: 当每次退出系统(退出bash shell)时,执行该文件. 另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承 /etc/profile中的变量,他们是"父子"关系。
(7)~/.bash_profile 是交互式、login 方式进入 bash 运行的~/.bashrc 是交互式 non-login 方式进入 bash 运行的通常二者设置大致相同,所以通常前者会调用后者。
原文地址:http://whitley.blog.51cto.com/11489734/1771412