CentOS6 启动流程图文解剖
我们在使用Linux操作系统的时候,我们只需按下电源键,等待,然后输入账户和密码就可以使用Linux操作系统了。那么在按下电源到输入账号和密码之前,操作系统都做了些什么?下面就来讲述在这段时间发生的动作。
下面以CentOS6系列为例来讲解Linux的启动流程。
一、Linux启动流程详解
下图就是启动流程的大致过程:

二、POST加电自检
POST(PowerOnSelfTest)首先对每一个设备进行检查。完成后会寻找存有引导记录的设备,找到后读入操作系统引导记录,然后将系统控制权交给引导记录,并由引导记录来完成系统的顺利启动。
三、MBR引导
MBR(Master Boot Record) MBR记录一般是在磁盘 0 磁道 1 扇区,共512个字节。前446个字节是BootLoder,后 4*16 的 64 个字节是存放分区信息的,最后 2 个字节是校验信息,一般是 55AA。
四、GRUB(GRand Unified Bootloader)、加载内核
就是MBR中的前 446 个字节,是BooTLoader的一种,它的作用是要选择要启动的内核。
1、GRUB程序的组成:

主要是由device.map,menulst,stage1,stage2,以及一系列的stage1_5组成。对于这些部分我的理解是这样:
- device.map:存放的是内核文件的根分区
- menu.lis:是grub.conf的链接文件,但是这个名字我觉得更与它的功能接近,就是菜单列表。里卖弄设置了可以选择的内核菜单。存放于stage2中。
- stage:用于grub引导程序过大,所以分2段引导,第一段存放在MBR中,第二段存放于内核文件系统中,第一段引导完成后可以找到第二段。 但是,第二段是存放于内核文件系统中的,此时还没有格式化文件系统,如何可以访问到第二段的 menu.lst 呢??就需要借助于中间层 stage1_5,有它来协助 stage1 段来访问 stage2 段。stage1_5通常位于 stage1 字段后的 63 个扇区。 由于stage2 在内存中存放可以使用的文件系统不确定,所以这就是有多个 stage1_5 的原因了。
2、grub.conf 文件参数意义
- default=1 # 默认启动的内核title, 0 表示是第一个
- timeout=5 # 默认等待时间
- splashimage=(hd0,0)/grub/splash.xpm.gz # 指定菜单的背景图片的路径。为xpm格式,采用gzip压缩,只能为14bits色
- hiddenmenu # 隐藏菜单
- title CentOS (2.6.32-358.el6.x86_64) # 标题名,用户可自定义
- root (hd0,0) # 指定 grub 的根位置
- # 指定 kernel 文件的位置,还要指出 root(系统启动后) 的位置,挂载方式 ro,这项很关键。
- # 加载后会启动 init 进程。
- kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS rd_NO_DM LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg0/root KEYBOARDTYPE=pc KEYTABLE=us rhgb crashkernel=auto quiet rhgb quiet
- # 在内核启动过程中装载根文件系统时有用
- initrd /initramfs-2.6.32-358.el6.x86_64.img
- # initramfs 是以 gzip 压缩的 cpio 格式的文件。内核启动时将他作为一个临时的根文件系统。
- # grub 的 stage2 将initrd加载到内存里,让后将其中的内容释放到内容中,
- # 内核便去执行init脚本,这时内核将控制权交给了init文件处理。
- # init 它也主要是加载各种存储介质相关的设备驱动程序。当所需的驱动程序加载完后,
- # 会创建一个根设备,然后将根文件系统rootfs以只读的方式挂载。
- # 这一步结束后,释放未使用的内存,转换到真正的根文件系统上面去,同时运行/sbin/init程序,
- # 执行系统的1号进程。此后系统的控制权就全权交给/sbin/init进程了。

如何制作 initramfs 呢?
- # 可以使用 dircut 命令,用法如下:
- # 只有在 initramfs 文件损毁的时候会使用到
- [root@server ~]# dracut /mnt/initramfs-`uname -r`.img `uname -r`
- [root@server ~]# du -sh /mnt/initramfs-2.6.32-358.el6.x86_64.img
- 16M /mnt/initramfs-2.6.32-358.el6.x86_64.img
- [root@server ~]# du -sh /boot/initramfs-2.6.32-358.el6.x86_64.img
- 16M /boot/initramfs-2.6.32-358.el6.x86_64.img
- # 详细介绍,可使用这个链接:https://zh.opensuse.org/index.php?title=SDB:Dracut&variant=zh-cn#.E5.90.AF.E7.94.A8_dracut_.E7.94.9F.E6.88.90.E7.9A.84_initramfs
3、grub的功能
1)提供菜单,并提供交互式接口
e: 进入编辑模式

2)选择要启动的内核或系统
允许传递引导参数给内核
选择界面可隐藏
- # 可以自启动是通过 grub 像内核传递参数。
- # 应用之一是:修改 root 密码(忘记密码),使用 e 选项,传递单用户指令。
3)为编辑功能提供保护机制
启用内核文件
选择运行指定的内核得先输入密码
传递参数
使用e命令得先输入密码
- [root@server root]# grub-md5-crypt
- Password:
- Retype password:
- $1$Mp7Rp1$l2wzOILNUqpUhAR7zXvQb0
- # 上面是生成的加密字符串
- # 然后将信息加入到 grub.conf 文件中,格式如下:
- password --md5 $1$Mp7Rp1$l2wzOILNUqpUhAR7zXvQb0
- # 当然加入 grub.conf 文件的位置不同,加密效果也不一样。
- # 加入到 title 之前的话,会加密整个菜单。
- # 加入到 title 指内的话,会加密对应的操作系统的入口。
4、安装grub的方式
1)使用grub-install命令
- # grub-install [--root-directory=/path/to/somewhere] DEVICE
2)grub交互是命令

在这里我们自制一个精简grub,当然启动的时候只启动一个bash就可以。示例是在 VMware 虚拟机下完成的。
第一步:准备好块新磁盘,分 2 个区出来

第二步:模拟启动时的boot目录,和根目录,并挂载。如下
- [root@server ~]# df -H | tail -n 2
- /dev/sdd1 518M 11M 481M 3% /mnt/boot
- /dev/sdd2 2.2G 71M 2.0G 4% /mnt/sysroot
第三步:制作 grub,并生成 grub 的配置文件
制作grub

拷贝内核文件和 initramfs 文件到 /mnt/boot 目录下,并生成 grub.conf 文件
- [root@server ~]# cp /boot/vmlinuz-2.6.32-358.el6.x86_64 /mnt/boot/vmlinuz
- [root@server ~]# cp /boot/initramfs-2.6.32-358.el6.x86_64.img /mnt/boot/initramfs.img
- [root@server ~]# ll /mnt/boot/
- total 20106
- drwxr-xr-x 2 root root 1024 Jul 24 20:58 grub
- -rw-r--r-- 1 root root 16542269 Jul 24 21:06 initramfs.img
- -rwxr-xr-x 1 root root 4043888 Jul 24 21:05 vmlinuz
- # 生成的 grub.conf 文件
- [root@server ~]# cat /mnt/boot/grub/grub.conf
- default=0
- timeout=10
- title Mini Linux
- root (hd0,0)
- kernel /vmlinuz ro root=/dev/sda2 selinux=0 init=/bin/bash
- initrd /initramfs.img
第四步: 生成根文件系统

第五步:拷贝使用命令和库到对应根目录下

将刚才的磁盘镜像作为另一个虚拟机的启动盘。


五、启动 init 进程
init 进程是系统启动的第一个进程。其他进程都是有此进程控制fork出来的,也就是说,init是其他进程的“祖先”,PID=1。当然,PID=0进程我们称为空闲进程是属于内核的。
init启动后所做的事情:
1、读取/etc/inittab来读取默认级别 假设:读取到的默认级别是 3
/etc/init/*.conf
- # 启动级别:(runlevel)
- # 0:关机
- # 1:单用户模式
- # 2:多用户模式,不支持 NFS 功能
- # 3:完全多用户模式,支持文本接口
- # 4:预留模式
- # 5:完全多用户模式,支持图形模式
- # 6:关机
- # /etc/inittab文件格式如下,这是遵循了CentOS5的风格。
- id:3:initdefault:
2、执行初始化系统脚本 /etc/rc.d/rc.sysinit 来初始化脚本
这个大家有机会可以读读,脚本主要的作用如下:
- # 获取网络环境与主机类型。首先会读取网络环境设置文件"/etc/sysconfig/network",获取主机名称与默认网关等网络环境。
- # 答应文本欢迎信息。
- # 挂载/etc/fstab文件中定义的其它文件系统。
- # 激活swap
- # 检测根文件系统,并以读写方式重新挂载
- # 决定是否启动SELinux和udev。
- # 接口设备的检测与即插即用(pnp)参数的测试。
- # 用户自定义模块的加载。用户可以再"/etc/sysconfig/modules/*.modules"加入自定义的模块,此时会加载到系统中。
- # 加载核心的相关设置。按"/etc/sysctl.conf"这个文件的设置值配置功能。
- # 设置系统时间(clock)。
- # 设置终端的控制台的字形。
- # 设置raid及LVM等硬盘功能。
- # 以方式查看检验磁盘文件系统。
- # 进行磁盘配额quota的转换。
- # 重新以读取模式载入系统磁盘。
- # 启动quota功能。
- # 启动系统随机数设备(产生随机数功能)。
- # 清楚启动过程中的临时文件。
- # 将启动信息加载到"/var/log/dmesg"文件中。
3、然后执行 /etc/rc.d/rc 脚本
此脚本运行的时候此脚本的时候,会读取/etc/rc.d/rc3.d/下的所有脚本,来控制系统启动的时候启动或者关闭那些服务

- # 这里面的脚本大致分为 2 类,以 S 开头的和以 K 开头的脚本。
- # S 代表开机时启动的,K 表示开机时不启动。
- # 每个文件的命名格式,例如:S01sysstat S 开机启动 01 启动次序 sysstat 启动脚本名
- # 启动的定义是在每个脚本中定义的:例如
- # # chkconfig: - 85 15
- # 默认级别 启动次序 不启动次序
这些脚本是否开机自启动,可由 chkconfig 命令来管理。
- # 常用选项:
- # chkconfig --add SRV_SCRIPT 可以将自己写的一些脚本,让此命令统一管理。例如:chkconfig --add httpd
- # chkconfig --del SRV_SCRIPT 将服务删除,意思就是服务不由chkconfig这种机制来管理
- # chkconfig SRV_SCRIPT {on|off} 设置服务开机是否自启动,默认管理的级别是2345.
- # --level 2345 等,指定默认级别,可以与其他选项一起使用
4、执行/etc/rc.d/rc.local脚本,此脚本是启动过程中最后启动的一个脚本。
最后会执行 /bin/login 登录用户。至此系统启动过程完成。
博文链接:http://guoting.blog.51cto.com/8886857/1530109
CentOS6 启动流程图文解剖的更多相关文章
- CentOS6启动流程
CentOS6启动流程 1.加载BIOS的硬件信息,获取第一个启动设备 在通电之后,CentOS6会进行加电自检(Power On Self Test),这个过程主要是由BIOS完成的.在自检完毕,会 ...
- Linux操作系统-CentOS6启动流程和服务管理
Linux操作系统-CentOS6启动流程和服务管理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux组成 1>.Linux: kernel+rootfs ker ...
- CentOS6启动流程(含详细流程图)
参考:Linux启动流程和grub详解(作者:好笔记运维) 为什么把这位的参考放在前面,主要是这位大佬的流程图太详细了.虽说不一定要了解这么详细,但还是很佩服啊.不多说,上图(在新标签中打开图片) 下 ...
- centos6 启动流程
具体过程:1)加载BIOS的硬件信息,执行BIOS内置程序.2)读取MBR(Master Boot Record)中Boot Loader中的引导信息.3)加载内核Kernel boot到内存中.4) ...
- CentOS5、CentOS6启动流程
这三篇文章讲的都很好,可以看一下 http://os.51cto.com/art/201407/446819.htm http://www.mamicode.com/info-detail-11656 ...
- Linux启动流程CentOS6和7的区别
目 录 Linux启动流程 I 第1章 CentOS6启动流程 1 1.1 BIOS 1 1.2 MBR 1 1.3 GRUB 1 1.4 kernel(加载内核) ...
- CentOS6和7启动流程
CentOS6启动流程 https://linux.cn/article-8807-1.html BIOS 开机自检,硬件自检 MBR MBR磁盘分区是一种使用最为广泛的分区结构,它也被称为DOS分区 ...
- Centos 6启动流程详解
author:JevonWei 版权声明:原创作品 Centos6 启动流程 POST开机自检 当按下电源键后,会启动ROM芯片中的CMOS程序检查CPU.内存等硬件设备是否正常运行,CMOS中的程序 ...
- centOS 6启动流程
centOS6启动流程 centOS6启动流程 linux内核组成 centos6启动大致流程 1.post加电自检 2.Boot Sequence 3.MBR引导 4.Grub启动 制作init ...
随机推荐
- URAL 1416 Confidential(次小生成树)
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1416 Zaphod Beeblebrox — President of the Impe ...
- paper 81:HDR成像技术
什么是HDR?谈HDR照片的制作方法和效果 HDR,是英文High-Dynamic Range的缩写,意为“高动态范围”.这是一个简单的术语,HDR照片是使用多张不同曝光的图片,然后再用软件将其叠加合 ...
- paper 52 :windows7环境下theano安装
要做卷积神经网络的一些东西,所以要装theano,网上很多Theano安装教程版本较老,而各安装包更新很快,参考价值有限.走了很多弯路才装好,把这个过程记录下来,希望对大家有帮助~ ~ 我的配置:wi ...
- paper 42 :图像的小波变换
关于小波变换我只是有一个很朴素了理解.不过小波变换可以和傅里叶变换结合起来理解. 傅里叶变换是用一系列不同频率的正余弦函数去分解原函数,变换后得到是原函数在正余弦不同频率下的系数. 小波变换使用一系列 ...
- Open quote is expected for attribute "property" associated with an element type "result".错误
java Mybatis 框架下的项目 报 Open quote is expected for attribute "property" associated with a ...
- 自己实现FormsAuthentication.SetAuthCookie方法,怎样在ASP.NET服务端代码中删除客户端Cookie
如何手动设置AuthCookie ASP.NET中实现可以自己实现FormsAuthentication.SetAuthCookie方法,控制更为灵活 /// <summary> /// ...
- SQL 基础语法(创建表空间、用户、并授予权限、数据的增删改查) --(学习笔记)[转]
--创建表空间 名:lyayzh_test create tablespace lyayzh_test --创建表数据文件 名:lyayzh_test_data.dbf 必须以dbf为后缀 dataf ...
- UISlider控件属性及方法(转)
初始化一个Slider UISlider *slider = [[UISlider alloc]initWithFrame:CGRectMake(0, 400,320 , 20)]; 访问UI ...
- 【转】Delphi利用系统环境变量获取常用系统目录
Delphi code //譬如 %WINDIR% 是表示系统目录的系统变量, 可以这样获取: var s: string; begin s := GetEnvironmentVariable('WI ...
- 测试过程中LR的关联报错
在测试过程中,录制的脚本会做一些关联.在测试的过程中,常常出现关联失败的情况. 如果最后的结果有检查点,检查点失败而事务失败. 每次出现这样的情况,我都不知道如何办.为了不出现错误,我都在关联函数里面 ...