Linux系统--Linux启动过程

CentOS 启动流程:

POST --> Boot Sequence(BIOS) --> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别 -->  运行统初始化脚本 --> 关闭或启动对应级别下的服务 --> 启动终端

        Linux系统--Linux的启动过程_第1张图片

        Linux系统--Linux的启动过程_第2张图片

1.POST:加电自检,检查外围设备是否能正常启动。

2.Boot Sequence(Bios):按一定次序查找引导设备,第一次有引导程序的设备即为本次启动用到的设备,不管系统能不能正常启动。

3.BootLoaderMBR):

MBR:主引导记录,有512个字节组成,前446字节是bootloader64字节的分区表信息,还有2字节的Magical Number

BootLoader:引导加载器,是一个程序。在Windows上使用的是ntloaderLinux上有两种:LILOLInux Loader)和Grub (GRand Unified Bootloader)

功能:提供一个菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压,展开,并把控制权交给内核:

4.kernelramdisk):内核初始化:

探测可识别到的所有硬件设备,加载硬件驱动程序(此时可能会借助于ramdisk加载驱动)已读的方式挂在文件系统;运行进程的第一个应用程序:/sbin/init

ramdisk:本地回环设备文件,把本地文件模拟磁盘或文件系统使用

CentOS 5:/boot/initrd-VERSION-release.img

CentOS 6:/boot/initramfs-VERSION-release.img

initrd 是一个被压缩过的小型根目录,这个目录中包含了启动阶段中必须的驱动模块,可执行文件和启动脚本。当系统启动时,bootloader会把initrd文件读取到内存中,然后把initrd文件在内存中起始地址和大小传递给内核。内核在启动初始化过程中会解压缩initrd文件,然后将解压后的initrd挂载为根目录,然后执行根目录下的/linuxrc脚本,就可以在这个脚本中加载真实文件系统存放的设备驱动程序以及在/dev目录下建立必要的设备结点。这样就可以mount真正的根目录,并且换到根目录中。

5.启动init程序:

加载完内核之后会启动Linux第一个应用程序/sbin/init。在CentOS5,6,7init的程序类型是不相同的。

CentOS5上:是SysV init,配置文件为:/etc/inittab

CentOS6上:是Upstart init,配置文件为:/etc/inittab, /etc/init/*.conf

CentOS7上:Systemd,配置文件为:/usr/lib/systemd/system,/etc/systemd/system

CentOS 5上的/sbin/init :

启动第一个init程序会读取init的配置文件/etc/inittab,并依据此文件来进行初始化工作。/etc/inittab文件主要作用是指定运行级别,执行系统初始化脚本(/etc/rc.d/rc.sysinit,启动相应运行级别下的服务和启动终端。

(1)Linux的运行级别有7级别:0-6

0:关机

1:单用户模式root,不需要登录在此级别下可以修改管理员用户密码,维护模式

2:多用户模式,会启动网络功能,但不会启动NFS;维护模式

3:多用户模式,正常模式;文本界面

4:预留级别:可同3级别;

5:多用户模式,正常模式,图形界面

6:重启

级别的切换:init #

查看运行级别:runlevel 和 who -r

(2)配置文件:/etc/inittab文件内容的格式和各字段的含义:

/etc/inittab文件中每一行定义一种action和与之对应的process,用冒号隔开如:

id:runlevel:action:process

其中action常用的种类有:

wait:切换至某级别运行一次process

respawn:此process终止的话,就重新启动之

initdefault:设置默认运行级别的,process省略

sysinit:设定系统初始化方式,此处一般指定为:/etc/rc.d/rc.sysinit

id:3:initdefault

si::sysinit:/etc/rc.d/rc.sysinit

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

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

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

...

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

tty1:2345:respawn:/usr/sbin/mingetty tty1

tty2:2345:respawn:/usr/sbin/mingetty tty2

其中rc 2表示要读取/etc/rc.d/rc2.d目录下的所有文件,并启动相应的服务。

/etc/rc.d/目录下定义着不同运行级别服务启动脚本所在目录如:rc0.d  rc1.d  rc2.d  rc3.d  rc4.d  rc5.d  rc6.d 。这些目录下的文件都是以KS开头的文件,格式:K{Number}{ServerName}

其中以S开头的文件向脚本传递start参数服务脚本会在开机时运行此脚本(必须设定开机自启动的情况下),K开始的文件向脚本传递stop参数切换此级别时会关闭服务。

K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务;

S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务

chkconfig命令:用来查看,添加和删除服务

查看服务在所有级别的启动或关闭设定情形:

chkconfig [--list] [name]

添加服务:在添加时,Server的服务脚本放置在/etc/rc.d/init.d或/etc/init.d/目录下的。其实在/etc/rc.d/rcX.d/目录的以S和K开头的文件都是连接至此的链接文件。添加服务命令:

chkconfig --add name

其中服务脚本文件中必须有以下一行:

# chkconfig: LLLL SS KK

LLLL表示运行的级别,就是服务在哪些级别下是启动的。省略表示2345级别

SS:表示服务运行的次序

KK:表示服务关闭的次序

删除服务:

# chkconfig --del name

正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本;因此,不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中;

mingettylogin程序,启动终端程序

 

(3)文件/etc/rc.d/rc.sysinit的作用有:

(1) 设置主机名;

(2) 设置欢迎信息;

(3) 激活udevselinux; 

(4) 挂载/etc/fstab文件中定义的文件系统;

(5) 检测根文件系统,并以读写方式重新挂载根文件系统;

(6) 设置系统时钟;

(7) 激活swap设备;

(8) 根据/etc/sysctl.conf文件设置内核参数;

(9) 激活lvmsoftware raid设备;

(10) 加载额外设备的驱动程序;

            (11) 清理操作;

CentOS6上的/init/会读取配置文件/etc/inittab 和 /etc/init/*.conf,文件/etc/inittab设定系统启动的默认级别,而/etc/init目录下所有以.conf结尾的文件是进行执行系统初始化脚本,启动相应运行级别下的服务和启动终端。如以下文件:

        Linux系统--Linux的启动过程_第3张图片

6.到启动终端之后,提供用户登录界面,Linux的启动过程结束。