Linux的启动过程

本文,以LINUX 6.0为例:

Linux的启动过程:

1、从计算机IOS到Liunx内核

  BISO自检        计算机在接通电源之后,首先由BISO进行自检,然后依据BISO内设置的引导顺序从硬盘、软盘或CDROM中读入“引导块”。在PC中,引导LINUX的是从BISO中的0xFFFF0开始的。       BISO的第一个步骤就是加电自检,对硬件进行检测。第二个步骤就是进行本地设备的枚举和初始化。给定BISO功能的不同用法之后,BISO由两部分组成:POST代码和运行时服务。 当POST完成之后,它从内存中清理出来,但是BISO服务保留在内存中,目标操作系统可以使用这些服务。要引导一个操作系统,BISO运行时会按照CMOS设置的顺序来搜索处于活动状态并且可以引导的设备。引导的设备可以使软盘、CD-ROM、硬盘上的某个分区、网络上的某个设备、甚至是USB闪存。通常情况下,Linux是从硬盘上引导的,其中主引导记录(MBR)中包含主引导加载程序。当MBR被加载到内存中,BISO就会将控制权交给MBR;
   2、启动GRUB        GRUB是引导加载程序,将引导操作系统,当机器引导它的操作系统时,BISO就会读取引导介质上最前面的扇区,即MBR。多说一点:这里的扇区中:MBR只占用了其中的446个字节,另外的64个字节交给了DPT(Disk Partition Table硬盘分区表),最后两个字节“55,AA”是分区的结束标志。  3、加载内核       当内核映像被加载到内存之后,内核阶段就开始了。       内核映像不是一个可执行的内核,是一个压缩过的内核映像。通常是一个zImage(压缩映像,小于512)或bzImage(大压缩映像,大于512) ,它是提起使用zIlb进行压缩的。在这个内核映像前面是一个例程,它实现少量硬件设置,并对映像中包含的内核进行解压,然后将其放入高端的内存中,如果有出事换RAM磁盘映像,就会将她移动到内存中,并标明以后使用。然后该例程会调用内核,并开始启动内核引导的过程。在GRUB命令行中,可以使用initrd映像引导一个特定的内核:gurb> kernel /bzImage-2.6.14.2        [Linux-bzImage,setup=0x1400,size=0x29672e]gurb> initrd /initrd-2.6.14.2.img        [Linux-initrd @ 0x5f13000, 0xcc199 bytes]grub> bootUncompressing Linux ... Ok ,booting the kernel .如果你不知道引导的内核名称,只需要使用斜线(/),然后按下“Tab”键即可。GURB会显示内核和initrd映像列表。  4、执行init进程      init进程是系统所有进程的起点,内核在完成核内引导以后,即在本线程空间内加载init程序,它的进程号是1。init是所有进程的发起者和控制者,因为在任何基于UNIX的系统中,它都是第一个运行的进程,所以init进程的编号永远是1.如果init出现了问题,系统的其余部分也就随之不可用。      init进程有以下两个作用。      init进程的第一个作用是扮演终结父进程的角色。因为init进程永远不会被终止,所以系统总是可以确信它的存在,并在必要的时候以它为参照。如果某个进程在它衍生出来的全部子进程结束之前被终止,就会出现必须以init为参照的情况。此时那些失去了父进程的子进程就都会以init作为它们的父进程。   init的第二个作用是在进入某个特定的运行级别时运行相应的程序,以此对各种运行级别进行管理。它的这个作用是由/etc/inittab文件定义的。   5、通过/etc/inittab文件进行初始化    Init的工作是根据/etc/inittab来执行相应的脚本,进行系统初始化,如设置键盘、字体、装载模块,设置网络等。   (1)/etc/rc.d/rc.sysinit在init的配置文件中有如下一行:   si::sysinit:/etc/rc.d/rc.sysinit
rc.sysinit是由init执行的第一个脚本,它主要完成一些系统初始化的工作。rc.sysinit是每一个运行级别都要首先运行的重要脚本,它主要完成的工作有:激活交换分区、检查磁盘、加载硬件模块以及其他一些需要优先执行的任务。/etc/rc.d/ rc.sysinit主要完成各个运行模式中相同的初始化工作。包括:
设置初始的$PATH变量;配置网络;为虚拟内存启动交换;调协系统的主机名;检查root文件系统,以进行必要的修复;检查root文件系统的配额;为root文件系统打开用户和组的配额;以读/写的方式重新装载root文件系统;清除被装载的文件系统表/etc/mtab;把root文件系统输入到mtab;使系统为装入模块做准备;查找模块的相关文件;检查文件系统,以进行必要的修复;加载所有其他文件系统;清除/etc/mtab、/etc/fastboot和/etc/nologin;删除UUCP和lock文件;删除过时的子系统文件;删除过时的pid文件;设置系统时钟;激活交换分区;初始化串行端口;装入模块。
(2)/etc/rc.d/rcX.d/[KS]
在rc.sysinit执行后,将返回init,继续执行/etc/rc.d/rc程序。以运行级别5为例,init将执行配置文件inittab中的以下内容:15:5:wait:/etc/rc.d/rc 5
这一行表示以5为参数运行/etc/rc.d/rc,/etc/rc.d/rc是一个shell脚本,它接受5作为参数,去执行/etc/rc.d/rc5.d目录下的所有的rc启动脚本,/etc/rc.d/rc5.d目录中的启动脚本实际上都是一些链接文件,而不是真正的rc启动脚本,真正的rc启动脚本实际上都在/etc/rc.d/init.d目录下。而这些rc启动脚本有着类似的用法,它们一般能接受stat、stop、restart、status等参数。
/etc/rc.d/rc5.d中的rc启动脚本通常是以K或S开头的链接文件,以S开头的启动脚本将以start参数来运行。如果发现相应的脚本也存在K打头的链接,而且已经处于运行状态了(以/var/lock/subsys下的文件作为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。这样做是为了保证当init改变运行级别时,所有相关的守护进程都将重启。
至于在每个运行级中将运行哪些守护进程,用户可以通过chkconfig来自行设定。常见的守护进程如下。
amd:自动安装NFS守护进程。apmd:高级电源管理守护进程。arpwatch:记录日志并构建一个在LAN接口上看到的以太网地址和IP地址对应的数据库。outofs:自动安装管理进程automount,与NFS相关,依赖于NIS。crond:Linux系统下计划任务的守护进程。named:DNS服务器。netfs:安装NFS、Samba和Netware网络文件系统。network:激活已配置网络接口的脚本程序。nfs:打开NFS服务。portmap:RPCportmap管理器,它管理基于RPC服务的连接。sendmail:邮件服务器sendmail。smb:Samba文件共享/打印服务。syslog:一个让系统引导时启动syslog和klogd系统日志守候进程的脚本。xfs:X Window字型服务器,为本地和远程X服务器提供字型集。Xinetd:支持多种网络服务的核心守护进程,可以管理wuftp、sshd、telnet等服务。
这些守护进程启动完毕,rc程序也就执行完了,然后又返回init继续下一步。
(3)执行/etc/ec.d/rc.local
RHEL 4中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚本中的最后一个,所以用户可以自己在这个文件中添加一些需要在其他初始化工作之后、登录之前执行的命令。在维护Linux系统时一般会遇到需要系统管理员对开机或关机命令脚本进行修改的情况。如果所做的修改只在引导开机的时候起作用,并且改动不大的话,可以考虑简单地编辑一下/etc/rc.d/rc.local脚本。这个命令脚本程序是在引导过程的最后一步被执行的。


6、执行/bin/login程序
login程序会提示使用者输入账号及密码,接着编码并确认密码的正确性,如果账号与密码相符,则为使用者初始化环境,并将控制权交给shell,即等待用户登录。
login会接收mingetty传来的用户名作为用户名参数,然后login会对用户名进行分析。如果用户名不是root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。这通常用来在系统维护时防止非root用户登录。只有在/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。/etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。
在分析完用户名后,login将搜索/etc/passwd以及/etc/shadow来验证密码以及设置账户的其他信息,比如:主目录什么、使用何种shell。如果没有指定主目录,则将主目录默认设置为根目录;如果没有指定shell,则将shell类型默认设置为/bin/bash。
Login程序成功后,会向对应的终端再输出最近一次登录的信息(在/var/log/lostlog中有记录),并检查用户是否有新邮件(在/usr/spool/mail的对应用户名目录下),然后开始设置各种环境变量。对于bash来说,系统首先寻找/etc/profile脚本文件并执行它;然后如果用户的主目录中存在.bash_profile文件,就执行它,在这些文件中又可能调用了其他配置文件,所有的配置文件执行后,各种环境变量也设好了,这时会出现大家熟悉的命令行提示符,至此整个启动过程就结束了。

参与0

0同行回答

“答”则兼济天下,请您为题主分忧!

提问者

擅长领域: 服务器Linux大数据

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2013-08-12
  • 关注会员:0 人
  • 问题浏览:1255
  • X社区推广