Linux系统的启动过程

Linux系统的启动需要经过多个过程,本节详细讲述它的启动过程。
13.1.1  BIOS自检
计算机在接通电源之后首先由BIOS进行POST自检,然后依据BIOS内设置的引导顺序从硬盘、软盘或CDROM中读入引导块。Linux系统是从BIOS中的地址0xFFFF0处开始引导的。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=/dev/hda of=mbr.bin bs=512 count=1
读入了 1+0 个块
输出了 1+0 个块
#od -xa mbr.bin
0000000 48eb 1090 d08e 00bc b8b0 0000 d88e c08e
          k   H dle dle  so   P   0000020 befb 7c00 00bf b906 0200 a4f3 21ea 0006
          {   > nul   |   ? nul ack   9 nul stx   s   $   j   ! ack nul
0000040 be00 07be 0438 0b75 c683 8110 fefe 7507
        nul   >   > bel   8 eot   u  vt etx   F dle soh   ~   ~ bel   u
0000060 ebf3 b416 b002 bb01 7c00 80b2 748a 0203
          s   k syn   4 stx   0 soh   ; nul   |   2 nul  nl   t etx stx
0000100 0080 8000 e441 0000 0800 80fa 80ca 53ea
        nul nul nul nul   A   d nul nul nul  bs   z nul   J nul   j   S
0000120 007c 3100 8ec0 8ed8 bcd0 2000 a0fb 7c40
          | nul nul   1   @  so   X  so   P   0000140 ff3c 0274 c288 be52 7d79 34e8 f601 80c2
             y   }   h   4 soh   v   B nul
0000160 5474 41b4 aabb cd55 5a13 7252 8149 55fb
          t   T   4   A   ;   *   U   M dc3   Z   R   r   I soh   {   U
0000200 75aa a043 7c41 c084 0575 e183 7401 6637
          *   u   C  sp   A   | eot   @   u enq etx   a soh   t   7   f
0000220 4c8b be10 7c05 44c6 01ff 8b66 441e c77c
         vt   L dle   > enq   |   F   D del soh   f  vt  rs   D   |   G
0000240 1004 c700 0244 0001 8966 085c 44c7 0006
        eot dle nul   G   D stx soh nul   f  ht   \  bs   G   D ack nul
0000260 6670 c031 4489 6604 4489 b40c cd42 7213
          p   f   1   @  ht   D eot   f  ht   D  ff   4   B   M dc3   r
0000300 bb05 7000 7deb 08b4 13cd 0a73 c2f6 0f80
        enq   ; nul   p   k   }   4  bs   M dc3   s  nl   v   B nul  si
…………………………………………………………………     
它从/dev/hda(第一个IDE盘)上读取前512个字节的内容,并将其写入mbr.bin文件中。od命令会以十六进制和ASCII码格式打印这个二进制文件的内容。
13.1.2  启动GRUB/LILO
GRUB和LILO都是引导加载程序。引导加载程序用于引导操作系统启动。当机器引导它的操作系统时,BIOS会读取引导介质上最前面的512字节(主引导记录)。在单一的MBR中只能存储一个操作系统的引导记录,所以当需要多个操作系统时就会出现问题,需要更灵活的引导加载程序。
所有引导加载程序都以类似的方式工作,满足共同的目的,但LILO和GRUB之间也有很多不同之处:
l     LILO没有交互式命令界面,而GRUB拥有;
l     LILO不支持网络引导,而GRUB支持;
l     LILO将可以引导操作系统位置的信息存储在MBR中。
如果修改了LILO配置文件,必须将LILO第一阶段引导加载程序重写到MBR。相对于GRUB,这是一个更为危险的选择,因为错误配置的MBR可能会让系统无法引导。使用GRUB时,如果配置文件配置错误,则只是默认转到GRUB命令行界面。
13.1.3  加载内核
接下来的步骤就是加载内核映像到内存中,内核映像并不是一个可执行的内核,而是一个压缩过的内核映像。通常它是一个zImage(压缩映像,小于512KB)或是一个bzImage(较大的压缩映像,大于512KB),它是提前使用zlib压缩过的。在这个内核映像前面是一个例程,它实现少量硬件设置,并对内核映像中包含的内核进行解压缩,然后将其放入高端内存中。如果有初始RAM磁盘映像,系统就会将它移动到内存中,并标明以后使用。然后该例程会调用内核,并开始启动内核引导的过程。
13.1.4  执行init进程
init进程是系统所有进程的起点,内核在完成核内引导以后,即在本进程空间内加载init程序,它的进程号是1。init进程是所有进程的发起者和控制者。因为在任何基于Linux的系统中,它都是第一个运行的进程,所以init进程的编号(PID)永远是1。
init进程有以下两个作用。
init进程的第一个作用是扮演终结父进程的角色。因为init进程永远不会被终止,所以系统总是可以确信它的存在,并在必要的时候以它为参照。如果某个进程在它衍生出来的全部子进程结束之前被终止,就会出现必须以init为参照的情况。此时那些失去了父进程的子进程就都会以init作为它们的父进程。
init的第二个作用是在进入某个特定的运行级别时运行相应的程序,以此对各种运行级别进行管理。它的这个作用是由/etc/inittab文件定义的。
13.1.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主要完成各个运行模式中相同的初始化工作,包括:
l     设置初始的$PATH变量;
l     配置网络;
l     为虚拟内存启动交换;
l     设置系统的主机名;
l     检查root文件系统,以进行必要的修复;
l     检查root文件系统的配额;
l     为root文件系统打开用户和组的配额;
l     以读/写的方式重新装载root文件系统;
l     清除被装载的文件系统表/etc/mtab;
l     把root文件系统输入到mtab;
l     使系统为装入模块做准备;
l     查找模块的相关文件;
l     检查文件系统,以进行必要的修复;
l     加载所有其他文件系统;
l     清除/etc/mtab、/etc/fastboot和/etc/nologin;
l     删除UUCP的lock文件;
l     删除过时的子系统文件;
l     删除过时的pid文件;
l     设置系统时钟;
l     激活交换分区;
l     初始化串行端口;
l     装入模块。
2./etc/rc.d/rcX.d/[KS]
在rc.sysinit执行后,将返回init,继续执行/etc/rc.d/rc程序。以运行级别5为例,init将执行配置文件inittab中的以下内容:
l5: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启动脚本有着类似的用法,它们一般能接受 start、stop、restart、status等参数。
/etc/rc.d/rc5.d/中的rc启动脚本通常是以K或S开头的链接文件,以S开头的启动脚本将以start参数来运行。如果发现相应的脚本也存在K打头的链接,而且已经处于运行态了(以/var/lock/subsys/下的文件作为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。这样做是为了保证当init改变运行级别时,所有相关的守护进程都将重启。
至于在每个运行级中将运行哪些守护进程,用户可以通过chkconfig来自行设定。常见的守护进程如下。
l     amd:自动安装NFS守护进程。
l     apmd:高级电源管理守护进程。
l     arpwatch:记录日志并构建一个在LAN接口上看到的以太网地址和IP地址对应的数据库。
l     autofs:自动安装管理进程automount,与NFS相关,依赖于NIS。
l     crond:Linux系统下计划任务的守护进程。
l     named:DNS服务器。
l     netfs:安装NFS、Samba和NetWare网络文件系统。
l     network:激活已配置网络接口的脚本程序。
l     nfs:打开NFS服务。
l     portmap:RPC portmap管理器,它管理基于RPC服务的连接。
l     sendmail:邮件服务器sendmail。
l     smb:Samba文件共享/打印服务。
l     syslog:一个让系统引导时启动syslog和klogd系统日志守候进程的脚本。
l     xfs:X Window字型服务器,为本地和远程X服务器提供字型集。
l     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脚本。这个命令脚本程序是在引导过程的最后一步被执行的。
13.1.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/lastlog中有记录),并检查用户是否有新邮件(在/usr/spool/mail/的对应用户名目录下),然后开始设置各种环境变量。对于bash来说,系统首先寻找/etc/profile脚本文件并执行它;然后如果用户的主目录中存在.bash_profile文件,就执行它,在这些文件中又可能调用了其他配置文件,所有的配置文件执行后,各种环境变量也设好了,这时会出现大家熟悉的命令行提示符,至此整个启动过程就结   束了。

图13.1所示为整个Linux系统的启动过程。




本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/7362/showart_1327919.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值