导读 | 一直使用linux系统,却对系统启动过程及系统初始化和各种服务的启动不太清楚。今天终于搞明白整个是怎么一回事了。本来想自己写篇文章,刚好在网上看到一篇不错的介绍,很详细,就直接拿来了。 |
Linux系统的启动过程:
BIOS自检 —> grub引导程序 —> 加载内核 —> 执行init —> 启动 —> login登陆系统
系统启动各个阶段的详细介绍:
计算机在接通电源之后首先由BIOS进行POST自检,然后依据BIOS内设置的引导顺序从硬盘、软盘或CDROM中读入引导块。Linux系统是人BIOS中的地址oxFFFF0处开始引导的。BIOS的第1个步骤是加电POST自检。POST的工作是对硬件进行检测。BIOS的第2个步骤是进行本地设备的枚举和初始化。BIOS由两部分组成:POST代码和运行时的服务。当POST完成之后,它被从内存中清理出来,但是BIOS运行时服务依然保留在内存中,目标操作系统可以使用这些服务。
BIOS运行时会按照CMOS的设置定义的顺序来搜索处于活动状态并且可以引导的设备。引导设备可以是软盘、CD-ROM、硬盘上的某个分区、网络上的某个设备甚至是USB闪存。通常,Linux系统都是从硬盘上引导的,其中主引导记录(MBR)中包含主引导加载程序。MBR是一个512字节大小的扇区,位于磁盘上的第一个扇区(0道0柱面1扇区)。当MBR被加载到RAM中之后,BIOS就会将控制权交给MBR。
如果要查看MBR的内容,用户需要以root用户的身份运行如下:
#dd if=//www.3lian.com/dev/had of=mbr.bin bs=512 count=1
读入了1+0个块
输出了1+0个块
#od –xa mbr.bin
… …
它从/dev/had(第一个IDE盘)上读取前512个字节的内容,并将其写入mbr.bin文件中。od会以十六进制和ASCII码格式打印这个二进制文件的内容。
GRUB和LILO都是引导加载程序。引导加载程序用于引导操作系统启动。当机器引导它的操作系统时,BIOS会读取引导介质上最前面的512字节(主引导记录)。在单一的MBR中只能存储一个操作系统的引导记录,所以当需要多个操作系统时就会出现问题,需要更灵活的引导加载程序。
所有引导加载程序都以类似的方式工作,满足共同的目的,但LILO和GRUB之间也有很多不同之处:
LILO没有交互式命令界面,而GRUB拥有;
LILO不支持网络引导,而GRUB支持;
LILO将可以引导操作系统的信息存储在MBR中。
如果修改了LILO配置文件,必须将LILO第一阶段引导加载程序重写到MBR。相对于GRUB,这是一个更为危险的选择,因为错误配置的MBR可能会让系统无法引导。使用GRUB时,如果配置文件配置错误,则只是默认转到GRUB命令行界面。
接下来的步骤就是加载内核映像到内存中,内核映像并不是一个可执行的内核,而是一个压缩过的内核映像。通常它是一个zImage(压缩映像,小于512KB)或是一个bzImage(较大的压缩映像,大于512KB),它是提前使用zlib压缩过的。在这个内核映像前面是一个例程,它实现少量硬件设置,并对内核映像中包含的内核进行解压缩,然后将其放入高端内存中。如果有初始RAM磁盘映像,系统就会将它移动到内存中,并标明以后使用。然后该例程会调用内核,并开始启动内核引导的过程。
init进程是系统所有进程的起点,内核在完成核内引导以后,即在本进程空间内加载init程序,它的进程呈是1。Init进程是所有进程的发起者和控制者。因为在任何基于Linux的系统中,它都是第一个运行的进程,所以init进程的编号(PID)永远是1。
init进程有以下两个作用。
init进程的第一个作用是扮演终结父进程的角色。因为init进程永远不会被终止,所以系统总是可以确信它的存在,并在必要的时候以它为参照。如果某个进程在它衍生出来的全部子进程结束之前被终止,就会出现必须以init为参照的情况。此时那些失去了父进程的子进程就都会以init作为它们的父进程。
init的第二个作用是在进入某个特定的运行级别时运行相应的程序,以此对各种运行级别进行管理。它的这个作用是由/etc/inittab文件定义的。
Init的工作是根据/etc/inittab来执行相应的,进行系统初始化,如设置键盘、字体、装载模块,设置网络等。
1./etc/rc.d/rc.sysinit
在init的配置文件中有如下一行:
si::sysinit:/etc/rc.d/rc.sysinit
原文来自:
本文地址://q13zd.cn/linux-start.html编辑:郝大发,审核员:逄增宝
本文原创地址://q13zd.cn/linux-start.html编辑:public,审核员:暂无