来源: ChinaUnix博客 日期: 2009.05.12 07:02 (共有0条评论) 我要评论 |
Linux系统启动流程 开始-à初始化BIOS-à执行启动加载器--à载入内核--à启动init服务-à结束 开始: 流程分析: 一:初始化BIOS 1:检测所有外部设备 2:寻找启动磁盘 二:执行启动加载器 1:BIOS找到启动磁盘之后,接下来就要启动磁盘里面的操作系统: (1):寻找硬盘的第一个扇区,即主要引导扇区MBR。 (2):如果MBR里面没有操作系统,则寻找磁盘中标注启动分区的第一个扇区的操作系统。 说明:不管是主要启动记录扇区,还是启动分区的第一个扇区,存储操作系统的空间只有446个字节,目前为止,还没有操作系统能够存储在446个字节里面。 如何让BIOS顺利启动存储于其他位置的操作系统,系统开发人员开发了一个小程序,即启动加载器(Boot Loader)。把它存储到了启动扇区的前446个字节里面。当BIOS试图去磁盘的启动扇区去启动操作系统时候,就可以执行这个程序。 然后再由这个小程序来加载存储在其他磁盘的操作系统了。 三:载入内核 当BIOS顺利执行启动加载器后,启动加载器会寻找存储于其他扇区的操作系统。然后启动这个操作系统。 内核启动后,会执行如下操作: 1:linux内核从BIOS那里接管系统所有的硬件信息。以便提供给系统使用。 2:驱动硬件设备 内核要驱动这些硬件设备,就必须加载硬件的驱动程序。 (1):linux的驱动程序分为编译在内核镜像文件中的静态驱动程序和内核模块的动态驱动程序。其中内核模块的动态驱动程序全部存放在根文件系统里。由于此时linux还未挂载根文件系统,因而无法使用存储在根文件系统的内核模块。因此在linux内核阶段只会使用静态的驱动程序,驱动系统必须的硬件设备。但是为了以防万一而导致无法挂载根文件系统,linux系统在启动时候利用initrd这个初始化内存磁盘的机制来启动一些必要的模块。从而加载一些特殊的硬件设备。 (2):initrd(初始化内存磁盘) 系统允许把根文件系统的部分内核模块映射成“初始化内存磁盘(Initial RAM Disk, initrd)”的镜像文件,启动内核时候,再把initrd镜像文件加载到内核,内核便可以从initrd镜像文件加载外设备的模块,再去驱动这些特殊的硬件设备了。这样系统就可以顺利挂载根文件系统并正常启动了。 3:以只读的方式挂载根文件系统。 接着内核会尝试去挂载根文件系统。根文件系统上面的五大目录是缺一不可的。如果缺少一个,系统就无法进一步启动。 /dev/ : 存储设备文件 /etc/ : 存储重要的配置文件 /bin/ :系统开机必须用到得执行 /sbin/ :系统文件 /lib/ :存储/bin/与/sbin/的执行文件所需要的库函数,和内核模块。 其他的目录可以存放于别的文件系统中,/tmp , /usr , /var ,/home 等目录。 挂载根文件系统有两个目的: (1):安装内核模块,以便驱动相关的硬件设备 (2):启动存储于根文件系统中的init服务,以便让init服务接管后续的启动工作。 (3):解读 ro root=LABEL=/ ro 表示一只读方式挂载 root 表示向内核传递root参数告诉内核什么是根文件系统 =LABEL=/ 表示告诉内核以标签名为 =LABEL=/为根文件系统。 四:启动init服务 Linux内核启动的最后一步:就是从根文件系统找出并执行init服务。 Linux内核会顺序去找init服务, /sbin/init---à/bin/init--à/etc/init 如果找不到就执行/bash/sh. 如果找到了就执行init服务,如果找不到的话,内核就会显示这样的报错信息: “………………………… …………………………. Switchroot:mount failed: no such file or directory Kernel panic- not syncing:Attempted to kill init! “ 1:执行init服务 启动init服务的目的,是让init服务来初始化linux的系统环境,init的启动成功就表示linux已经顺利启动了linux的内核。接着就由init服务来建立linux系统的使用环境了。整个系统的启动工作进入了另外一个阶段--------初始化系统环境。 2:初始化系统环境 启动init服务时,init服务会去读取/etc/inittab文件,根据/etc/inittab中设置的数据进行系统初始化的工作。在后续的启动过程中必须按顺序执行一下的几个脚本: /etc/rc.d/rc.sysinit-à/etc/rc.d/rc--à/etc/rc.d/rc.local (1): /etc/rc.d/rc.sysinit 设置系统的基本环境: à启动udev与SElinux子系统 说明:这两个是rc.sysinit最先启动的 à设置内核参数 rc.systinit会执行sysctl –p 读取文件/etc/sysctl.conf来设置linux内核的一些参数。 -à设置系统时间 rc.sysinit将硬件的时间设置为系统时间 -à加载键盘对应表 为了可以使用各式的键盘,rc.sysinit加载了键盘对应表。以便输入正确的字体。 -à启用swap交换空间 rc.sysinit会执行swapon –a –e 命令,以便根据/etc/fsta的设置来启用所有的交换分区。 -à设置主机名 rc.sysinit 会根据/etc/sysconfig/network 的 HOSTNAME的参数来设置linux的主机名 -à检查并挂载所有的文件系统 rc.sysinit会检查并挂载所有的文件系统,以确保这些文件系统的完整性。并将根文件系统的只读参数修改为可写入,以便可以再根文件系统上写入数据 -à初始化硬件设备 驱动剩下的硬件设备,rc.sysinit驱动的设备包括了/etc/modprobe.conf 里面的模块,ISA PnP 的硬件设备,USB设备 -à启用软件磁盘磁盘阵列和LVM -à卸载initrd,以便节省更多的内存空间 -à初始化串行端口 Init服务会管理所有的串行端口设备,比喻:猫,UPS,串行端口控制台. 通过rc.sysinit来初始化系统存在的串行端口的 -à重新设置磁盘参数 (2):/etc/rc.d/rc /etc/rc.d/rc 是用来建立runlevel的环境的。 (3):/etc/rc.d/rc.local /etc/rc.d/rc.local是整个启动过程唯一可以修改的RC script . 说明:必须确认要进入的RUNLEVEL是否启用local服务,如果不会,则系统不会执/etc/rc.d/rc.local的脚本文件。 (4):建立用户接口 Init服务的最后一项工作就是建立系统的用户接口界面 --à建立虚拟控制台 Init服务将会执行/bin/login 程序,以便让用户登陆到系统。 --à建立图形使用接口的登录程序 结束:当你看到了登录界面(字符或图形)的时候,就表示linux系统启动完了所有的流程。 |