##加载BIOS 不管计算机使用何种操做系统,启动的第一步必定是加载BIOS,利用BIOS肯定硬件信息,例如CPU,内存显卡,固然最重要的仍是储存信息和启动顺序,即从哪一个设备加载bootloader。 ##硬盘分区信息加载 传统的MBR:ubuntu
众所周知,硬盘上第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小是512字节,别看地方不大,可里面却存放了预启动信息、分区表信息。 系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0×7c00地址所在的物理内存中。其实被复制到物理内存的内容就是Boot Loader,而具体到你的电脑,那就是lilo或者grub了。缓存
GPT:
GPT通常配合UEFI标准使用,而使用UEFI+GPT分区启动则必须专门为启动而建立一个大约256KB的分区来存储分区表信息。GPT分区在表头仍然会存放一个MBR兼容扇区,用来防止不支持GPT的硬盘管理工具错误识别并破坏硬盘中的数据,这个MBR也叫作保护MBR。在支持从GPT启动的操做系统中,这里也用于存储第一阶段的启动代码。在这个MBR中,只有一个标识为0xEE的分区,以此来表示这块硬盘使用GPT分区表。而后会加载256KB左右的EFI分区,官方名称叫Primary GPT header。从这里读取分区信息。
GPT详细资料网络
##引导程序 如今通常流行的Linux发行版通常都是使用GRUB2做为引导程序。GRUB2实际上是一个miniOS,用来初始化硬件设备、创建内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操做系统内核作好一切准备。而后会读取/boot/grub/grub.cfg配置文件,根据配置信息去硬盘中内核所在的分区加载引导内核。dom
##加载内核 根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操做。此时,屏幕通常会输出“Uncompressing Linux”的提示。当解压缩内核完成后,屏幕输出“OK, booting the kernel”。 系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各类设备,完成Linux核心环境的创建。至此,Linux内核已经创建起来了,基于Linux的程序应该能够正常运行了。ide
PS vmlinuz和initrd模块化
##init初始化inittab
Linux如今有多种init系统,除了SysVinit,还有upstart(ubuntu),systemd(RHEL 7)和openrc(gentoo),这里只讨论普遍使用久经考验的SysVinit。像Systemd甚至已经颠覆了传统Linux运行等级的概念
内核文件加载之后,就开始运行第一个程序 /sbin/init,它的做用是初始化系统环境。
其实/etc/inittab文件最主要的做用就是设定Linux的运行等级,其设定形式是“:id:5:initdefault:”,这就代表Linux须要运行在等级5上。Linux的运行等级设定以下:
0:关机
1:单用户模式(用于系统维护,root从新设定等)
2:无网络支持的多用户模式
3:有网络支持的多用户模式
4:保留,未使用
5:有网络支持有X-Window支持的多用户模式
6:从新引导系统,即重启函数
PS 若是你设置成6,那你就开不了机了,开机就会重启。另外你也能够用init 6
来重启,init 0
来关机工具
##init进程执行rc.sysinit 在设定了运行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,它作的工做很是多,包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等,集中存放在/etc/rc.d/sysinit.测试
根据/etc/rc.d/sysinit的内容大体以下:加密
取得网络环境与主机类型:
读取网络配置档 /etc/sysconfig/network ,取得主机名称与默认通信闸 (gateway) 等网络环境。
测试与挂载内存装置 /proc 及 U盘 装置 /sys:
除挂载内存装置 /proc 以外,还会主动侦测系统上是否具备 usb 的装置, 如有则会主动加载 usb 的驱动程序,而且尝试挂载 usb 的文件系统。
决定是否启动 SELinux :
SELinux 在此时进行一些检测, 而且检测是否须要帮全部的文件从新编写标准的 SELinux 类型 (auto relabel)。
启动系统的乱数产生器
乱数产生器能够帮助系统进行一些口令加密演算的功能,在此须要启动两次乱数产生器。
配置终端机 (console) 字形:
配置显示於启动过程当中的欢迎画面 (text banner);
配置系统时间 (clock) 与时区配置:需读入 /etc/sysconfig/clock 配置值
周边设备的侦测与 Plug and Play (PnP) 参数的测试:
根据核心在启动时侦测的结果 (/proc/sys/kernel/modprobe ) 开始进行 ide / scsi / 网络 / 音效 等周边设备的侦测,以及利用以加载的核心模块进行 PnP 装置的参数测试。
使用者自订模块的加载
使用者能够在 /etc/sysconfig/modules/*.modules 加入自订的模块,则此时会被加载到系统当中
加载核心的相关配置:
系统会主动去读取 /etc/sysctl.conf 这个文件的配置值,使核心功能成为咱们想要的样子。
配置主机名称与初始化电源管理模块 (ACPI)
初始化软件磁盘阵列:主要是透过 /etc/mdadm.conf 来配置好的。
初始化 LVM 的文件系统功能
以 fsck 检验磁碟文件系统:会进行 filesystem check
进行磁碟配额 quota 的转换 (非必要):
从新以可读写模式挂载系统磁碟:
启动 quota 功能:因此咱们不须要自订 quotaon 的动做
启动系统虚拟乱数产生器 (pseudo-random):
清除启动过程中的缓存文件:
将启动相关资讯加载 /var/log/dmesg 文件中。
##启动内核模块 具体是依据/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块。若是你配置可initrd的话,这个步骤在加载内核过程当中也会执行一次。
##执行不一样运行级别的脚本程序 根据运行级别的不一样,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工做和启动相应的服务。这几个脚本分别存放在/etc/rcX.d/中,X对应0到6
##执行/etc/rc.d/rc.local rc.local就是在一切初始化工做后,Linux留给用户进行个性化的地方。你能够把你想设置和启动的东西放到这里。注意必定要加上exit 0
或者错误时返回相应的错误值。
##执行/bin/login程序 简单的说就是启动登录程序,也就是输入用户名密码登录了。