Linux开机启动顺序
这个图就很完整的介绍了Linux的开机启动顺序
下面我就跟大家详细介绍下开机的一个启动流程
第一步,加载BIOS
当你打开计算机电源的时候,计算机就会首先加载BIOS信息,也就是所谓的加电自检。由此可见BIOS信息是如此的重要,计算机必须首先就找到它。这是因为BIOS中包含了CPU的相关信息、硬盘信息、内存信息、时钟信息、PnP特性等等。加电自检主要由硬件的部分来完成,BIOS被设计为用来初始化硬件组成,POST作为BIOS的组成部分,用于检验电脑硬件基本功能是否正常。如果POST失败,那么这个电脑也就不能使用。
第二步,读取MBR
BIOS加点自检如果确认硬件的基本功能正常后,会产生一个 BIOS 中断 INT 13H,该中断指向某个接入的可引导设备的引导扇区。
众所周知,硬盘上第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小为512字节。里面存放了预启动信息,分区表信息。系统找到MBR后,就会复制0X7c00地址所在的物理内存中。其实被复制到物理内存的内容就是Boot Loader,而具体到你的电脑,那就是lilo或者grub了。
第三步,Boot Loader
而BIOS所找到的包含有效的引导记录的第一个引导扇区将被装载到内存中,并且控制权也将从引导扇区转移到此段代码。
引导扇区是引导加载器真正的第一阶段。大多数 Linux 发行版本使用的引导加载器有三种:GRUB、GRUB2 和 LILO。GRUB2 是最新的,也是相对于其他老的同类程序使用最广泛的。系统通过读取内存中的grub配置信息,并依照此配置信息来启动不同的操作系统。
第四步,加载内核
内核的相关文件位于 /boot 目录下,这些内核文件可以通过其文件名进行识别,其文件名均带有前缀 vmlinuz。你可以列出 /boot 目录中的内容来查看操作系统中当前已经安装的内核。
在选定的内核加载到内存中并开始执行后,在其进行任何工作之前,内核文件首先必须从压缩格式解压自身。
系统会根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。此时,屏幕一般会输出“Uncompressing Linux”的提示。当解压缩内核完成后,屏幕输出“OK, booting the kernel”。
系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。至此,Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了。
第五步,设定运行等级
内核被加载后,第一个运行的程序便是/sbin/init,该文件会读取/etc/inittab文件,并依据此文件来进行初始化工作。
其实/etc/inittab文件最主要的作用就是设定Linux的运行等级,其设定形式是“:id:5:initdefault:”,这就表明Linux需要运行在等级5上。Linux的运行等级设定如下:
0:关机
1:单用户模式
2:无网络支持的多用户模式
3:有网络支持的多用户模式
4:保留,未使用
5:有网络支持有X-Window支持的多用户模式
6:重新引导系统,即重启
第六步,init进程执行rc.sysinit
在设定了运行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,它做的工作非常多,包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。
做好以上一切准备后,系统开始进入用户层的初始化阶段。
第七步,启动内核模块
依据/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块
第八步,执行运行级别目录下rcX.d下的脚本
执行/etc/rc.d/rc和/etc/rc.d/rcX.d目录下的脚本。 X为缺省运行级别。用来完成相应的初始化工作和启动相应的服务。
第九步,执行/etc/rc.d/rc.local
执行用户自定义启动脚本。你可以把你想设置和启动的东西放到这里
第十步,执行/bin/login程序,等待用户登录
此时,系统已经进入到了等待用户输入username和password的时候了,你已经可以用自己的帐号登入系统了
一些因为误操作导致系统无法启动的恢复方法
我们已经了解到了Linux系统的启动流程,而很多重要的启动文件及内核都是放在/boot分区下的,所以/boot分区下的文件很大程度决定了系统能不能正常启动。所以在这里我就跟大家讲几个在centos6中因为误操作导致系统无法正常启动的恢复方法。
1.MBR扇区前446字节被破坏。
当我们使用dd if=/dev/zero of=/dev/sda命令时一不小心破坏了前446字节,当时是没有任何影响的,但是你再次启动机器时会发现变成了这样
它会找不到系统又进入到装系统界面,这时候我们需要进入到救援模式也就是光盘系统
到这里时,系统询问你是否需要启用网络,我们这里不需要就选择NO
这里选择continue
系统会临时把根分区挂载到/mnt/sysimage
到这里我们选择启用shell
进入bash下我们把原来的系统挂载到/mnt/sysimage
输入grub-install命令来修复sda扇区
接着重启系统就能进入系统了
但是我们使用grub-install只能对主引导程序进行修复,而446到512是分区表信息,所以我们如果破坏了512字节必须有备份才能修复,如果没备份那呵呵
2.删除/etc/fstab文件的修复方法
系统开机时会主动读取/etc/fstab这个文件中的内容,根据文件里面的配置挂载磁盘。这样我们只需要将磁盘的挂载信息写入这个文件中我们就不需要每次开机启动之后手动进行挂载了。
而如果我们删了/etc/fstab/文件后再次启动系统就会变成这样
同样,我们也需要进入救援模式,和上个步骤一样,进入shell后我们要临时把主分区挂载到一个目录下
我们再在/etc下创建fstab表
我们在底行模式输入r!blkid把各分区信息调出来在进行编写
因为我已经测试过多次所以对自己分区所挂载的目录都了如指掌,但如果你不清楚也不要紧,也可以手动挂载分区,完成后进入目录下查看文件,就可以知道这个分区所对应的挂载点了。
文件编写完后,重启系统就能进入系统了。
3.删除/boot/目录下的所有文件后的修复
我们知道/boot下存放的是启动Linux的一些核心文件,如果把这些文件删除后是肯定起不来系统的,那么如何修复呢。
删除后我们再次启动机器是这个界面
我们需要明确的是要恢复什么文件,能让系统启动我们需要boot下的内核文件,initd映象文件,以及grub配置文件。
首先我们先来恢复grub目录,这个时候还是要进入救援模式
步骤和前边都一样,这里我们同样需要用grub-install命令去在boot下恢复grub目录
之后我们来恢复内核文件,内核文件可以在我们光盘的rpm包中安装
接着我们用mkinitrd命令去生成initrd映像文件
最后在grub目录下写grub的配置文件grub.conf
我们为了能让系统启动可以只写这些就行了,当然我们也可以在GRUB启动菜单中写,但那个每次开机都需要重新写,所以还是写在配置文件中一劳永逸。
这样我们的系统就能正常启动了。
PS:我们每一次恢复大家进入系统时都会卡一段时间,那是因为系统正对我们新生成的文件进行重打标签,所以会比较慢,如果不想让系统打标签,可以把/etc/selinux/config文件中的SELINUX改为disabled就可以啦
原文地址:http://blog.51cto.com/13438667/2093438