Linux系统启动流程

CentOS 5和6的启动流程
    Linux:kernel(内核)+rootfs(root文件系统)

        kernel:进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
        rootfs:
            glibc 库调用

        库:函数集合,function,调用接口
            过程调用:procedure 不必有返回值
            函数调用:function 必须有返回值

        程序

        内核设计流派:
            单内核设计:Linux
                把所有功能集成于同一个程序;
            微内核设计:Windows,Solaris
                每种功能使用一个单独子系统实现;

        Linux内核特点:
            支持模块化: .ko
            支持模块的动态装载和卸载;

            组成部分:
                核心文件:/boot/vmlinuz-VERSION
                基于内存的磁盘 ramdisk:
                    CentOS 5: /boot/initrd-VERSION-release.img
                    CentOS 6: /boot/initramfs-VERSION-release.img
                模块文件:/lib/modules/VERSION-release

    CentOS 系统启动流程:
        POST:加电自检;
            ROM芯片:CMOS
                BIOS:基本输入输出系统
                ROM+RAM

        BOOT Sequence(顺序):
            按次序查找个引导设备,第一个有引导程序的设备即为本次启动用到的设备;

            bootloader:引导加载器,程序
                windows:ntloader
                Linux:
                    LILO:LInux LOader(老版) 现运行在手机上
                    GRUB:GRand Uniform Bootloader
                        GRUB 0.X:GRUB Legacy
                        GRUB 1.X:GRUB2

                功能:提供一个菜单,允许用户选择要启动系统或不同的内核版本;
            MBR:512字节
                446:bootloader
                64:fat 文件系统分区表
                2:SSAA

            GRUB:
                bootloader:first stage
                disk: second stage

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

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

                ramdisk:

                    内核中的特性之一,使用缓冲和缓存来对磁盘上的文件访问:

                        ramdisk --> ramfs

                        Centos 5: initrd,工具程序:mkinitrd
                        CetnOS 6: initramfs,工具程序:mkinitrd,dracut

            系统初始化:
                POST加电自检 --> BootSequence 启动顺序(BIOS) --> Bootloader(MBR(硬盘设备))引导程序 --> 加载kernel(ramdisk) --> rootfs(以只读方式装载根文件系统) --> init

        /sbin/init程序

            CenOS 5:

                运行级别:为了系统的运行或维护等应用目的而设定;

                    0-6:7个级别
                        0:关机
                        1:单用户模式(root,无需登录),single,维护模式
                        2:多用户模式,会启动玩咯功能,但不会启动NFS,维护模式
                        3:多用户模式,正常模式:文本界面;
                        4:预留级别,可同3级别;
                        5:多用户模式,正常模式:图形界面
                        6:重启

                    默认级别:3,5
                    切换级别:init #
                    查看级别:
                        runlevel
                        who -r

            配置文件:/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


                    chkconfig命令
                        查看服务在所有级别的启动或关闭设定情形;
                            chkconfig [--list] [name]

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

                            chkconfig --add name

                                #!/bin/bash
                                #
                                #chkconfig: LLLL(为S的运行级别(start),没写级别的为K的运行级别(stop)) nn(设定为S时开头的数字为多少) nn(设定为K时开头的数字为多少)
                            备注:凡是以Kxx开头的,都以stop为参数来调用;凡是以Sxx开头的,都以start为参数来调用。
                        
                        添加服务脚本:    
                        例如:
                            #vim /etc/rc.d/init.d/服务名
                                #!/bin/bash
                                #chkconfig: 345 88 44
                                #description: test srv script
                                echo "hello"
                            #chmod +x /etc/rc.d/init.d/服务名
                            #chkconfig -add 服务名
                        查看运行级别 chkconfig --list 服务名    
                        查看K开头的在rc0.d目录下,S开头的在rc3.d目录下

                        删除:
                            chkconfig --del name

                        修改指定的链接类型
                            chkconfig [--level levels] [--type type] name
                                --level LLLL: 指定要设置的级别:省略时表示2345;

                    注意:正常级别下,最后启动一个服务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.sysinit:系统初始化脚本
                (1)设置主机名;
                (2)设置欢迎信息;
                (3)激活udev和selinux;
                (4)挂载/etc/fstab文件中定义的文件系统;
                (5)检测根文件系统,并以读写方式重新挂载根文件系统;
                (6)设置系统时钟;
                (7)激活swap设备;
                (8)根据/etc/sysctl.conf文件设置内核参数;
                (9)激活lvm及software raid(软raid)设备;
                (10)加载额外设备的驱动程序;
                (11)清理操作(清除启动过程中的临时文件);

            总结:用户空间初始化执行/sbin/init程序时 --> 其实就是读取/etc/inittab配置文件 --> 设置默认运行级别 --> 运行系统初始化脚本、完成系统初始化 --> 关闭对应级别下需要关闭的服务,启动需要启动的服务 --> 设置登录终端,并打印提示符


        CentOS 6:

            init程序为:upstart,其配置文件:
                /etc/inittab,/etc/init/*.conf(实际上是将/etc/inittab分割出不同的脚本)

                注意:/etc/init/*.conf文件语法 遵循 upstart配置文件语法格式;

        详细说明:系统启动流程

        启动系统时,进入单用户模式,即运行级别为1;
        更改完密码后可以直接切换运行级别来启动命令行界面


GRUB(Boot Loader):
    GRUB:GRand Uniform Bootloader
        GRUB 0.X:GRUB Legacy
        GRUB 1.X:GRUB2

    grub legacy:
        stage1:mbr
        stage1_5(提供文件系统驱动):mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统;
        stage2:磁盘分区(/boot/grub/)

        配置文件:/boot/grub/grub.conf <-- /etc/grub.conf

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

        grub的命令行接口
            help:获取帮助列表
            help KEYWORDD(关键字):详细帮助信息
            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:引导启动选定的内核;

            手动在grub命令行接口启动系统:
                grub> root (hd#,#)
                grub> kernel /vmlinuz-VERSION-RELEASE(这里的根为boot目录) ro root=/dev/DEVICE
                grub> initrd /intramfs-VERSION-RELEASE.img
                grub> boot

        配置文件:/boot/grub/grub.conf
            配置项:
                default=#:设定默认启动的菜单项;落单项(title)编号从0开始;
                timeout=#:指定菜单项等待选择的时长;
                splashimage=(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:启动选定的内核或操作系统进行认证;

            grub-md5-crypt命令(生成MD5密码)

        进入单用户模式:
            (1)编辑grub菜单(选定要编辑的title,而后使用e命令)
            (2)在选定的kernel后附加
                1,s,S或single都可以;
            (3)在kernel所在行,键入“b”命令;
            
        安装grub:(CentOS6使用的)
            1.制作系统盘,挂载一块磁盘,分区 boot、swap、根分区
                #fdisk /dev/设备名
                 n-->p-->1-->回车-->设置boot分区大小
                 n-->p-->2-->回车-->设置swap分区大小-->t-->2-->82(分区类型为swap)
                 n-->p-->3-->回车-->设置根分区大小
                 w
            2.制作文件系统
                #mke2fs -t ext4 /dev/boot、根分区
                #mkswap /dev/swap分区
            3.制作启动目录
                #mkdir /mnt/boot
                #mount /dev/boot分区 /mnt/boot
            4.安装grub目录(指定boot启动目录)
                #grub-install --root-directory=/mnt/(根目录) /dev/boot分区
            5.将内核文件、ramdisk文件拷贝
                #cp /boot/vmlinuz-2.6.32-431.el6.x86_64 /mnt/boot/vmlinz
                #cp /boot/initramfs-2.6.32-431.el6.x86_64.img  /mnt/boot/initramfs.img
            6.编辑grub配置文件
                #vim /mnt/boot/grub.conf
                default=0
                timeout=30
                title CentOS (Express)
                        root (hd0,0)
                        kernel /vmlinuz ro root=/dev/vdc3 selinux=0 init=/bin/bash
                        initrd /initramfs.img
            7.制作根目录
                #mkdir /mnt/sysroot
                #mount /dev/根目录 /mnt/sysroot
                #mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr home root mnt media
            8.拷贝bash命令(需要将库文件一同拷贝)
                #cp /bin/bash /mnt/sysroot/bin/
                #ldd /bin/bash
                #cp /lib64/* /mnt/sysroot/lib64
            9.切换根目录测试是否成功
            10.创建一台新的虚拟机使用创建的这块盘为系统盘,查看是否可以启动
        
        修复grub:(若grub分区损坏后虚拟机未重启)
            (1) 安装grub
                #grub-install
                #grub-install --root-directory=ROOT /dev/DISK
            (2) 安装grub
                进入grub命令行
                #grub
                指明根目录(必须要有grub目录,否则不生效)
                >grub>root(hd#,#)
                安装第一阶段
                >grub>setup(hd#)(安装到硬盘上)

        进入救援模式修复系统(当系统无法启动时)
            1.挂载相同系统的镜像到机器上
            2.以光驱启动
            3.选择rescue开头的那一项 或 按ESC 进入命令行输入linux rescue 进入紧急救援模式(类似windows挂PE)
            4.选择网络-->选择continue-->OK(查看真正的根路径)
            5.start shell
            6.切换到根目录(4中的根目录)
                #chroot 根目录
            7.安装grub
                #grub-install --root-directory=/ /dev/DISK(系统盘)
            8.退出并重启,卸载光盘
                #exit
                #reboot

 

你可能感兴趣的:(Linux)