一、BIOS 加电自检BIOS 的工作:1。检测连接硬件,比如显卡,内存,磁盘等等,检测的目的是以后把这些设备信息提供给操作系统2。寻找启动介质,每一种BIOS都会有开机启动菜单,可以在菜单里设置以哪个设备启动系统比如:光驱,硬盘,网络等等,这个菜单可以设置多个选项,依照设置次序在设备上寻找启动信息3。找到了启动介质,接着BIOS就会在介质上找启动扇区,找到内核启动系统。1)先试着寻找第一个扇区,也就是主引导记录MBR(Master Boot Record)2)如果第一个扇区上没有没有存在操作系统,再去寻找标记为BOOT的分区。 不论是MBR还是BOOT分区,存储操作系统的空间都只有446字节;如果没有在上面提到的位置找到操作系统的内核,那么BIOS就无法继续启动工作。 而我们的内核往往会大于446个字节,存放在磁盘的其他位置上,既然446装不下内核,又为了能顺利的找到放在其他位置上的内核,人们想出了一个办法就在446字节里写了一个小程序,当BIOS试着启动操作系统时就会执行这个小程序,然后再由小程序来载入其他位置的内核。这个小程序就是启动载入器(boot loader)。二、Boot Loader Linux的boot loader(上文提到的小程序) grub,它存在于 /boot/grub中。1。GRUB有几个重要的文件,STAGE1、STAGE1。5、STAGE2 STAGE1:它只有512字节,通常放在MBR中,它的作用很简单,就是在系统启动时用于装载STAGE2并将控制权交给它。 STAGE2:GRUB的核心,所有的功能都是由它实现。 STAGE1。5:介于STAGE1和STAGE2之间,是它们的桥梁,因为STAGE2较大,通常都是放在一个文件系统当中的,但是STAGE1并不能识别文件系统格式,所以才需要STAGE1。5来引导位于某个文件系统当中的STAGE2。根据文件系统格式的不同,STAGE1。5也需要相应的文件,如:e2fs_stage1_5,fat_stage1_5,分别用于识别ext和fat的文件系统格式。它存放于1-63的柱面之间。 引导顺序如下:STAGE1->;STAGE1。5->;STAGE2,2。主要的配置文件时 grub。conf
/boot未独立分区:/boot/grub/grub。conf
/boot独立分区:/boot/grub。conf
三、内核启动 内核启动后会向bios查询电脑的所有硬件信息,然后自己接手下来管理这些设备,以便提供给linux使用。 内核会试着驱动这些设备,这些设备的驱动一部分包含在内核中,叫做静态驱动,一部分以模块的方式(动态)存放文件系统中。
由于此时还未挂载任何文件系统,因此还不能使用文件系统中的模块,这里只能驱动在内核中存在的硬件驱动程序的对应设备。想驱动内核中未包含的硬件驱动就需要加载文件系统。 内核会尝试挂载根文件系统,根文件系统至少包含 /etc /bin /sbin /lib /dev 这5大目录,他们5个缺一不可。都会导致系统无法启动 根文件系统挂载是以只读方式挂载的,因为这时linux还在启动阶段,并不稳定,避免破坏系统资料四、启动INIT服务 顺利的挂载了根文件系统后,就会启动init服务内核会按 /sbin/init 、/etc/init 、/bin/init 顺序寻找init程序,如果找不到则内核报错。这里存在一个参数 init=/bin/sh 如果启动时指定了则最后执行/bin/sh,而不会产生内核报错。也被称为快速启动,因为它忽略了很多启动初始化工作。 启动init的目的就是为了初始化系统环境,启动了init就证明了内核已经顺利启动,接下来就由init服务来建立linux使用环境1.读取 /etc/inittab 文件,根据这个文件的信息来进行初始化工作。2.执行三个脚本 /etc/rc.d/rc.sysinit、 /etc/rc.d/rc 、/etc/rc.d/rc.local(1)rc.sysinit 主要的功能用来建立系统的基本环境 启动udev selinux子系统:udev在系统启动时检测并加载/dev中的设备文件,selinux负责增强系统的安全性 设定核心参数 sysctl -p 加载 /etc/sysctl.conf 设定系统时间,将硬件时间设定为系统时间 加载键盘和交换分区 swapon -a -e 设置主机名,挂载文件系统,并将根重新挂载为可读写的 加载动态驱动模块 USB设备与RAID & LVM 卸载 /initrd/ 目录
(2)rc 脚本设置启动级别。linux中有许多不同的启动级别,不同的启动级别会制定不同的服务,根据指定rc的参数会对应执行 /etc/rc.d/rc[0-6].d/ 中的连接脚本文件 以S开头的则启动。(3)rc.local 前两个脚本都是系统至关重要的脚本,如果我们想在启动过程中放置一些其他程序应该使用rc.local脚本中 因为S99local存在于rc[2-5].d中。 三个RC脚本执行完毕后,就会建立虚拟主控制台 执行 /bin/login 就提供了用户登陆界面了。 如果是图形 L5级别的话,会启动X window登录界面,所有的启动就都已经完毕,用户环境初始化,输入用户名和密码系统验证,然后会执行:/etc/profile
~/.bash_profile~/.bashrc
~/.profile
***linux系统启动流程图***