CentOS 5和6的启动流程

CentOS 5和6的启动流程:

Linux:kernel + rootfs

kernel:进程管理,内存管理,网络管理,驱动程序,文件系统,安全功能

 

rootfs:glibc(gun c 标准库)

 

库:

函数集合,function,调用接口(功能名)

过程调用:procedure,无返回值

函数调用:function,有返回值

 

程序:

内核设计流派:

单内核设计:Linux,把所有功能集成同一个程序

 

微内核设计:Windows,Solaris,每种功能使用一个单独子系统实现

 

liunx内核特点:

支持模块化:.ko(被内核调用) .so(用户空间库名)

支持模块的动态装载和卸载

 

组成部分:

核心文件:/boot/vmlinuz-VERSION-release

模块文件:/lib/modules/VERSION-release

 

ramdisk:基于内存的磁盘,辅助内核驱动磁盘

CentOS 5:/boot/initrd_VERSION-release.img (模拟成硬盘)

 

CentOS 6:/boot/initramfs-VERSION-release.img (模拟成文件系统)

 

CentOS系统启动流程:

POST:加电自检:

ROM:CMOS

BIOS:Basic Input and Output System

 

ROM + RAM

 

BOOT Sequence:

按次序查找各引导设备,第一个有引导程序的设备即为本次启动用到的设备

 

bootloader:引导加载器,程序

windows:ntloader

 

Linux:

LILO:LInux LOader

 

GRUB:GRand Uniform Bootloader

GRUB 0.x:GRUB legacy (CentOS 5,6)

GRUB 1.x:GRUB2 (CentOS 7)

 

引导加载器:找到操作系统所在的磁盘分区,把内核加载至内存中,并将控制权正常转交给内核的程序,以硬盘为例,引导加载器放在其MBR中

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

 

MBR:

446:bootloader

64:fat 文件分配表

2:55AA

 

GRUB:

bootloader:1st stage (找到硬盘中的第二阶段)

disk:2nd stage

 

kernel:

自身初始化:

探测可识别到的所有硬件设备

加载硬件驱动程序:(有可能会借助于ramdisk加载驱动)

以只读方式挂载根文件系统

运行用户空间的第一个应用程序:/sbin/init

 

init程序的类型:

SysV:init,CentOS 5 配置文件 /etc/inittab

upstart:init,CentOS 6 配置文件 /etc/inittab,/etc/init/*.conf

systemd:systemd,CentOS 7 配置文件 /usr/lib/systemd/system, /etc/systemd/system

 

ramdisk:

内核中的特性之一:使用缓冲和缓存来加速对磁盘上文件的访问:

 

启动时内核加载根文件系统,但根文件系统所在设备,

内核可能无法驱动,因为驱动程序在根文件系统上,

所以借助于ramdisk协助完成对于所需要和依赖的驱动程序的加载,

加载完成后,切换到真正的根

 

ramdisk -> ramfs

由于ramdisk模拟成硬盘,所以有可能被缓冲两次,内核认为任何磁盘都比较慢,

所以会把ramdisk缓存到内存中,但ramdisk本身就在内存中,

等于存了两次,所以CentOS 6采用ramfs

 

ramdisk在CentOS 5:initrd,利用mkinitrd生成

ramfs在CentOS 6:initramfs 工具程序:mkinitrd(不怎么用),dracut(一般使用此工具)

 

系统初始化:

POST--Bootsequence(BIOS)--Bootloader(MBR)--kernel(ramdisk)--rootfs(以只读方式加载根文件系统)--init

 

/sbin/init

CentOS 5:

运行级别:为了系统的运行或维护等应用目的而设定

0-6:7个级别

0:关机

1:单用户模式,single,维护模式,root,无须登陆

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

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

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

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

6:重启

 

默认级别:3,5

 

切换级别:init #(级别数字)

 

查看级别:runlevel;who -r

 

配置文件:/etc/inittab

每一行定义一种action以及与之对应的process

id:runlevel:action:process (id可以使用任意名称,保证每行不一样就成)

例:id:3:initdefault:

 

action:

wait:切换至此级别运行一次

respawn:此process终止,就重新启动之
initdefault:设定默认运行级别:process省略

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

 

# si::sysinit:/etc/rc.d/rc.sysinit 运行级别为空,表示所有级别

# l0:0:wait:/etc/rc.d/rc 0

# l1:1:wait:/etc/rc.d/rc 1

.

.

.

# l6:6:wait:/etc/rc.d/rc 6

 

说明:rc 0 -- 意味着读取/etc/rc.d/rc0.d

 

K*:K##* K开头意味着此级别关闭 K后数字越小,越先运行,数字越小的服务,为越依赖别的服务的服务

S*:S##* S开头意味着此级别开启 S后数字越小,越先运行,数字越小的服务,为越被依赖的服务

 

在/etc/rc.d/init.d中有对应的脚本,在每个级别的rc.d文件中都有选择开启和关闭的脚本

 

chkconfig命令:

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

chkconfig [--list] [name]

 

添加:

sysV的服务脚本放置于/etc/rc.d/init.d(/etc/init.d)

 

chkconfig --add name

 

#!/bin/bash

#

# chkconfig: L mm nn

L:0-6 写那个数那个级别为S,如果为"-"表示所有级别都不为S

mm:为S后数字

nn:为K后数字

 

删除:

chkconfig --del name  脚本还在只是在各运行级别中删除

 

修改指定的链接类型:

chkconfig [--level levels] name <on|off|reset>

--level L:指定要设置的级别,默认为2345

 

注意:想在开机时运行但不方便写成脚本放在/etc/rc.d/init.d中的使用chkconfig控制,但又想开机运行的命令,

可以写在/etc/rc.local或/etc/rc.d/rc.local

 

注意:正常级别下,最后启动的一个服务S99local没有链接至/etc/rc.d/init.d中的一个服务脚本,

而是指向了/etc/rc.d/rc.local脚本;因此,不便或不需写为服务脚本放置于/etc/rc.d/init.d目录中,

且又想开机自动运行的命令,可以写入/etc/rc.d/rc.local文件中

 

启动虚拟终端:

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

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

.

.

.

tty6:2345:respawn:/usr/sbin/mingetty  tty6

 

mingetty会调用login程序

 

/etc/rc.d/rc.sysinit:系统初始化脚本

(1)设置主机名

(2)设置欢迎信息

(3)激活udev和seLinux

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

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

(6)设置系统时钟

(7)激活swap设备

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

(9)激活lvm及software raid设置

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

(11)清理操作

 

总结:/sbin/init -- (/etc/inittab)-- 设置默认运行级别 -- 运行系统初始脚本,完成系统初始化 -- 关闭对应级别下需要关闭

的服务,启动需要启动的服务 -- 设置登陆终端

 

CentOS 6:

init程序为:

upstart

配置文件:

/etc/inittab,/etc/init/*.conf

注意:

/etc/init/*.conf 文件语法遵循upstart配置文件语法格式

 

 

 

相关新闻

历经多年发展,已成为国内好评如潮的Linux云计算运维、SRE、Devops、容器云、Go、Python开发专业人才培训机构!