1.CentOS的开机启动流程
  POST(加电自检)——〉BIOS(BOOT Sequence)——〉MBR(bootloader)——〉kernel(ramdisk) ——〉rootfs ——〉init

   (1)POST加电自检
         在ROM中定义,在其芯片上CMOS上写
         而且BIOS这个程序在这个芯片上有定义
         ROM+RAM构成了内存,其中ROM是规定好了的程序

   (2)BIOS中有系统引导加载次序:BOOT Sequence
            1)如果引导加载次序汇总无引导设备的工具,则会通过网卡发出广播,搜寻dhcp服务器,进而寻找一个文件服务器,看他能否送过一份Bootloader
            2)引导加载器程序:bootloader


   (3)Bootloader的功能
         1)提供一个菜单,允许用户选择要启动的系统或不同的内核版本,把用户选定的内核装载到内存的特定空间中,解压,展开,并把系统控制权移交给内核
         2)GRUB组成:
                  bootloader:1st stage
                  disk:2nd stage


   (4)kernel
            自身初始化:
                探测可识别到的所有硬件设备;
                加载硬件驱动程序;(有可能会借助于ramdisk加载驱动)
                以只读方式挂载根文件系统;
                运行用户空间的第一个应用程序:/sbin/init
            ramdisk:
                 内核中的特性之一:使用缓冲和缓存来回对磁盘上的文件访问
                 CentOS 5 :ramdisk
                 CentOS 6 :ramfs
                 CentOS 6 上之所以不用ramdisk的原因是:ramdisk会将内存伪装成硬盘,当系统启动后再次用到ramdisk上的驱动时,它仍会再将其加载一次到内存中,但是它本身就位于内存中
                 ,如此会浪费资源时间,在CentOS 7上升级为ramfs,这样他就表现为文件系统了,就不用再一次加载到内存了。
   


   (5)init主程序读取配置文件/etc/inittab
               1)CentOS 5:
                运行级别:为了系统的运行或维护等应用目的而设定;
                    0-6:7个级别
                        0:关机
                        1:单用户模式(root, 无须登录), single, 维护模式;
                        2: 多用户模式,会启动网络功能,但不会启动NFS;维护模式;
                        3:多用户模式,正常模式;文本界面;
                        4:预留级别;可同3级别;
                        5:多用户模式,正常模式;图形界面;
                        6:重启

                    默认级别:
                        3, 5

                    切换级别:
                        init #

                    查看级别:
                        runlevel
                        who -r

            2)配置文件:/etc/inittab

                每一行定义一种action以及与之对应的process
                    id:runlevel:action:process
                        action:
                            wait: 切换至此级别运行一次;
                            respawn:此process终止,就重新启动之;
                            initdefault:设定默认运行级别;process省略;
                            sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit;

                            ...

                    id:3:initdefault:
                    si::sysinit:/etc/rc.d/rc.sysinit

                    l0:0:wait:/etc/rc.d/rc 0
                    l1:1:wait:/etc/rc.d/rc 1
                    ...
                    l6:6:wait:/etc/rc.d/rc 6

                        说明:rc 0 --> 意味着读取/etc/rc.d/rc0.d/
                            K*: K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务;
                            S*: S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务;

                            for srv in /etc/rc.d/rc0.d/K*; do
                                $srv stop
                            done

                            for srv in /etc/rc.d/rc0.d/S*; do
                                $srv start
                            done

            3)chkconfig命令
                    查看服务在所有级别的启动或关闭设定情形:
                     

           chkconfig [--list] [name]


                    添加:
                        SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d)

                        chkconfig --add name
                            #!/bin/bash
                            #
                            # chkconfig: LLLL nn nn

                    删除:

                        chkconfig --del name



                    修改指定的链接类型

                        chkconfig [--level levels] name <on|off|reset>


                            --level LLLL: 指定要设置的级别;省略时表示2345;

              注意:正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本;因此,不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中;

                    tty1:2345:respawn:/usr/sbin/mingetty tty1
                    tty2:2345:respawn:/usr/sbin/mingetty tty2
                    ...
                    tty6:2345:respawn:/usr/sbin/mingetty tty6

                        mingetty会调用login程序



   (6)/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) 清理操作;

   


总结:/sbin/init --> (/etc/inittab) --> 设置默认运行级别 --> 运行系统初始脚本、完成系统初始化 --> 关闭对应下需要关闭的服务,启动需要启动服务 --> 设置登录终端





2.GRUB的相关知识
    (1)GRUB(bootloader)
        stage 1:MBR
        stage 1_5:MBR之后的扇区,让stage 1中的bootloader能识别stage2所在的分区的文件系统
        stage 2:磁盘分区上主程序加载的配置文件(/boot/grub)


    (2)stage2及内核等通常放置于一个基本磁盘分区;
            功用:
                (1) 提供菜单、并提供交互式接口
                    e: 编辑模式,用于编辑菜单;
                    c: 命令模式,交互式接口;
                (2) 加载用户选择的内核或操作系统
                    允许传递参数给内核
                    可隐藏此菜单
                (3) 为菜单提供了保护机制
                    为编辑菜单进行认证
                    为启用内核或操作系统进行认证
    
    (3)grub的命令行接口

            help: 获取帮助列表
            help KEYWORD: 详细帮助信息
            find (hd#,#)/PATH/TO/SOMEFILE:
            root (hd#,#)
            kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;额外还可以添加许多内核支持使用的cmdline参数;
                例如:init=/path/to/init, selinux=0
            initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk;
            boot: 引导启动选定的内核;

    (4)手动在grub命令行接口启动系统:

            grub> root (hd#,#)
            grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE 
            grub> initrd /initramfs-VERSION-RELEASE.img
            grub> boot

    (5)配置文件:/boot/grub/grub.conf
            配置项:

                default=#: 设定默认启动的菜单项;落单项(title)编号从0开始;
                timeout=#:指定菜单项等待选项选择的时长;
                splashp_w_picpath=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜单背景图片文件路径;
                hiddenmenu:隐藏菜单;
                password [--md5] STRING: 菜单编辑认证;
                title TITLE:定义菜单项“标题”, 可出现多次;
                    root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub的“根”; 
                    kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
                    initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件;
                    password [--md5] STRING: 启动选定的内核或操作系统时进行认证;


3.系统操作过程中常见的几种问题以及解决方式
    (1)如果管理员的密码忘记了,除了重装系统之外,还有什么靠谱的方法呢
         很显然,在这里我们就要进入到单用户模式下,进行密码的修改。相关的操作步骤如下:
          

          1)编辑grub菜单(选定要编辑的title,而后使用e命令)
          2)在选定的kernel后附加1,s,S,single 都可以。然后回车退出
          3)在kernel的所在行,键入“b”命令,进行启动
          4)这样我们就启动了单用户模式,在其中执行passwd命令修改管理员密码就成功了

            


    (2)如果我们在执行系统操作时,不小心将MBR的前446字节给破坏了,那么我们如何修复?
          1)在不关机的情况下,我们修复的方法为:
               安装grub

               1.grub-install
                  # grub-install --root-directory=ROOT /dev/DISK

               2.在键入grub命令,在grub命令行内创建grub

                 # grub
                 grub > root (hd#,#)
                 grub > setup (hd#)

          2) 如果在这种情况下,我们关机了,仅依靠我们自身的操作系统是无法实现修复的,因为我们连启动菜单都启动不了,又从何说要恢复呢!
             这时只能依靠救援模式进行系统的恢复了


    (3)如果我们在执行过程中,将grub的配置文件给破坏了,应该如何修复呢?
          1)如果我们没有关机,可直接重新编写配置文件就可以了
          2)如果我们关机了,那么应该如何来拯救我们的系统呢?
             1.首先我们开机会出现一个"grub> "类似的命令行,在这个命令行下我们可以进行如下操作

                  help:获取帮助
                  help KEYWORD:获取详细帮助
                  find (hd0, 0) /PATH/TO/SOMEFILE: 查询指定分区下有无要找的文件
                  root(hd#,#):指定boot目录为根目录
                  kernel /PATH/TO/KERNEL_FILE ro root=/dev/DEVICE init=/PATH/TO/INIT:设定本次启动时用到的内核文件,额外还可以添加许多内核文件支持使用的cmdline参数
                                                                                      同时还可以指定root的位置,以及开机能启动的初始化程序
                  initrd /PATH/TO/INITRAMFS_FILE:设定为选定的内核提供额外文件的ramdisk
                  boot:引导启动选定的内核