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 -mif [ -f /etc/sysconfig/network ]; then . /etc/sysconfig/network #加载网卡信息fiif [ -z "$HOSTNAME" -o "$HOSTNAME" = "(none)" ]; then HOSTNAME=localhostfiif [ ! -e /proc/mounts ]; then #挂载伪文件系统 mount -n -t proc /proc /proc mount -n -t sysfs /sys /sys >/dev/null 2>&1fiif [ ! -d /proc/bus/usb ]; then #检测是否有sub文件系统,否则创建挂载 modprobe usbcore >/dev/null 2>&1 && mount -n -t usbfs /proc/bus/usb /proc/bus/usbelse mount -n -t usbfs /proc/bus/usb /proc/bus/usbfi#remount /dev/shm to set attributes from fstab #669700mount -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]# lsinit.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]# lsinit.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]# lsK01smartd K50netconsole K80kdump K89rdiscK05atd K60crond K83bluetooth K90networkK05wdaemon K60nfs K83nfslock K92ip6tablesK10cups K69rpcsvcgssd K83rpcgssd K92iptablesK10psacct K72autofs K84NetworkManager K95firstbootK10saslauthd K73winbind K84wpa_supplicant K99cpuspeedK15htcacheclean K74acpid K85mdmonitor K99lvm2-monitorK15httpd K74haldaemon K85messagebus K99rngdK16abrt-ccpp K74ntpd K87irqbalance K99sysstatK16abrtd K75blk-availability K87restorecond S00killallK25sshd K75netfs K87rpcbind S01haltK30postfix K75ntpdate K88auditdK30spice-vdagentd K75quota_nld K88rsyslogK50dnsmasq K75udev-post K89portreserve
第九步: 执行/etc/rc.d/rc.local文件
这个文件主要为系统初始化进入工作后,用户可以自定义个性化的一步第十步:执行/bin/login程序,进入登陆状态 此时,系统就到达了登陆用户界面,输入uername和password即可登陆系统启动流程到此结束,,启动流程中间会有好多复杂的函数库调用,这里以后慢慢补充吧!累了。。。。