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核心进行检测,并且加载适当的驱动程序。
整个Linux系统中,第一个执行的程序就是/sbin/init。Init程序所做的工作相当多,它除了利用设置文件“/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.命令项目
应该可以执行的命令,通常是一些脚本
/etc/inittab中有这一句“si::sysinit:/etc/rc.d/rc.sysinit”,这表示:开始加载各项系统服务之前,先做好整个系统环境,主要使用/etc/rc.d/rc.sysinit这个shell脚本来设置系统环境。这个文件的主要工作:
1. 获取网络环境与主机类型
2. 测试与载入内存设备/proc及USB设备/sys
3. 决定是否启动SELinux
4. 接口设备的检测与即插即用(PnP)参数的测试
5. 用户自定义模块的加载
6. 加载核心的相关设置
7. 设置系统时间
8. 设置终端控制台的字形
9. 设置RAID与LVM等硬盘功能
10.以fsck检查磁盘文件系统
11.进行磁盘配额quota的转换
12.重新以可读取模式载入系统磁盘
13.启动quota功能
14.启动系统随机数设备
15.清除启动过程中的临时文件
16.将启动相关信息加载到/var/log/dmesg文件中
经过上面的步骤系统应该已经顺利工作了,只是我们还要启动系统所需要的各项“服务”,这样主机才能提供相关的网络或主机功能。这个时候,根据我们在/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 |
这个目录下的文件全部都是以S、K为开头的文件,而且全部是连接文件,连接到/etc/rc.d/init.d里的shell脚本。(/etc/rc.d/init.d目录其实与/etc/init.d是一样的)以K为开头的文件为启动时需要“启动,start”的服务;以K开头的文件为关机时需要关闭的服务。注意这里在S与K后面接的数字,表示该文件的执行顺序。
如果要在运行等级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 范例二:自定义一个服务,运行等级3、5启动,以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 number与stop number则是在/etc/rc.d/rc[35].d内建立的设置文件,文件名为S80myserver及K70myserver [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 |
这表示在运行等级3、4、5时,都会执行/sbin/mingetty,而且执行6个(即为什么Linux会提供6个纯文本终端)。注意respawn的init表示“表示后面接的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文件中的设置来解决。
这里我们可以找到eth0和eth1的I/O与IRQ(在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目录下。