Linux系统的整个启动过程是这样的:

 1.加载 BIOS 的硬件信息,并获取第一个启动设备的编号;

  2.读取第一个设备的MBR的引导加载程序 ( lilo, grub, spfdisk)开机信息; 

  3.加载核心操作系统的核心信息,核心开始解压缩,并且尝试驱动所有硬件设备; 

  4.核心执行init程序并取得run-level 信息; 

  5.init 执行/etc/rc.d/rc.sysinit文件; 

  6.启动核心的外挂式模块 (/etc/modules.conf) 

  7.init执行运行的各个批处理文件; 

  8.init 执行/etc/rc.d/rc.local文件; 

  9.执行 /bin/login 程序; 

  10.登入之后开始以Shell控制主机。

  下面对启动流程进行详细的说明:

一、引导加载程序与核心载入

   整个主机在启动的时候,第一个读取的信息就是BIOS,在BIOS里记录了主板的芯片集与相关的设置,如CPU与接口设备的通信频率、启动设备的搜索顺序、系统时间等信息。机器在读取BIOS,并且了解主要的主机硬件信息后,主机便会开始尝试由存储媒体加载操作系统。BIOS会记录可用来启动的设备搜索顺序,系统开始在第一台启动设备上执行启动程序。这里针对硬盘而言,启动流程读到硬盘的过程中,第一个要读取的就是该硬盘的主引导记录(MBR),系统可以由主要启动区按照的引导加载程序(boot loader)开始执行核心识别的工作。

   通过引导加载程序的管理而开始读取核心文件(Linux系统的核心文件一般在/boot/vmlinuz),并将核心文件加载到主存储器中,同时系统有可能通过initrd建立起虚拟盘,以协助启动过程,最后,将读自BIOS的主机硬件数据交由Linux核心进行检测,并且加载适当的驱动程序。

二、第一个程序init及设置文件/etc/inittabrunlevel

    整个Linux系统中,第一个执行的程序就是/sbin/initInit程序所做的工作相当多,它除了利用设置文件“/etc/inittab”来获取运行等级外,还会通过运行等级的设置值启动不同的服务项目。关于各个运行等级的说明可以通过/etc/inittab文件中的说明来了解。

  下面对/etc/inittab文件以及其中所涉及到的文件进行说明:

  先对/etc/inittab文件的语法进行说明,

  [设置项目][run level][init的操作行为][命令项目]

  a.设置项目:

     最多4个字符,表示init的主要工作项目,只是一个简单的表示说明

   b.运行等级:

     该项目在那些运行等级下执行。

   c.init的操作项目

     主要项目的意义如下:

      initdefault:表示默认的运行等级设置值

      sysinit:表示系统初始化的操作项目

      ctrlaltdel:表示[ctrl]+[alt]+[del]三个按键是否可以重新启动的设置

      wait:表示后面接的命令项目必须要执行完毕,才能继续随后的操作

      respawn:表示后面接的init仍会主动重启

   d.命令项目

     应该可以执行的命令,通常是一些脚本

三、init处理系统初始化流程(/etc/rc.d/rc.sysinit)

   /etc/inittab中有这一句“si::sysinit:/etc/rc.d/rc.sysinit”,这表示:开始加载各项系统服务之前,先做好整个系统环境,主要使用/etc/rc.d/rc.sysinit这个shell脚本来设置系统环境。这个文件的主要工作:

   1. 获取网络环境与主机类型

   2. 测试与载入内存设备/procUSB设备/sys

   3. 决定是否启动SELinux

   4. 接口设备的检测与即插即用(PnP)参数的测试

   5. 用户自定义模块的加载

   6. 加载核心的相关设置

   7. 设置系统时间

   8. 设置终端控制台的字形

   9. 设置RAIDLVM等硬盘功能

   10.fsck检查磁盘文件系统

   11.进行磁盘配额quota的转换

   12.重新以可读取模式载入系统磁盘

   13.启动quota功能

   14.启动系统随机数设备

   15.清除启动过程中的临时文件

   16.将启动相关信息加载到/var/log/dmesg文件中

四、启动系统服务与相关启动设置文件(/etc/rc.d/rc.n/etc/sysconfig)

   经过上面的步骤系统应该已经顺利工作了,只是我们还要启动系统所需要的各项服务,这样主机才能提供相关的网络或主机功能。这个时候,根据我们在/etc/inittab里提到的运行等级设置值,就可以决定启动的服务项目了。各个不同的运行等级服务启动的各个shell脚本放置位置如下所示:

   l0:0:wait:/etc/rc.d/rc 0

   l1:1:wait:/etc/rc.d/rc 1

   l2:2:wait:/etc/rc.d/rc 2

   l3:3:wait:/etc/rc.d/rc 3

   l4:4:wait:/etc/rc.d/rc 4

   l5:5:wait:/etc/rc.d/rc 5

   l6:6:wait:/etc/rc.d/rc 6

    举例来说,运行等级3的启动目录放在/etc/rc.d/rc3.d目录中。我们来看一下,

    [root@redflag ~]# ll /etc/rc.d/rc3.d/

    总用量 448

    lrwxrwxrwx  1 root root 21 2008-01-09  K01tog-pegasus -> ../init.d/tog-pegasus

    lrwxrwxrwx  1 root root 24 2008-01-04  K02NetworkManager -> ../init.d/NetworkManager

    ……

    lrwxrwxrwx  1 root root 15 2008-01-04  K15httpd -> ../init.d/httpd

    lrwxrwxrwx  1 root root 20 2008-01-10  K15postgresql -> ../init.d/postgresql

    lrwxrwxrwx  1 root root 15 2008-01-09  K16rarpd -> ../init.d/rarpd

    lrwxrwxrwx  1 root root 20 2008-01-09  K20bootparamd -> ../init.d/bootparamd

    lrwxrwxrwx  1 root root 24 2008-01-09  K20netdump-server -> ../init.d/netdump-server

wxrwxrwx  1 root root 13 2008-01-04  S90xfs -> ../init.d/xfs

    ……

    lrwxrwxrwx  1 root root 11 2008-01-04  S99local -> ../rc.local

     这个目录下的文件全部都是以SK为开头的文件,而且全部是连接文件,连接到/etc/rc.d/init.d里的shell脚本。(/etc/rc.d/init.d目录其实与/etc/init.d是一样的)以K为开头的文件为启动时需要启动,start”的服务;以K开头的文件为关机时需要关闭的服务。注意这里在SK后面接的数字,表示该文件的执行顺序。

     如果要在运行等级3的环境下执行某个服务,就要将该服务写入/etc/rc.d/rc3.d里,但需要注意该服务必须在/etc/rc.d/init.d里建好了,使用连接的方法连接到/etc/rc.d/rc3.d目录中。要将/etc/rc.d/init.d连接到/etc/rc.d/rc3.d的方法,除了手动建立外,其实都是以chkconfig程序来管理的。这里补充说明一下chkconfig的用法,

    [root@redflag ~]# chkconfig --list 

    [root@redflag ~]# chkconfig [--add|--del] [service_name]

    [root@redflag ~]# chkconfig --level [0123456] [service_name] [on|off]

    范例一:

    [root@redflag ~]#  chkconfig --level 35 atd on

    范例二:自定义一个服务,运行等级35启动,以80S开始以70K结束

    [root@redflg ~]#  vi /etc/init.d/myserver

     #!/bin/bash

     # chkconfig : 35 80 70

     echo “Nothing”

     说明一下第二行,它的语法是:

     chkconfig[runlevels] [start number] [stop number]

     其中runlevels为不同的运行等级状态,start numberstop number则是在/etc/rc.d/rc[35].d内建立的设置文件,文件名为S80myserverK70myserver

     [root@redflag ~]# chkconfig -- add myserver

     [root@redflag ~]# chkconfig --list myserver 

      myserver     0:off   1:off   2:off   3:on    4:off   5:on    6:off

     [root@redflag init.d]# find /etc/rc.d/ -type l | grep 'myserver' | sort

      /etc/rc.d/rc0.d/K70myserver

      /etc/rc.d/rc1.d/K70myserver

      /etc/rc.d/rc2.d/K70myserver

      /etc/rc.d/rc3.d/S80myserver

      /etc/rc.d/rc4.d/K70myserver

      /etc/rc.d/rc5.d/S80myserver

      /etc/rc.d/rc6.d/K70myserver

     [root@redflag init.d]# chkconfig --del myserver

     [root@redflag init.d]# rm /etc/init.d/myserver

      rm: remove regular file `/etc/init.d/myserver'? y

五、用户自定义引导启动程序(/etc/rc.d/rc.local)

  任何想要在启动时就执行的工作,直接写入/etc/rc.d/rc.local,那么该工作就会在启动的时候自动加载,而不必等我们登录系统去启动

六、根据/etc/inittab设置加载终端或X-window界面

   在完成了系统所有服务的启动后,接下来Linux就会启动终端或X-window来等待用户登录。在/etc/inittab内有这么一段。

   # Run gettys in standard runlevels

   1:2345:respawn:/sbin/mingetty tty1

   2:2345:respawn:/sbin/mingetty tty2

   3:2345:respawn:/sbin/mingetty tty3

   4:2345:respawn:/sbin/mingetty tty4

   5:2345:respawn:/sbin/mingetty tty5

   6:2345:respawn:/sbin/mingetty tty6

   # Run xdm in runlevel 5

   x:5:respawn:/etc/X11/prefdm –nodaemon

  这表示在运行等级345时,都会执行/sbin/mingetty,而且执行6(即为什么Linux会提供6个纯文本终端)。注意respawninit表示表示后面接的init仍会主动重启,这说明我们登录tty1终端界面,以exit离开后,系统还是会重新显示等待用户输入画面的界面。在运行等级5时,系统还会运行x:5:respawn:/etc/X11/prefdm -nodaemon

七、其他启动相关事项

  1.关于模块:/etc/modprobe.conf

   虽然核心提供的默认模块已经足够使用,但某些条件下,我们还是要对模块进行一些参数的设计,此时,就要使用/etc/modprobe.conf。我的主机内容如下:

      [root@redflag init.d]# cat /etc/modprobe.conf

   alias eth0 bnx2

   alias eth1 bnx2

   alias scsi_hostadapter mptbase

   alias scsi_hostadapter1 mptscsi

   alias usb-controller ehci-hcd

   意思是说:“eth0表示使用bnx2这个核心模块,scsi_hostadapter使用mptbase这个核心模块。如果你对系统提供的驱动程序模块不满意,才会主动修改这个模块加载的相关文件。

   这里补充说明一下,有时在使用多网卡的时候会出现网卡设备号变动的情况,这个时候可以采用在ifcfg-ethn中通过只要通过网卡的MAC地址,在激活网卡的时候一同绑定来解决。也可以通过在modprobe.conf文件中的设置来解决。

   这里我们可以找到eth0eth1I/OIRQ(linux系统中可以通过 lspci -vv来查看这些信息)

      如:eth0: I/O(0x300) IRQ=5

       eth1: I/O(0x320) IRQ=7

   [root@redflag ~]# vi /etc/modprobe.conf

    alias eth0 bnx2

    alias eth1 bnx2

    options eth0 is=0x300 irq=5

    options eth0 is=0x320 irq=7

   如此一来网卡就有了区分

  2./etc/sysconfig/*

   整个启动过程中,读取的服务相关设置文件都记录在/etc/sysconfig目录下。