author:JevonWei

版权声明:原创作品


Centos6 启动流程

  1. POST开机自检

    当按下电源键后,会启动ROM芯片中的CMOS程序检查CPU、内存等硬件设备是否正常运行,CMOS中的程序即为我们通常称之为的BIOS,在BIOS中我们可以设置硬盘接口的类型及系统的启动方式和虚拟化等设置。当然,在我们的电脑主板上还会有一块纽扣电池专门用来给ROM供电,从而保证BIOS的的正常工作,使得主板断电后BIOS并不会立即停止工作。

  2. 加载BIOS中的Sequence

    在系统启动时,默认是不知道你的系统存放在哪个设备上的,故需要按照BIOS中设置的引导加载器bootloader查找,查找到的第一个有引导程序的设备即为此次用到的设备。

  3. bootloader 引导加载器

    系统的引导程序即为bootloader,在不同的操作系统中的bootloader是不同的。windows使用的bootloader程序为ntloader,仅可以对windows系统进行引导,而不能引导其他的操作系统;Linux的bootloader为GRUB,GRUB不仅可以对Linux系统进行引导,还可以引导其他的操作系统;故当我们需要安装双系统时,都会将Linux系统最后安装;

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

    bootloader的引导程序GRUB存放在MBR中

  4. 引导加载程序GRUB

     grub legacy分为三个阶段
    stage1:这一阶段数据存放于MBR中
    stage1_5:这一阶段为MBR之后的扇区,同时也是stage1到stage2的过度,为了让stage1中的bootloader能够识别stage2阶段所在分区的文件系统
    stage2:磁盘上的/boot/grub分区
    stage2及内核等通常放置于一个基本磁盘分区:
    功用
    (1):提供菜单,并提供交互式接口
    a:内核参数
    e:编辑模式,用于编辑菜单
    c:命令模式,交互式接口
    (2):加载用户选择的内核或操作系统
    允许传递参数给内核
    可隐藏此菜单
    (3):为菜单提供了保护机制
    为编辑菜单进行认证
    为启动内核或操作系统进行认证
  • grub legacy界面如下



    在此界面按“e”进入如下所示的编辑模式,用于编辑启动菜单



    然后按“e”进入grub的命令行的编辑模式,“c”进入交互式命令行,“b”启动系统,在此按“c”键,进入如下界面



    在此命令行中常用的命令有:

        help:获取帮助列表
    help KEYWORD:详细帮助信息
    find (hd#,#)/PATH/FILENAME:在分区上查找FILENAME文件
    eg find (hd0,0)/vmlinuz-2.6*
    root (hd#,#) 指明hd#,#设备为/(根)设备
    eg root(hd0.0)
    find vmlinuz-2.6*
    kernel /PATH/TO/KERNEL_FILE 设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的cmdline参数
  • 安装grub:

      (1) grub-install
    grub-install --root-directory=ROOT /dev/DISK 根据跟挂载分区设备安装/boot启动目录和grub,--root-directory=ROOT 指明grub存放跟路径目录,grub路径目录已存在,grub文件自动生成 (2) grub 局限性依赖于grub目录下的文件
    grub> root (hd#,#) grub跟位于hd#磁盘#个分区
    grub> setup (hd#) 将grub安装到hd#硬盘上
  • Cnetos 6中grub的配置文件保存在/boot/grub/grub.conf文件中,常用的选项如下

      default=#:设定默认启动的菜单项,落单项(title)编号从0开始
    timeout=#:指定菜单项等待选项选择的时长;
    splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径;
    hiddenmenu:隐藏菜单
    password [--md5] STRING:菜单编辑md5认证
    password --encrypted STRING 512口令密码加密
    title TITLE:定义菜单项"标题",可出现多次;
    root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub的"根"
    kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS] ro root=/dev/sda2 selinux=0 quiet 启动的内核文件路径和/分区路径, selinux=0 禁用SELinux策略,quiet 显示内核启动过程
    initrd /PATH/TO/INITRAMFS_FILE:内核匹配的ramfs文件
    password [--md5] STRING:启动选定的内核或操作系统时进行认证 内核参数(用于向内核传递参数):
    rhgb 启动过程图形界面显示
    quiet 显示内核启动过程
    max_loop 100 生成100个loop设备
    selinux=0 禁用SELinux策略
  • /boot/grub/grub.conf配置文件如图所示

  • /boot/grub/grub.conf文件中也可以添加密码,从而使进入启动菜单和内核编辑界面提示输入密码,最终达到提升系统安全性的目的

      密码放在不同的位置,即产生不同的加密效果
    生成密码口令
    grub-md5-crypt命令:生成md5密码口令
    grub-crypt 密码口令512加密算法

    在grub.cfg文件中编辑
password --[md5] 口令 增加加密口令或md5加密
password --encrypted 口令 添加512加密口令



加入的两个密码都不影响电脑的正常启动,只是在编辑启动设置选项时起作用;第一个password --md5加密是在菜单选择时输入密码,第二个password --encrypted加密是在编辑系统启动设置时输入密码,如下所示

第一次密码的输入,编辑此界面进入单用户或grub命令设置时输入md5加密口令,按‘p’键输入口令,然后进入正常的编辑界面





进入系统时的界面的加密



当如下界面按‘b’键启动时,将会进入第二次加密512口令加密界面



密码输入正确,即可正常进入系统

结论

在grub.conf文件上的不同的位置设置密码,发生的效果不同,故需准确明白需要在启动的哪个阶段加密从而才能在适当的位置添加密码,否则可能不产生理想的效果,在title之前添加密码即为启动菜单选择界面加密,在title之后为选择title之后的加密,在内核文件之后添加密码即为启动系统加密

5 . kernel

在GRUB中选择对应的kernel进入,然后kernel会对自身系统进行初始化操作

    kernel初始化
探测可识别到的所有硬件设备
加载硬件驱动程序:(可能会借助于ramdisk加载驱动)
以只读方式挂载根文件系统
运行用户空间的第一个应用程序:/sbin/init
内核的组成部分:
kernel:内核核心,一般为bzimage,通常在/boot目录下,名称为vmlinuz
kernel object:内核对象一般有三种选择,一般放置于/lib/modules/VERSION-RELEASE/ ramdisk:
内核的特性之一:使用缓冲和缓存来回对磁盘空间访问 ramdisk文件制作:
(1) mkinitrd 为当前正在使用的内核重新制作ramdisk文件
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r) 由当前系统版本生成相应版本的initramfs文件
(2) dracut命令 为当前正在使用的内核重新制作ramdisk文件
dracut /boot/initramfs-$(uname -r).img $(uname -r)

6 . 运行init程序

Centos 6init程序的存放在/sbin/init,init共分为7个级别

init程序的配置文件:/etc/inittab,/etc/init/*.conf

    init的七个运行级别
0:关机
1:单用户模式(root自动登录),single,维护模式
2:多用户模式,启动网络功能,但不会启动NFS;维护模式
3:多用户模式,正常模式;文本界面
4:预留级别;可同3级别
5:多用户模式,正常模式;图形界面
6:重启 默认运行级别为3,5
切换运行级别:init #
查看运行init级别:runlevel;who -r

7 . 运行系统初始化脚本

系统初始化脚本对用的配置文件:/etc/rc.d/rc.sysinit

    /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)清理操作
  • cat /etc/inittab



    id:5:initdefault: 表示默认运行级别为5

      每一行定义一种action以及与之对应的process
    id:runlevel:action:process
    action:
    wait:切换至此级别运行一次
    respawn:此process 终止,就重新启动之
    initdefault:设定默认运行级别;process省略

8 . 启动系统服务

centos6下的系统服务脚本都放在/etc/rc.d/init.d或者/etc/init.d中,可以看到两个文件中的内容是一样的,因为/etc/init.d链接到了/etc/rc.d/init.d中

 通过chkconfig命令可以查看什么系统级别下开启了哪些服务,以及添加服务到系统中并在指定级别下启动

    chkconfig --list 查看系统中所有服务的运行级别状态
添加服务到chkconfig
chkconfig --add httpd 添加httpd服务到chkconfig
从chkconfig中删除服务
chkconfig --del httpd 将httpd从chkconfig中删除 chkconfig --add 服务名,在添加的时候需要将对应的服务放入/etc/init.d中,并在服务脚本中加入chkconfig: LLLL nn nn
写到LLLL的init级别就是S的,没写得就是K的,第一个nn代表S的数字,第二个nn代表K的数字
[注意]:正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本;因此,不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中。 /etc/rc.d/rc.local在指定运行级别脚本后运行

9 . 打印登录提示符

系统在启动完程序之后就会打印登录提示符,然后输入账号密码进行登录,最后进入相应的系统级别

10 . 总结

    1、加电自检
2、按照BIOS中设置的Boot Sequence查找有bootloader程序的设备
3、加载MBR中的bootloader程序GRUB
4、进入GRUB设置的默认kernel
5、kernel初始化
6、运行init程序
7、运行系统初始化脚本
8、启动对应服务
9、打印登录提示符

启动修复

在前面系统的启动流程基本上已经说完了,我想已经清楚系统是如何启动的了,如果系统启动失败了呢,我们该如何去解决呢?下面就让我们来看下常见的启动错误及如何修复的吧

了解系统的启动修复,请点击下面的链接

http://www.cnblogs.com/JevonWei/p/7146150.html

http://www.cnblogs.com/JevonWei/p/7146719.html



http://www.jianshu.com/p/0e44aa26e3f0

Centos 6启动流程详解的更多相关文章

  1. Linux启动流程详解【转载】

    在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...

  2. Android之Activity启动流程详解(基于api28)

    前言 Activity作为Android四大组件之一,他的启动绝对没有那么简单.这里涉及到了系统服务进程,启动过程细节很多,这里我只展示主体流程.activity的启动流程随着版本的更替,代码细节一直 ...

  3. 【转】linux-系统启动流程详解

    第二十章.启动流程.模块管理与 Loader 最近升级日期:2009/09/14 1. Linux 的启动流程分析 1.1 启动流程一览 1.2 BIOS, boot loader 与 kernel ...

  4. 1.移植uboot-分析uboot启动流程(详解)

    本节总结: uboot启动流程如下: 1)设置CPU为管理模式 2)关看门狗 3)关中断 4)设置时钟频率   (FCLK:HCLK:PCLK=1:2:4,FCLK=120Mhz) 5)关mmu,初始 ...

  5. Spring Boot启动流程详解(一)

    环境 本文基于Spring Boot版本1.3.3, 使用了spring-boot-starter-web. 配置完成后,编写了代码如下: @SpringBootApplication public ...

  6. Linux启动流程详解

    在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...

  7. ASP.NET Core MVC 源码学习:MVC 启动流程详解

    前言 在 上一篇 文章中,我们学习了 ASP.NET Core MVC 的路由模块,那么在本篇文章中,主要是对 ASP.NET Core MVC 启动流程的一个学习. ASP.NET Core 是新一 ...

  8. Jvm(jdk8)源码分析1-java命令启动流程详解

    JDK8加载源码分析 1.概述 现在大多数互联网公司都是使用java技术体系搭建自己的系统,所以对java开发工程师以及java系统架构师的需求非常的多,虽然普遍的要求都是需要熟悉各种java开发框架 ...

  9. Spring Boot启动流程详解

    注:本文转自http://zhaox.github.io/java/2016/03/22/spring-boot-start-flow 环境 本文基于Spring Boot版本1.3.3, 使用了sp ...

随机推荐

  1. 初学Python(五)——元组

    初学Python(五)——元组 初学Python,主要整理一些学习到的知识点,这次是元组. #-*- coding:utf-8 -*- #定义元素 t = (1,2,3) #添加元素 #删除元素 #更 ...

  2. vue指令v-else示例解析

    为 v-if 或者 v-else-if 添加 "else 块". <div id="app"> <p v-if="isRender& ...

  3. 【模板】51Nod--1085 01背包

    在N件物品取出若干件放在容量为W的背包里,每件物品的体积为W1,W2--Wn(Wi为整数),与之相对应的价值为P1,P2--Pn(Pi为整数).求背包能够容纳的最大价值. Input 第1行,2个整数 ...

  4. ArrayList 和 LinkedList的执行效率比较

    一.概念: 一般我们都知道ArrayList* 由一个数组后推得到的 List.作为一个常规用途的对象容器使用,用于替换原先的 Vector.允许我们快速访问元素,但在从列表中部插入和删除元素时,速度 ...

  5. 进程通信-SendMessage使用方法

    进程通信-SendMessage的使用方法 用过SendMessage进行进程通信的同学都知道,这个函数一般都搭配FindWindow使用.通过FindWindow查找进程句柄,然后使用SendMes ...

  6. 使用node自动刷房源并发送可入住房源到邮箱

    因为住的地方离公司太远,每天上下班都要坐很久的班车,所以最近想搬到公司旁边的皖水公寓住.去问了一下公寓的客服,客服说房源现在没有了,只能等到别人退房,才能在网站上申请到. 如果纯靠手动F5刷新浏览器, ...

  7. java8之stream

    lambda表达式是stream的基础,初学者建议先学习lambda表达式,http://www.cnblogs.com/andywithu/p/7357069.html 1.初识stream 先来一 ...

  8. 为IE8添加EventListener系列方法支持

    在低版本IE中添加DOM元素事件可以使用attachEvent方法.但是用它模拟addEventListner还要解决一些问题.主动触发事件的API设计逻辑不同,需要处理的地方比较多.fireEven ...

  9. js添加删除元素内容

    <body> <div id="div" style="background: yellow;width:200px;height:200px;&quo ...

  10. Centos7安装mysql-5.7.19

    Centos7安装Mysql 一 mysql下载 地址: https://dev.mysql.com/downloads/mysql/#downloads 二 在centos7上创建安装文件存放.解压 ...