首页 > 代码库 > Linux之Centos系统的启动流程
Linux之Centos系统的启动流程
概述
了解系统的启动流程,有助于我们了解Linux系统上的一些工作原理,有助于我们深入的理解一个系统的运作方式,那么本篇就以CentOS6系统为例,介绍一下有关Linux系统启动相关的内容,分为一下几个部分
1、Linux系统的一些基础概念
2、CentOS6上的启动流程概述
第一章 Linux系统的一些基础概念
Linux系统的组成部分:内核(kernel)+根文件系统(rootfs)
rootfs:程序和glibc(GNU发布的libc库)
库: 函数集合,function,调用接口(头文件负责描述) 过程调用:procedure,无返回值 函数调用:function程序:二进制执行程序
内核:进程管理、内存管理、网络协议栈、文件系统、驱动程序、安全功能
进程的通信
IPC:Inter Process Communication 消息队列、semerphor、shm(共享内存):本地的通信机制 ocket:跨主机的通信机制运行中的系统环境可分为两层:内核空间、用户空间
用户空间:应用程序(进程或线程) 内核空间:内核代码(系统调用)内核设计流派:
`单内核设计:把所有的功能集成与同一个程序;` Linux `微内核设计:每种功能使用一个单独的子系统实现;` Windows、SolarisLinux内核特点:
`支持模块化: .ko(kernel object)` 如:文件系统,硬件驱动,网络协议等 `支持模块运行时动态装载或卸载;`启动分区:/boot
rootfs:遵循FHS目录结构
如:/bin ,/sbin./lib,/etc,/etc,/proc,/sys,/dev,/boot组成部分:
核心文件:/boot/vmlinuz-VERSION-release 在www.kernel.org的官方站点有各种内核版本 mainline:开发版本 stable:稳定版本 longterm:长期维护版本ramdisk(辅助的伪根系统):系统在启动时,根文件系统一定是在某个磁盘分区上,而内核如果没有编译该文件系统的相关驱动,就会导致系统无法正常启动;并且内核需要夹在的各种模块文件,其都在/lib/modules/目录下,此目录也必然是在根目录下,而根无法驱动,也会造成模块无法正常运行,进而不能进入系统.此时ramdisk的作用就体现出来,因为ramdisk是在/boot目录下,/boot目录是有grub的1.5阶段进行驱动的,它的作用就是一个伪根系统,内核在启动之后会驱动他到内存中,来对系统中的相关驱动和模块进行启动和运行,等待所有任务执行之后就会切换给真正磁盘根目录.
Centos5:/boot/initrd-VERSION-release.img Centos 6,7:/boot/initramfs-VERSION-release.img 模块文件:/lib/modules/VERSION-release 如果安装了多个内核版本,则对应的目录下就有多个文件,或多个目录
第二章 Centos系统的启动流程
POST(Power On Self Test):加电自检;
自检主要是检测一下硬件设备是否存在并且正常运行;这些自检的功能是有一个软件程序来实现的,这个软件程序就是BIOS; ROM:CMOS BIOS:Basic Input and Output System BIOS即基本输入输出系统,他是装载与一个硬件芯片CMOS之上. ROM+RAMBoot Sequence(MBR):
按次序查找各引导设备,第一个有引导程序的设备即为本次启动要用到的设备;
bootloader:引导加载器,程序;linux: LILO:LInux LOader GRUB:Grand Uniform Bootloader GRUB 0.X:Grub legacy GRUB 1.X:Grub2 功能:提供一个菜单,允许用户选择要启动的系统或不通的内核版本;把用户选定的内核装载到RAM中的特定空间中,解压,展开,而后把系统控制权移交给内核; MBR:Master Boot Record 512bytes: 446bytes:bootloader 64bytes:fat 2bytes:55AA GRUB: bootloader(MBR): 1st stage Partltion:filesystem driver;1.5 stage Partltion:/boot/grub;2nd stage 注意:UEFI,GPT Kernel: 自身初始化: 探测可识别到的所有硬件设备; 加载硬件驱动程序;(有可能会借助于ramdisk加载驱动) 以只读方式挂载跟文件系统; 运行用户空间的第一个应用程序:/sbin/init init程序的类型: Centos 5-:SysV init 配置文件:/etc/inittab 每行定义一种action以及与之对应的process id:runlevels:action:process id:一个任务的标识符; runlevels:在哪些级别下启动此任务;(#,###,也可以为 空,表示所有级别) action:在什么条件下启动此任务; walt:等待切换至此任务所在的级别时执行一次; respawn:一旦此任务终止,则自动重新启动之; initdefault:设定默认运行级别;此时,process省略; sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit脚本; 例如: id:3:initdefault: si::sysinit:/etc/rc.d/rc.sysinit l0:0:walt:/etc/rc.d/rc 3 l1:1:walt:/etc/rc.d/rc 1 .......... l6:6:walt:/etc/rc.d/rc 6 意味着去启动或者关闭/etc/rc3.d/目录下的服务脚本所控制的服务; K*:要停止的服务;K##*:优先级,数字越小,越是优先关闭;依赖的服务先关闭;而后关闭被依赖的; S*:要启动的服务;S##*:优先级,数字越小,越是优先开启;被依赖的服务先启动;而依赖的服务后启动; rc脚本:接受一个运行级别数字为参数; 脚本框架: for srv in /etc/rc.d/rc#.d/K*;do $srv stop done for srv in /etc/rc.d/rc#.d/S*;do $srv start done /etc/init.d/* (/etc/rc.d/init.d/*)脚本执行方式: # /etc/init.d/SRV_SCRIPT {start|stop|restart|status} # service SRV_SCRIPT {start|stop|restart|status} process:任务; Centos 6-: Upstart 配置文件:/etc/inittab Centos 7-:systemd 配置文件:/usr/lib/systemd/system/,/etc/systemd/system/ ramdisk: Linux内核的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问; ramdisk-->ramfs Centos 5:initrd 工具程序:mkinitrd Centos 6,7:initramfs 工具程序:dracut,mkinitrd 系统初始化流程(内核级别): POST-->BootSequence(BIOS)-->BootLoader(MBR)-->kernel(ramdisk)-->rootfs(readonly)-->/sbin/init() /sbin/init: Centos 5: SysV init 运行级别:为了系统的运行或维护等目的设定的机制; 0-6:7个级别 0:关机,shutdown 1:单用户模式(single user),root用户,无须认证,维护模式; 2:多用户模式(multi user),会启动网络功能,但不会启动NFS;维护模式 3:多用户模式(multi user),完全功能模式;文本界面; 4:预留级别:目前无特别使用目的,但习惯以同3级别功能使用; 5:多用户模式(multi user),完全功能模式;图形界面 6:重启,reboot 默认级别:3,5 对于服务器一般为3,个人使用为5; 级别切换: init # 级别查看: who -r runlevel N表示上一次级别
chkconfig命令:管控/etc/init.d/每个服务脚本在各级别下的启动或关闭状态; 查看: chkconfig --list [name] 添加: chkconfig --add name 能添加的服务的脚本定义格式之一: #!/bin/bash # #chkconfig LLL KK SS #description: LLL:运行在哪些级别之上 KK:停止的优先级 SS:启动的优先级 能添加的服务的脚本定义格式之二 ### BEGIN INIT INFO # Provides: foo # Required-Start: bar # Defalt-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Description: Foo init script ### END INIT INFO 删除:chkconfig --del name 修改指定的链接类型: chkconfig [--level LEVELS] name <on|off|reset> --level LEVELS:指定要控制的级别;默认为2345 注意:正常级别下,最后启动的一个服务S99local没有链接至/etc/init.d下的某脚本,而是链接至了/etc/rc.d/rc.local脚本;为服务脚本的程序期望能开机自动运行时,直接放置于此脚本文件中即可 tty1:2345:respawn:/usr/sbin/mingetty tty1 .... tty6:2345:respawn:/usr/sbin/mingetty tty6 (1)mingetty会调用login程序; (2)打开虚拟终端的程序除了mingetty之外,还有诸如getty等; 总结(用户空间的启动流程):/sbin/init(/etc/inittab) 设置默认运行级别-->运行系统初始化脚本,完成系统初始化-->关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务-->设置登录终端[-->启动图形终端] 系统初始化脚本:/etc/rc.d/rc.sysinit (1)设置主机名; (2)设置欢迎信息; (3)激活udev和selinux; (4)挂载/etc/fstab文件中定义的所有文件系统; (5)检测跟文件系统,并以读写方式重新挂载根文件系统; (6)设置系统时钟; (7)根据/etc/sysctl.conf文件的设置,来设定内核参数; (8)激活lvm及软raid设备; (9)激活swap设备; (10)加载额外设备的驱动程序; (11)清理操作; Centos 6: init程序:upstat,但依然为/sbin/init,其配置文件: /etc/init/*.conf,/etc/inittab(仅用于定义默认运行级别) 注意:*.conf为upstat风格的配置文件; rc.conf rcS.conf start-tty.conf Centos 7: init程序:systemd,配置文件:/usr/lib/systemd/system/*,/etc/systemd/system/* 完全兼容SysV脚本机制,因此,service命令依然可用;不过,建议使用systemct命令来控制服务; #systemctl {start|stop|restart|status} name[.service]
Linux之Centos系统的启动流程