CentOS6启动过程超详解分析

CentOS 6 开机流程——linux由kernel和rootfs组成。kernel负责进程管理、内存管理、网络管理、驱动程序、文件系统、安全等;rootfs由程序和glibc组成,完善操作系统的功能。同时linux内核的特点是模块化,通过对模块装载卸载可以对内核功能自定义。linux内核文件:/boot/vmlinuz-2.6.32-696.el6.x86_64




整体的流程

  • BIOS/开机自检
  • MBR引导(Boot Loader)
  • 启动内核
  • 启动第一个进程init


一、BIOS/开机自检

1.1 微控制器

系统想要启动必须先加载BIOS,按下电源键时,给微控制器下达一条复位指令,各寄存器复位,最后下达一条跳转指令,跳转到BIOS的ROM,使得硬件去读取主板上的BIOS程序,在这之前都是由硬件来完成,之后硬件就会把控制权交给BIOS;

1.2 BIOS->POST

随后BIOS程序加载CMOS(可读写的RAM芯片,保存BIOS设置硬件参数的数据)的信息,借CMOS取得主机的各项硬件配置;

取得硬件配置的信息之后,BIOS进行加电自检(Power-on self Test,POST)过程,检测计算机各种硬件信息,如果发现硬件错误则会报错(发出声音警告);

之后BIOS对硬件进行初始化

BIOS将自己复制到物理内存中继续执行,开始按顺序搜寻可引导存储设备,决定存储设备的顺序(即定义第一个可引导的磁盘,当然是在有两个磁盘的前提),接下来就会读取磁盘的内容,但是要读取磁盘文件必须要有文件系统,这对BIOS挂载文件系统来说是不可能,因此需要一个不依赖文件系统的方法使得BIOS读取磁盘内容,这种方法就是引入MBR。最后BIOS通过INT 13硬件中断功能读取第一个可引导的存储设备的MBR(0磁道0扇区)中的boot loader。将MBR加载到物理内存中执行。小tip:判断可引导磁盘就是判断每个磁盘前512字节结尾是否存在55AA,有就是可引导,没有就继续检查下一个磁盘。

MBR载入内存后,BIOS将控制权转交给MBR(准确的说应该是MBR中的boot loader),然后MBR接管任务开始执行。

二、MBR引导(Boot Loader)

载入了第一个可引导的存储设备的MBR后,MBR中的boot loader就要读取所在磁盘的操作系统核心文件(即后面所说的内核)了。

2.1 boot loader

但是呢还存在一些问题,不同操作系统的文件系统格式不同?还有我们知道一个磁盘可以安装多个操作系统,boot loader怎么能够做到引导的就是我们想要的操作系统呢?这么多不同的功能单靠一个446字节的boot loader是远远不够的。因此必须弄一个相对应的程序来处理各自对应的操作系统核心文件,这个程序就是操作系统的loader(注意不是MBR中的boot loader),这样一来boot loader只需要将控制权交给对应操作系统的loader,让它负责去启动操作系统就行了。

这里有张图能更好地解释boot loader的作用:

解读上图内容,我们知道一个硬盘的每个分区的第一个扇区叫做boot sector,这个扇区存放的就是操作系统的loader,所以我们常说一个分区只能安装一个操作系统,如上图,第一个分区的boot sector存放着windows的loader,第二个分区放着Linux的loader,第三个第四个由于没有安装操作系统所以空着。至于MBR的boot loader是干嘛呢, boot loader有三个功能:提供选单,读取内核文件,转交给其他loader ,

提供选单就是给用户提供一张选项单,让用户选择进入哪个操作系统;

读取内核文件,我们知道系统会有一个默认启动的操作系统,这个操作系统的loader在所在分区的boot sector有一份,除此之外,也会将这个默认启动的操作系统的loader复制一份到MBR的boot loader中,这样一来MBR就会直接读取boot loader中的loader了,然后就是启动默认的操作系统;

转交个其他的loader,当用户选择其他操作系统启动的时候,boot loader会将控制权转交给对应的loader,让它负责操作系统的启动。

另外我看书上写,安装windows操作系统的时候,windows会主动复制一份自己的loader到MBR中的boot loader中,这种操作在linux下不会。所以我们安装多重操作系统的时候要求先安装windows,然后再安装Linux;我们假设先安装Linux,再安装windows的时候就会自动把windows的loader复制到MBR中的boot loader,这样一来就会默认优先启动windows。然而先安装windows,自动复制windows的loader到boot loader,再安装Linux的时候,我们可以设置把Linux的loader复制到boot loader中,把原先windows的覆盖掉,这样才能设置Linux默认启动。

2.2 Linux的GRUB

Linux的loader使用的是GRUB,我们常说的Linux中的loader就是grub,我认为这种说法是不准确的,我们知道MBR的boot loader是446字节,而grub呢,不仅仅446字节。

那Linux的boot loader和grub到底是什么关系呢,首先我们可以通过rpm -qi grub命令查看grub的版本。

进入/boot/grub目录下,我们可以看到很多文件,其实Linux的loader为stage1那个文件,Linux所在分区的boot sector(一个扇区是512字节)就是存放着stage1文件的内容,同时默认Linux启动的话,也需要把stage1中的引导代码安装到MBR中的boot loader中。该文件太小,能完成的功能有限,因此Linux的loader只是简单的引导作用。

stage1完成了主程序的引导后,主引导程序开始加载配置文件了,但是加载这些配置文件之前需要有文件系统的支持,可是现在还没有文件系统呢,在网上查阅资料说的“GRUB内置文件系统访问支持,虽然是极度精简的,但已经具备根据路径读取相应文件的二进制流。换句话说,GRUB在不依赖Linux内核的情况下具有读取配置文件与内核映像的能力”。GRUB的内置文件系统其实是依靠stage1_5那些文件定义的,而且有不同文件系统的stage1_5。

而后开始读取stage2开始真正地读取配置文件grub.conf。解析/boot/grub/grub.conf文件

default=0# 默认启动第一个系统内核,即后面的title部分,1代表第二个,依次类推,
timeout=5# 设置系统留给用户选择系统内核的时间为5s。
splashimage=(hd0,0)/grub/splash.xpm.gz
# 用户选择内核时候的背景图片文件,这里的hd0,0是第一个硬盘的第一个分区,没有/dev/sdaX的概念
hiddenmenu     # 是否显示选单画面
title CentOS 6 (2.6.32-696.el6.x86_64)    # 第一个选单的名字,可以自定义
    root (hd0,0)    # 内核文件放置的分区
    kernel ... ro root= ... rhgb quiet
    # 内核文件;读取内核文件之后要挂载/目录,只读,root后跟真正的/目录挂载的分区,rhgb表示系统启动时默认为图形界面
    # rhgb 表示默认图形显示,把启动过程覆盖掉
    # quit表示系统启动时将模块启动的详细信息屏蔽,只显示模块启动时候成功(ok or failed)
    initrd ...# 内核镜像文件

总之,MBR就是加载内核文件的。

三、启动内核

3.1 加载内核文件

MBR将内核文件(代码)载入物理内存中执行,内核就是/boot/vmlinuz-2.6.32-696.el6.x86_64,观察该文件,发现这是一个压缩镜像文件。

控制权转交给内核后,内核重新检测各种硬件信息,(第一次为POST自检)我们前边说了,一个完整的Linux包括内核和内核之上的程序,因此内核还要加载提供这些程序功能的模块,然而这些模块都在根目录的/lib/modules/2.6.32-696.el6.x86_64下(/和/lib/modules/不能挂载不同的分区),这时候内核还没有文件系统的概念,没有文件系统就没办法挂载根目录,想要挂载根目录就需要相应的模块支持,而我们原本的问题就是如何加载模块(先有鸡后有蛋的问题)。

3.2 加载initrd

/boot/initramfs-2.6.32-696.el6.x86_64.img文件就是解决上面问题的,我们来看一下这个文件:

file initramfs-2.6.32-696.el6.x86_64.img # 查看该文件类型
cp initramfs-2.6.32-696.el6.x86_64.img /app
cd /app
mv initramfs-2.6.32-696.el6.x86_64.img initramfs-2.6.32-696.el6.x86_64.img.gz
# gzip解压文件必须以.gz后缀
gzip -d initramfs-2.6.32-696.el6.x86_64.img.gz 
file initramfs-2.6.32-696.el6.x86_64.img 
# 查看需要借助cpio命令
mkdir init
cd init
cpio -id < /app/initramfs-2.6.32-696.el6.x86_64.img 
# 解压至/app/init目录下

我们发现解压之后的内容类似于真正/目录下内容,这是因为这是一个最小化的Linux根文件系统。内核就是先把这个文件展开,形成一个虚拟文件系统,内核借虚拟文件系统装载必要的模块,完成后释放该虚拟文件系统并挂载真正的根目录(这时的根以只读的方式存在)。

initrd的制作:

mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)

dracut /boot/initramfs-$(uname -r).img $(uname -r)

四、启动第一个进程init

4.1 init进程:主要功能是准备软件执行的环境

内核完成硬件检测和加载模块后,内核会呼叫第一个进程,就是/sbin/init,至此内核把控制权交给init进程

读取初始化配置文件/etc/inittab,决定操作系统的runlevel,/etc/inittab内有这样一句:

id:runlevel:action:process

id 代表设定的项目,没有具体的实际意义
runlevel
执行级别,0-关机、1-单用户、2-没有NFS的多用户、

3-真正的多用户、4-预留、5-Xwindows、6-reboot

action init的动作行为,initdefault表示要默认启动的runlevel
process 执行动作的指令,一般为脚本文件

4.2 /etc/rc.d/rc.sysinit

读取/etc/rc.d/rc.sysinit系统初始化脚本,设置主机名,挂载/etc/fstab中的文件系统,修改/etc/sysctl.conf 的内核参数等各项系统环境。

查看该脚本内容,大致功能如下

定义主机名,如果不存在则将主机名定义为localhost;

读取/etc/sysconfig/network文件,设置网络环境;

挂载内存装置/proc和USB装置/sys,如果USB装置存在,则会加载usb模块并挂载usb文件系统;

接下来是SELINUX的一些相关设置;

设定text banner,显示欢迎界面;

...

将开机启动信息存放到/var/log/dmesg中。

4.3 /etc/rc.d/rc

执行/etc/rc.d/rc脚本,下面是/etc/rc.d/rc脚本中我们关心的代码部分:

# First, run the KILL scripts.
for i in /etc/rc$runlevel.d/K* ; do
# Check if the subsystem is already up.
subsys=${i#/etc/rc$runlevel.d/K??}
[ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] || continue
check_runlevel "$i" || continue
# Bring the subsystem down.
[ -n "$UPSTART" ] && initctl emit --quiet stopping JOB=$subsys
$i stop
[ -n "$UPSTART" ] && initctl emit --quiet stopped JOB=$subsys
done
# Now run the START scripts.
for i in /etc/rc$runlevel.d/S* ; do
# Check if the subsystem is already up.
subsys=${i#/etc/rc$runlevel.d/S??}
[ -f /var/lock/subsys/$subsys ] && continue
[ -f /var/lock/subsys/$subsys.init ] && continue
check_runlevel "$i" || continue

根据运行级别(0123456)进入相应的/etc/rc.d/rcN.d目录,启动和关闭相关的系统服务。里边存放着一堆以K和S开头的软链接文件,分别代表对应的服务。K开头表示该运行级别下需要把该服务杀死,S开头表示该运行级别下需要把该服务开启。,上诉操作都是由/etc/rc.d/rc脚本来完成的。另外我们还注意都S和K后边的数字,他们的数字代表了读取的顺序,因为有些服务是具有一定的关联性。

而且每个rcN.d目录内最后都会有一个S99local文件 ,该文件指向 ../rc.local脚本。

4.4 /etc/rc.d/rc.local

系统根据runlevel执行完/etc/rc.d/rcN.d中的脚本后,调用/etc/rc.d/rc.local脚本

这时候系统已经完成了各种必要系统服务的启动,假如我们想自定义一些指令要在开机的时候启动,我们就可以把他们放到/etc/rc.d/rc.local内,该文件默认为空。

4.5 启动终端

接下来会由/sbin/mingetty指令启动终端,由于系统设置启动tty1-tty6 ,所以会启动6个命令行终端。最终呈现给我们的就是这样一个画面:



CentOS6启动过程超详解分析

原文地址:http://blog.51cto.com/13570193/2090653

时间: 2024-11-08 18:35:06

CentOS6启动过程超详解分析的相关文章

Tomcat启动过程原理详解 -- 非常的报错:涉及了2个web.xml等文件的加载流程

Tomcat启动过程原理详解 发表于: Tomcat, Web Server, 旧文存档 | 作者: 谋万世全局者 标签: Tomcat,原理,启动过程,详解 基于Java的Web 应用程序是 servlet.JSP 页面.静态页面.类和其他资源的集合,它们可以用标准方式打包,并运行在来自多个供应商的多个容器(诸如tomcat).Web 应用程序存在于结构化层次结构的目录中,该层次结构是由 Java Servlet 规范定义的.Web 应用程序的根目录包含直接存储或存储在子文件夹中的所有公共资源

Tomcat启动过程原理详解

基于Java的Web 应用程序是 servlet.JSP 页面.静态页面.类和其他资源的集合,它们可以用标准方式打包,并运行在来自多个供应商的多个容器.Web 应用程序存在于结构化层次结构的目录中,该层次结构是由 Java Servlet 规范定义的.Web 应用程序的根目录包含直接存储或存储在子文件夹中的所有公共资源,比如图像.HTML 页面等.构成:Web应用由Web组件(一组Java类库).html文件,静态资源文件(如图像).帮助类和库组成. 1 – Tomcat Server的组成部分

MVC之前的那点事儿系列(3):HttpRuntime详解分析(下)(转载)

MVC之前的那点事儿系列(3):HttpRuntime详解分析(下) 文章内容 话说,经过各种各样复杂的我们不知道的内部处理,非托管代码正式开始调用ISPAIRuntime的ProcessRequest方法了(ISPAIRuntime继承了IISPAIRuntime接口,该接口可以和COM进行交互,并且暴露了ProcessRequest接口方法).至于为什么要调用这个方法,大叔也不太清楚,找不到微软相关的资料哦.但大叔确定该方法就是我们进入HttpRuntime的正式大门,接着看吧. publi

【Big Data - Hadoop - MapReduce】通过腾讯shuffle部署对shuffle过程进行详解

摘要: 通过腾讯shuffle部署对shuffle过程进行详解 摘要:腾讯分布式数据仓库基于开源软件Hadoop和Hive进行构建,TDW计算引擎包括两部分:MapReduce和Spark,两者内部都包含了一个重要的过程—Shuffle.本文对Shuffle过程进行解析,并对两个计算引擎的Shuffle过程进行比较. 腾讯分布式数据仓库(Tencent distributed Data Warehouse, 简称TDW)基于开源软件Hadoop和Hive进行构建,并且根据公司数据量大.计算复杂等

使用Xmanager远程连接CentOS6.4图形界面详解(图文)

1.首先安装与下载图形界面GNOMEyum groupinstall "Desktop"yum groupinstall "X Window System"yum groupinstall "Chinese Support"  (可选项) 假如提示有以下错误产生: Loaded plugins: fastestmirror, prestoCould not retrieve mirrorlist http://mirrorlist.centos.

Linux/CentOS 服务安装/卸载,开机启动chkconfig命令详解|如何让MySQL、Apache开机启动?

chkconfig chkconfig在命令行操作时会经常用到.它可以方便地设置和查询不同运行级上的系统服务.这个可要好好掌握,用熟练之后,就可以轻轻松松的管理好你的启动服务了. 注:谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 语法: chkconfig       [--add]      [--del]     [--list]      [系统服务] chkconfig       [--level/levels]      [等级代号]     

Android应用程序启动过程——Launcher源码分析

当我们在Launcher界面单击一个应用程序图标时就会启动一个程序,那这一个过程究竟发生了些哪样呢?让我们跟踪Launcher源码来分析一下吧. 先上流程图: step1.追踪Launcher  从源码中我们可以发现Launcher其实也是一个程序,它继承于Activity.找到该文件中的onCreate()方法,代码片段如下: protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSta

java虚拟机启动参数分类详解

官方文档见: http://docs.sun.com/source/819-0084/pt_tuningjava.html java启动参数共分为三类:其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容:其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容:其三是非Stable参数(-XX),此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用: 一.标准参数中比较有用的: verbose -verbo

Centos7&Centos6 Root密码破解详解

Centos7&Centos6 Root密码破解详解 说到Linux的root登录密码,相信作为一个运维管理员都是一个敏感的问题,如果当管理员忘记root登录密码,需要破解的话是及其方便的,不像windows的登录密码破解,windows登录的密码破解我们需要介入工具进行破解,现在使用最多的是老毛桃等工具.而今天我们主要介绍一下centos7和cenos6的登录密码的破解方法.使用过Centos7的童鞋来说是有体会的,Centos7和Centos6版本的命令是有一定差别的,防火墙类型最为显著,从