Centos启动流程及grub legacy

时间:2022-09-05 20:26:20

Linux系统的组成部分:内核+根文件系统
内核的功能:进程管理、内存管理、网络管理、文件系统、驱动程序、安全功能

系统在运行时要么就是在运行内核代码,要么就是在运行应用程序代码。如果一个程序大多数时间在内核的系统调用上,那样真正执行业务功能的时间就少了,实际生产力不大。通常在开发程序的时候,大都不是直接使用系统调用来实现功能,而是使用系统调用的二次封装(glibc库),所谓库,就是函数(功能)的集合,库中的函数名,能够接受的参数,参数类型都应该有定义(头文件)。

库也是二进制程序,但是相比正常程序而言,库没有执行入口,只能通过被调用才能实现功能。进一步划分库,分为是否有返回结果,称之为过程调用和函数调用。

所以系统的最基本组成就是内核、程序、库。为了运行程序就必须要文件系统。

内核作为操作系统的最核心有两种设计流派:
        单内核设计:把所有功能集成于同一个程序;Linux
        微内核设计:每种功能使用一个单独的子系统实现;Windows, Solaris,微内核设计才能真正实现线程
       
Linux内核特点:
        借鉴了微内核设计,支持模块化:  .ko (kernel object),类似于库(.so)是被程序调用。
        支持模块运行时动态装载或卸载;
           
内核组成部分:
         核心文件:/boot/vmlinuz-VERSION-release
         ramdisk:
                    CentOS 5:/boot/initrd-VERSION-release.img
                    CentOS 6,7:/boot/initramfs-VERSION-release.img
         模块文件:/lib/modules/VERSION-release
        现有一种情景,内核启动后需要加载各个硬件的驱动程序,但是内核不可能包含所有硬件的驱动,因为内核的功能都是模块文件来实现的,然而内核模块/lib/modules/的目录是在文件系统上,所以要使用这个目录的模块就需要正确识别磁盘和文件系统,就需要有正确的驱动,可是驱动模块又在磁盘上。如何解决这个矛盾,就出现了ramdisk(内存模拟的磁盘)文件,是一个微型的文件系统,里面存放了内核为了访问磁盘和文件系统等基本设备的驱动,这样内核就可以真正的访问磁盘上的模块文件。

ramdisk是安装系统的最后一步动态生成的,只存在用于识别当前硬盘的驱动文件,这个文件并不会把所有的驱动都包含。
在Centos 6开始称之为initramfs(内存模拟的文件系统),因为内核特性使得硬盘读取数据的时候会先在内存设立缓存区,然后再从内存缓存区读取,但是本身这个ramdisk的内容已经在内存中了,造成了二次缓存,就没有必要从内存读取到内存缓存了。

CentOS 系统的启动流程
系统初始化流程(内核级别): POST --> BootSequence(BIOS) --> BootLoader(MBR)--> Kernel(ramdisk)--> rootfs(readonly)--> /sbin/init ()。完整的详细启动过程参照 CentOS系统启动流程

MBR上的bootloader
        功能:提供一个菜单,允许用户选择要启动的系统或不同的内核版本; 把用户选定的内核装载到RAM中的特定空间中,解压、展开,而后把系统控制权移交给内核;

GRUB启动的阶段:
        bootloader:1st stage,这个阶段作用只有一个,就为了找到stage 2
        stage 1.5:位于分区文件系统,因为stage 2 在磁盘分区上,要正确识别分区文件系统。位于MBR后面的扇区。
        stage 2:位于文件系统/boot/grub

Kernel自身初始化:
        探测可识别到的所有硬件设备;
        加载硬件驱动程序;(有可能会借助于ramdisk加载驱动)
        以只读方式挂载根文件系统;
        运行用户空间的第一个应用程序:/sbin/init(Centos5、6、7使用的都不同)

init程序的类型:
        CentOS 5-:SysV init
         配置文件:/etc/inittab
                       
        CentOS 6:Upstart
          配置文件:/etc/inittab; /etc/init/*.conf
                           
        CentOS 7:Systemd
          配置文件:/usr/lib/systemd/system/, /etc/systemd/system/

ramdisk/ramfs生成的工具程序:
        CentOS 5: initrd  工具程序:mkinitrd
        CentOS 6,7: initramfs  工具程序:dracut, mkinitrd(一般不用)


init

运行级别

假设一种场景,在Windows上安装了不兼容硬件的驱动导致一启动就蓝屏。那么正常情况只要卸载了此驱动就能正常启动。然而启动就蓝屏使得根本无法卸载。这个时候Windows就有了一个安全模式,安全模式下只加载了基本的系统组件,与正常启动相比这种模式下加载了不同的驱动启动了不同的服务。使得系统异常时有一个基本的环境来进行维护工作。

在linux中也同样有这种用于维护的模式,称之为运行级别(Centos5/6存在)。由init程序管理,在不同的级别下启动不同的服务和程序。

运行级别有7个:
         0:关机
         1:单用户模式(root用户无需登陆),single,用于维护
         2:多用户模式,启动网络功能,但是不启动网络文件系统,用于维护
         3:多用户模式,正常启动,文本界面
         4:多用户模式,预留的级别,同级别3.
         5:多用户模式,正常启动,图形界面
         6:重启
所以一般常用于系统启动的有3、4、5。

级别的切换通过init程序:init  level
查看级别:runlevel 、who –r

init的配置文件为/etc/inittab。按照指定格式id:runlevel:action:process

以Centos5为例:

id:3:initdefault:
        si::sysinit:/etc/rc.d/rc.sysinit       #::表示所有级别

id:作为唯一标识不可重复
        action:
            wait:切换到此级别执行一次
            initdefault:设置默认指定级别,process省略
            sysinit:设定初始化方式,一般运行/etc/rc.d/rc.sysinit,init依靠这脚本完成初始化

另外有:1:0:wait:/etc/rc.d/rc 1

当切换到级别1的时候执行rc脚本,并传递1,rc脚本读取rc1.d/*,该目录下两种文件

K##:传递stop,大致原理如下:
        for  srv  in  /etc/rc.d/rc0.d/K*;do
                $srv  stop
        done
S##:类似K,传递的是start
数字##标识启动的顺序。数字小的先执行,数字大小取决于依赖的服务。

为了方便管理启动的服务,有chkconfig 工具,自动在运行级别目录下创建链接,设置一个服务在某个级别下是K还是S。

想要一个服务可以通过chkconfig来控制,需要在服务启动脚本上使用如下标识
#chkconfig:  -  34   55

chkconfig命令:管控/etc/init.d/
chkconfig  --add | del  name
chkconfig  [--level  LEVELS]  name  <on|off|reset>

或者”###BEGIN  INIT  INFO   …….###END  INIT  INFO“这种格式

正常级别下有个S99local表示最后一个启动的脚本,指向/etc/rc.d/rc.local,用于自定义添加开机启动。

所有服务启动完成后,就会启动终端设备和登陆程序,同样在/etc/inittab的配置文件中定义(Centos6的配置文件就不止一个)
如:tty1:respanw:/usr/sbin/mingetty tty1

回到配置文件中,系统启动时sysinit执行的/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) 清理操作;

完成内核加载后,启动第一个程序init的执行流程,/sbin/init (/etc/inittab)设置默认运行级别 --> 运行系统初始化脚本(rc.sysinit) --> 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务(rc #)--> 设置登录终端 (或启动图形终端)

以上关于init配置文件完成的功能适用于centos5,后续再比较这种启动过程的变革。

Centos 6的init程序就已经变为upstart,但是其命名依然为init。配置文件/etc/init/*.conf,同时兼容/etc/inittab(仅用于定义默认运行级别),但是*.conf 的配置文件是按照upstart的标准来定义的(比上一代要更加复杂)。

Centos7的init程序为systemd,启动服务的时候已经不像centos5那样使用shell脚本来启动服务。


GRUB

grub作为一个bootloader,实现的功能
(1) 提供菜单、并提供交互式接口
          e: 编辑模式,用于编辑菜单;
          c: 命令模式,交互式接口;
(2) 加载用户选择的内核或操作系统
          允许传递参数给内核
          可隐藏此菜单
(3) 为菜单提供了保护机制
          为编辑菜单进行认证
          为启用内核或操作系统进行认证

grub交互模式下的常用命令
        help: 获取帮助列表
        help KEYWORD: 详细帮助信息
        find (hd#,#)/PATH/TO/SOMEFILE:要指定磁盘分区
        root (hd#,#)  grub文件所在的分区设置为根
        kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的cmdline参数;
        例如:init=/path/to/init, selinux=0
        initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk;
        boot: 引导启动选定的内核;

手动在grub命令行接口启动系统:
         grub> root (hd#,#)
         grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
         grub> initrd /initramfs-VERSION-RELEASE.img
         grub> boot

配置文件:/boot/grub/grub.conf  配置启动时的菜单项
          default=#: 设定默认启动的菜单项;菜单项(title)编号从0开始;
          timeout=#:指定菜单项等待选项选择的时长;
          splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径;
          hiddenmenu:隐藏菜单;
          password [--md5] STRING: 菜单编辑认证;选择启动项的时候使用p按键输入密码。
          title TITLE:定义菜单项“标题”, 可出现多次;
                  root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub的“根”;
                  kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
                  initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件;
                  password [--md5] STRING: 启动选定的内核时进行认证;
          password放在title里面表示内核认证,放在外面表示编辑菜单需要认证
          grub-md5-crypt 用于生成md5加密后的密码

grub安装
        如果grub配置文件丢失,则启动时进入grub交互模式;如果grub的stage 1(MBR)损坏则无法启动任何系统。重新安装grub使用grub-install,这命令实现完全安装(stage1、stage1.5、stage2)
        grub-install --root-directory=ROOT /dev/DISK       #root-directory是指明包含boot目录的位置

grub修复
        假设场景MBR损坏,但是系统此时没有重启
        方法一:直接使用上述命令安装即可。
        方法二:直接输入grub命令进入交互模式。
        grub>root  (hd#,#)
        grub>setup  (hd0)       #指定是磁盘而非分区,这时会修复stage1,使用现有/boot目录下的stage1和stage1.5来修复

如果无法损坏后无法开启系统,使用光盘进入救援模式,在救援模式下的bash-4.1# 执行grub-install,也可以切换/mnt/sysimage(原系统的根文件系统)来进行grub的安装

引导加载程序grub详解

Centos启动流程及grub legacy的更多相关文章

  1. 【Linux】【Basis】CentOS启动流程

    1. 基础概念       1.1 Linux系统的组成部分:内核+根文件系统         内核:进程管理.内存管理.网络协议栈.文件系统.驱动程序.安全功能             IPC:In ...

  2. Linux的启动流程以及GRUB详解

     一.Linux引导和启动流程       概述,计算机电源接通后通过BISO之后,没有问题,就会去硬盘上找到MBR(Main Boot Record 主引导记录区)位于整个硬盘的0磁道0柱面1扇区, ...

  3. linux基础之CentOS启动流程

    一.基本概念 内核设计流派: 单内核设计:Linux //所有功能集成于同一个程序 微内核设计:Windows,Solaris //每种功能使用一个单独子系统实现 Linux内核特点: 支持模块化:. ...

  4. centos启动流程&lbrack;转&rsqb;

    启动流程概览 在硬件驱动成功后,Kernel 会主动呼叫 init 程序,而 init 会取得 run-level 资讯: init 运行 /etc/rc.d/rc.sysinit 文件来准备软件运行 ...

  5. centos启动流程

    centos6启动流程 1.主板,post加电自检,检查硬件环境 2.主板选择一个硬盘进行引导,执行mbr446 grub stage1 3.grub stage1.5 加载/boot分区文件系统驱动 ...

  6. linux网络相关命令之脚本和centos启动流程

    nice 功用:设置优先权,可以改变程序执行的优先权等级.等级的范围从-19(最高优先级)到20(最低优先级).优先级为操作系统决定cpu分配的参数,优先级越高,所可能获得的 cpu时间越长. 语法: ...

  7. CentOS6启动流程(含详细流程图)

    参考:Linux启动流程和grub详解(作者:好笔记运维) 为什么把这位的参考放在前面,主要是这位大佬的流程图太详细了.虽说不一定要了解这么详细,但还是很佩服啊.不多说,上图(在新标签中打开图片) 下 ...

  8. Centos 6启动流程详解

    author:JevonWei 版权声明:原创作品 Centos6 启动流程 POST开机自检 当按下电源键后,会启动ROM芯片中的CMOS程序检查CPU.内存等硬件设备是否正常运行,CMOS中的程序 ...

  9. 第二十章、启动流程、模块管理与 Loader grub

    Boot Loader: Grub 『 boot loader 是加载核心的重要工具』!没有 boot loader 的话,那么 kernel 根本就没有办法被系统加载! boot loader 的两 ...

随机推荐

  1. android案例一 电话拨号器

    效果图:   电话拨号器的核心原理:  意图   MainActivity代码:     private EditTest et_number; //加载一个布局 setContentView(R.l ...

  2. 如何通俗地理解 Gradle

    http://www.zhihu.com/question/30432152 一句话概括就是:依赖管理和任务执行. 像Ruby里面的bundler+rake,像iOS中的cocoapods,像node ...

  3. yii2 增加新的目录结构

    搭建新的目录结构详细点击这里 搭建Restful API 点击这里 1.开发环境操作系统        Windows Server 2012 R2 DatacenterPHP架构        Ap ...

  4. mysql alter的常用用法

    增加字段,并加注释: ALTER TABLE table_name ADD field_name field_type [not null|null|default value][comment '注 ...

  5. SKProductsRequest ios 7不调用delegate

    在iOS7中,内购只能在真机上才会调用 - (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProdu ...

  6. VPS服务器利用WINSCP软件进行SFTP管理服务器文件

    虽然我使用VPS时间也不是很久,但是我善于进行统计和分析,从我在的一些VPS交流QQ群中,可以看到基本上使用搬瓦工VPS的站长群中新手较多,甚至很多人都搞不明白VPS与V-P-N的区别都直接选择VPS ...

  7. spring的Convert机制

    spring.core包内有Converter接口,方法是T convert(S source);从一个类型转为内容一个类型的实际转化器:converters可能非常多,需要一个注册器来集中管理使用, ...

  8. python 时间戳和时间格式互相转换

    #!/usr/bin/python3 # -*- coding: utf-8 -* import time def str_to_stamp(): # 转换显示格式 time1 = time.strp ...

  9. Kotlin入门&lpar;28&rpar;Application单例化

    Application是Android的又一大组件,在App运行过程中,有且仅有一个Application对象贯穿应用的整个生命周期,所以适合在Application中保存应用运行时的全局变量.而开展 ...

  10. java常用技巧

    字符串转换成数值的方法 String s="123"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法:i=Integer.valueOf(s) ...