您的位置:首页 > 运维架构 > Linux

linux系统启动流程

2015-09-03 08:11 429 查看
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 #(#为以上数字级别)

[root@www ~]# init 3#
[root@www ~]# runlevel ; who -r
4 3   #上次使用级别为4 ,当前级别为3
run-level 3  2015-09-02 01:30   last=4
查看当前运行级别:runlevel ; who -r

[root@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等一些主要程序

[root@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中相对应的文件来装载内核模块
[root@www boot]# cd /etc/rc.d/
[root@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##*:##运行次序,数字越小,越先运行

[root@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
[root@www rc.d]# cd rc0.d/
[root@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即可登陆系统

启动流程到此结束,,启动流程中间会有好多复杂的函数库调用,这里以后慢慢补充吧!累了。。。。

本文出自 “开源盛世” 博客,请务必保留此出处http://zhaohongfei.blog.51cto.com/6258685/1691048
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: