本文共 4020 字,大约阅读时间需要 13 分钟。
任何系统必然电源加电,计算机硬件会主动的读取BIOS来加载硬件信息以及进行硬件设备的自我检测,之后系统会主动的读取第一个有引导程序的设备,该引导程序可以指定使用那个内核来启动,并将其加载至内存当中运行,同时内核还要加载其他硬件设备以及对应驱动程序,来使主机各个组件开始运行,等所有硬件设备完全加载完成后,稍后系统会操作一些外部程序准备软件环境,加载系统运行所需要的软件程序,等待用户登陆操作。
> POST --> Boot Sequence --> bootloader(MBR) --> Kernel --> 加载rootfs --> switchroot --> /sbin/init --> (配置文件:/etc/inittab, /etc/init/.conf) --> 根据init配置文件设置默认运行级别 --> 运行系统初始化脚本/etc/rc.d/rc.sysinit,完成系统初始化 --> 开启或关闭用户选定的对应运行级别下所对应的服务 --> 启动终端,打印登录提示符。
检测各个外围硬件设备是否存在而且能够正常运行起来,自检功能的是固化在主板上的ROM芯片上的BIOS程序;BIOS即基本输入输出系统实现,它是装载与一个硬件芯片CMOS之上,过程就是给CMOS通电,然后启动其上的BIOS程序,BIOS程序会根据CMOS上面的一些配置信息区读取其他的硬件设备信息并检测是否存在并能正常运行,之后进行硬件设备的初始化。BIOS会检测CPU以及I/O设备是否能够正常运行。CPU就会自动去加载ROM芯片上的BIOS程序,检测完成之后就进行硬件设备的初始化。
选择要启动的硬件设备,选择之后就可以读取这个设备上位于MBR里头的Boot Loade。根据BIOS中对启动顺序的设定,BIOS自己会依次扫描各个引导设备,然后第一个被扫描到具有引导程序的设备就被作为要启动的引导设备。硬件设备初始化之后,BIOS会列出可以启动的装置顺序,开始读取第一个可以启动的设备中操作系统的核心文件,由于不同的操作系统其文件格式不同,为了避免格式信息的不兼容,要以一个启动管理程序来处理这些核心文件的加载问题:Boot Loader。Boot Loader是一个程序,依赖于一个硬件硬盘第一个可以启动的硬盘的第一个扇区内的MBR当中。
Boot Loader 识别加载操作系统中的核心文件,提交到内存中运行,启动对应的操作系统。磁盘分区都有一块儿启动扇区,启动扇区用来为操作系统安装Boot Loader。操作系统会默认安装一份Boot Loader到他的根目录所在分区的扇区当中。在linux系统安装时,会提示我们是否将Boot Loader安装到MBR上去,如果选择安装到MBR的话,理论上在MBR和对应分区上的启动扇区上同时都有一份Boot Loader程序。BIOS通过读取并执行启动设备的MBR中的Boot Loader,Boot Loader提供一个菜单给用户,让用户去选择要启动的系统或不同的内核版本,然后把用户选择的内核版本加载至RAM中的特定空间,接着在RAM中解压、展开,而后把系统控制权移交给内核。grub是Boot Loader中的一种,为了打破在MBR中只有446Bytes用于存放Boot Loader这一限制。
grub三个阶加载内核:
stage1:运行Boot Loader主程序安装在启动区MBR中,MBR空间有限,在MBR中仅安装bootloader最小主程序,并没有安装相关配置文件。存放于MBR的前446Bytes,用于加载stage1.5阶段,目的是为了识别并驱动stage2所在分区的文件系统; stage1.5:在MBR随后的扇区存放,加载stage2所在分区的文件系统驱动,让stage1中的bootloader能识别stage2所在分区的文件系统,主要用于与stage所在分区的文件系统进行交互。 stage2:存放于磁盘分区之上,具体存放于/boot/grub目录之下,主要用于加载内核文件以及ramdisk这个临时根文件系统。通过Boot Loader加载所有配置文件以及相关环境参数信息。
BIOS加载硬盘中的Boot Loader,而Boot Loader自身加载后识别主机的硬盘设备;能够识别硬盘设备不代表能够识别硬盘设备中的文件系统,文件系统是额外附加的一层软件组织的文件结构,所以要对接一种文件系统,就必须要有文件系统驱动。而stage1.5就是向grub提供文件系统驱动的。kernel和initrd的文件路径均以grub的根作为起始目录,且存放于stage2所在分区上;stage2、内核以及ramdisk文件通常放置于一个基本磁盘分区之上,因为grub无法驱动lvm、高级软raid等复杂逻辑设备,除非提供一个复杂的驱动接口,否则如果stage2及内核等文件都存放在lvm等复杂逻辑设备上将无法被stage1所识别。
Kerenl在得到系统控制权之后,首先要进行自身初始化,而初始化的主要作用是:
(1)探测可识别到的所有硬件设备; (2)加载硬件驱动程序,即加载真正的根文件系统所在设备的驱动程序; (3)以只读方式挂载根文件系统; (4)运行用户空间的第一个应用程序:/sbin/init;
ramdisk和内核是由bootloader一同加载到内存当中的,ramdisk是用于实现系统初始化的、基于内存的磁盘设备,即加载至内存后把内存当磁盘使用,并在内存中作为临时根文件系统提供给内核使用,帮助内核挂载真正的根文件系统。而之所以能够帮助内核挂载根文件系统是因为在ramdisk这个临时文件系统的/lib/modules目录下有真正的根文件系统所在设备的驱动程序。
在Boot Loader开始读取操作系统内核文件后,将内核文件解压缩后装在到内存当中,然后根据内核提供的功能开始测试与加载各个设备。虚拟文件系统特点:能够通过Boot Loader程序将其加载到内存当中,然后这个文件会被解压缩并且在内存中模拟一个根系统,这个根目录系统能够提供一个可以运行的程序,通过该程序可以加载在启动过程当中所需要的核心模块。 Boot Loader可以加载kernel与initrd,然后在内存中让initrd解压缩成根目录,然后内核可以在这个虚拟的根文件系统之上加载合适的驱动程序,来加载硬盘等设备,之后释放虚拟的跟文件系统,并以只读方式挂载磁盘上真是的根文件系统。启动用户空间第一个执行程序/sbin/init
内核、硬件及驱动信息加载完毕后,内核会呼叫用户控件的第一个执行程序/sbin/init,init程序主要功能是尊卑软件运行环境,包括系统的主机名称、网络配置、文件系统格式等其他服务的启动管理。这些所有操作都是通过init的配置文件来定义。init这个初始化程序会根据其配置文件执行一系列操作。/sbin/init --> 根据init配置文件设置默认运行级别 --> 运行系统初始化脚本/etc/rc.d/rc.sysinit,完成系统初始化 --> 关闭或启动用户选定的默认运行级别所对应的服务 --> 启动终端,打印登录提示符
CentOS 5初始化程序init是SysV init,其配置文件为:/etc/inittab;
CentOS 6初始化程序init是upstart,其配置文件为:/etc/inittab, /etc/init/.conf; CentOS 7初始化程序init是systemd,其配置文件为:/usr/lib/system/systemd/, /etc/systemd/system/;运行级别:
0:关闭所有服务,关机; 1:单用户模式:不需要通过认证,允许root用户直接登陆而无需认证; 2:多用户模式:需要用户认证,会启动网络功能,但不支持使用启动NFS; 3:多用户模式:为完全功能模式,提供文本界面; 4:预留级别,目前无特别使用目的; 5:多用户模式:为完全功能模式,提供图形界面; 6:重启模式,reboot;
default=0
设定默认启动的内核或操作系统,0表示定义的第一个title系统timeout=5表示可供选择的等待时间,超时时长则使用默认启动条目splashimage=(hd0,0) /grub/splash.xpm.gz启动时的背景图片信息title CentOS 6 (2.6.32-696.el6.x86_64)定义操作系统的名称root (hd0,0) 指明引导当前操作系统或内核文件所在的分区kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=/dev/sda2内核文件路径、根文件系统所在设备,以及传递给内核的参数initrd /initramfs-2.6.32-696.el6.x86_64.img指明用于辅助内核完成系统启动的ramdisk文件路径再次在内存缓存
转载于:https://blog.51cto.com/10681635/2090486