zoukankan      html  css  js  c++  java
  • Centos 6启动流程详解

    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加密口令     
    

    image
    加入的两个密码都不影响电脑的正常启动,只是在编辑启动设置选项时起作用;第一个password --md5加密是在菜单选择时输入密码,第二个password --encrypted加密是在编辑系统启动设置时输入密码,如下所示
    第一次密码的输入,编辑此界面进入单用户或grub命令设置时输入md5加密口令,按‘p’键输入口令,然后进入正常的编辑界面
    image
    image
    进入系统时的界面的加密
    image
    当如下界面按‘b’键启动时,将会进入第二次加密512口令加密界面
    image
    密码输入正确,即可正常进入系统
    image

    结论

    在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

    danran
  • 相关阅读:
    openwrt 汉化
    错误: libstdc++.so.6: cannot open shared object file: No such file or directory
    openwrt uci
    openwrt makefile选项
    Ubuntu服务器断网问题解决
    lldpcli 常用命令
    openwrt ramips随记
    shell脚本学习(二)
    完成响应式的方式
    盒子模型 W3C中和IE中盒子的总宽度分别是什么
  • 原文地址:https://www.cnblogs.com/JevonWei/p/7144339.html
Copyright © 2011-2022 走看看