|
linux CentOS 6的启动流程
linux系统的结构可以分为三个部分:
1.kernel+rootfs(内核与根文件系统)
kernel主要负责进程管理,内存管理,网络管理,驱动程序,文件系统,安全功能等
rootfs:面向用户的根文件系统
2.库:函数集合,编译好的二进制文件,用于在链接阶段同目标代码一起生成可执行文件,不能直接使用,只能用来调用
procedure: 过程调用
函数调用:必须要有返回值即结果
3.程序:依赖于配置文件的可执行应用
接下来我们开始介绍系统的启动流程:
首先我们大概了解一下启动流程:
POST --> Boot Sequence(BIOS) --> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别 --> 系统初始化脚本 --> 关闭或启动对应级别下的服务 --> 启动终端
第一步:POST(Power-on self test):加电自检,其中包括BIOS(Basic Input and Output System)
具体自检项目主要为系统的硬件:CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等
第二步:BOOT Sequence(boot 引导次序):
按次序查找各引导设备,第一个由引导程序的设备即为本次启动用到的设备,找到设备后,会加载主引导记录MBR,大小为512个字节,主要储存预启动信息,分区表信息
注:MBR概括:
bootloader: 主引导记录,占用446位
Partition table:文件系统分区表,占用64位
Magic number:磁盘的有效标志55AA,16进制检测是否存在,占用2位
所以对于磁盘来讲MBR所占用的字节为446+64+2=512位,位于第一块磁盘的前512个字节中,系统BIOS检测到磁盘里MBR以后即找到引导grub,grub就于MBR中
第三步:boot loader引导装载程序,
bootloader为操作系统内核运行的一小段程序,通过初始化硬件设备,建立内存空间的映射图,从而将软硬件环境初始化完成,boot loader有若干种,其中grub,Lilo和spfdisk是常见的boot loader
这里我们选择grub,环境初始化成功后,系统读取内存中的grub配置信息即/boot/grub/grub.conf
第四步:内核初始化(kernel):
根据grub设定的内核映像所在路径,系统读取内存映像并进行解压缩操作此时,屏幕一般会输出“Uncompressing Linux”的提示。当解压缩内核完成后,屏幕输出“OK, booting the kernel”。系统将解压后的内核放置于内存中,并调用start_kernel1()函数来启动一系列初始化函数并初始化各种设备,完成linux核心环境的建立,至此,linux内核建立完成,基于linux程序可以运行
第五步:通过基于用户层的init来设置运行级别:
内核加载后,第一个运行的程序为/sbin/init文件,该文件会读取/etc/inittab文件以完成初始化工作,其中包括设定运行系统的级别:
运行级别:为了系统的运行或维护等应用目的而设定
由0-6,7个级别,分别如下
0:关机
1:单用户模式,(root,无须登陆)singel,维护模式
2:多用户模式,会启动网络功能,但不会启动NFS,维护模式
3: 多用户模式,正常模式:默认为文本界面
4:预留界别;可同3级别
5:多用户模式,正常模式,图形界面;
6:重启
格式为:id:3:initdefault: 意思为当前系统运行级别为3级别
默认级别为3和5
切换级别:init #(#为以上数字级别)
1
2
3
4
| [iyunv@www ~]# init 3#
[iyunv@www ~]# runlevel ; who -r
4 3 #上次使用级别为4 ,当前级别为3
run-level 3 2015-09-02 01:30 last=4
|
查看当前运行级别:runlevel ; who -r
1
2
3
| [iyunv@www ~]# runlevel ; who -r
N 3
run-level 3 2015-09-01 16:59
|
第六步: init进程执行/etc/rc.d/rc.sysinit文件
设定完运行级别后,linux系统将执行第一个用户层文件就是rc.sysinit脚本文件,其中包括网络配置,启动swap,PATH等一些主要程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| [iyunv@www rc.d]# vim rc.sysinit
# Taken in part from Miquel van Smoorenburg's bcheckrc.
#
HOSTNAME=$(/bin/hostname) #主机名
set -m
if [ -f /etc/sysconfig/network ]; then
. /etc/sysconfig/network #加载网卡信息
fi
if [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then
HOSTNAME=localhost
fi
if [ ! -e /proc/mounts ]; then #挂载伪文件系统
mount -n -t proc /proc /proc
mount -n -t sysfs /sys /sys >/dev/null 2>&1
fi
if [ ! -d /proc/bus/usb ]; then #检测是否有sub文件系统,否则创建挂载
modprobe usbcore >/dev/null 2>&1 && mount -n -t usbfs /proc/bus/usb /proc/bus/usb
else
mount -n -t usbfs /proc/bus/usb /proc/bus/usb
fi
#remount /dev/shm to set attributes from fstab #669700
mount -n -o remount /dev/shm >/dev/null 2>&1
#remount /proc to set attributes from fstab #984003
后边省略。。。
|
从上边我们可以看到rc.sysinit脚本加载的程序有很多
第七步: 启动内核模块
具体依据/etc/modules.conf文件或/etc/modules.d目录下文件来装载内核模块
第八步:
执行不同运行级别的脚本程序
根据运行级别的不同,系统会运行rc0.d到rc6.d中相对应的文件来装载内核模块
[iyunv@www boot]# cd /etc/rc.d/
[iyunv@www rc.d]# ls
init.d rc rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.local rc.sysinit
rc 0 --> 意味着将读取/etc/rc.d/rc0.d/的文件:
K*: K##*: #运行次序:数字越小,越先运行
S*:S##*:##运行次序,数字越小,越先运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| [iyunv@www rc.d]# ls
init.d rc rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.local rc.sysinit
[iyunv@www rc.d]# cd rc0.d/
[iyunv@www rc0.d]# ls
K01smartd K50netconsole K80kdump K89rdisc
K05atd K60crond K83bluetooth K90network
K05wdaemon K60nfs K83nfslock K92ip6tables
K10cups K69rpcsvcgssd K83rpcgssd K92iptables
K10psacct K72autofs K84NetworkManager K95firstboot
K10saslauthd K73winbind K84wpa_supplicant K99cpuspeed
K15htcacheclean K74acpid K85mdmonitor K99lvm2-monitor
K15httpd K74haldaemon K85messagebus K99rngd
K16abrt-ccpp K74ntpd K87irqbalance K99sysstat
K16abrtd K75blk-availability K87restorecond S00killall
K25sshd K75netfs K87rpcbind S01halt
K30postfix K75ntpdate K88auditd
K30spice-vdagentd K75quota_nld K88rsyslog
K50dnsmasq K75udev-post K89portreserve
|
第九步: 执行/etc/rc.d/rc.local文件
这个文件主要为系统初始化进入工作后,用户可以自定义个性化的一步
第十步:执行/bin/login程序,进入登陆状态
此时,系统就到达了登陆用户界面,输入uername和password即可登陆系统
启动流程到此结束,,启动流程中间会有好多复杂的函数库调用,这里以后慢慢补充吧!累了。。。。
|
|