Linux 内核及系统启动流程

Posted cook

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 内核及系统启动流程相关的知识,希望对你有一定的参考价值。

    kernel的功能:
        进程管理
        文件系统
        硬件驱动
        内存管理
        安全功能:SELinux
        网络子系统


        标准库:glibc

        调用:返回
            利用别的组件的功能,完成某特定事务
            返回值

    内核设计流派:
        单内核体系:
            Linux
                支持模块化
                模块还可以动态装载或卸载

            Linux内核:核心 + 外围模块
                核心:/boot/vmlinux-VERSION-release
                模块:/lib/modules/VERSION-release
                    .ko: kernel object
                ramdisk: /boot/initramfs-VERSION-release.img
                    在内核启动过程中装载根文件系统时有用;

        微内核体系:
            Windows
            Solaris

    Linux系统启动流程:X86(PC)

        POST:加电自检
            ROM+RAM
                ROM:CMOS (Bios)
                RAM:
                        EFI()

            引导次序:按次序找引导设备,第一个有引导程序的设备即为启动PC server所用到的设备;
                1st boot: 
                2nd boot:
                3rd boot:

        MBR:Master Boot Record
            1st sector:512bytes
                446: bootloader
                64: partation table
                2: 5A

        bootloader: 选择要启动的内核(在当前磁盘的某或某些分区上)

            LILO: LInux LOader
                0-1023范围内的柱面构成的分区的内核文件
            GRUB: GRand Unified Bootloader
                CentOS 5,6 Grub 0.97
                CentOS 7, Grub2 1.96

        kernel: 
            自身初始化
                探测所有能识别的硬件
                装载驱动程序
                以只读方式装载根文件系统(rootfs)
                /sbin/init

            CentOS 5: SysV, init
            CentOS 6: upstart, init
            CentOS 7: systemd, init

            CentOS 5 SysV, init, /etc/inittab --> /etc/rc.d/rc.sysinit
            CentOS 6 Upstart, /etc/init/*.conf (/etc/inittab)--> /etc/rc.d/rc.sysinit
                chkconfig
            CentOS 7 Systemd, 
                /usr/lib/systemd/system/

        CentOS 5: init
            kernel ==> /sbin/init (/etc/inittab) 
                设定系统默认运行级别
                    0-6: 7个级别
                        0:关机
                        1: single user mode, s, S, single
                        2: multi user mode, 不支持NFS功能
                        3:完全多用户模式,文本接口
                        4:未使用,预留级别
                        5:完全多用户械,图形接口
                        6: 重启

                    切换级别:init #

                进一步初始化系统
                    /etc/rc.d/rc.sysinit

                启动指定的默认级别的默认为启动的服务,停止指定的级别下默认为关闭的服务;
                    /etc/rc.d/rc#.d
                        S##: 启动的服务
                        K##:停止的服务

                        ##:01-99,数字越小,越优先启动或关闭;

                    脚本如果期望能够被chkconfig命令使用,要在脚本中添加如下行
                        # chkconfig: - 85 15
                            -:当此脚本由chkconfig控制时,默认哪些级别就是开启的,
                            85:启动优先级
                            15: 关闭优先级

                        # chkconfig --add SRV_SCRIPT
                        # chkconfig --del SRV_SCRIPT
                        # chkconfig SRV_SCRIPT {on|off}
                            默认为2345级别;
                            --level ######

                        /etc/rc.d/rc.local (/etc/rc.local): 是一个脚本,通常为系统启动完成的最后运行一个脚本;

                    定义一些组合键的功能:通常是Ctrl+Alt+Delete

                    初始化字符终端

                    如果有需要,启动图形终端

            CentOS 5: /etc/inittab
                每一行定义一种action和对应的程序;
                    id:runlevels:action:process
                    例如
                    si::sysinit:/etc/rc.d/rc.sysinit

                    action: respwan, wait, initdefault
                    l3:3:wait:/etc/rc.d/rc 3

            CentOS 6: /etc/inittab
                由/etc/init/*.conf 一类的配置文件定义init的初始化动作
                    由upstart调用,程序为/sbin/init

    /etc/rc.d/rc.sysinit: 系统初始化脚本
        设定主机名:读取/etc/sysconfig/network文件中的HOSTNAME参数,并以之设定主机名
        打印文本欢迎信息
        激活SELinux和udev
        挂载/etc/fstab文件中定义的其它文件系统
        激活swap
        检测根文件系统,并以读写方式重新挂载;
        设置系统时钟
        根据/etc/sysctl.conf设置内核参数
        激活LVM和RAID设备;
        加载额外设备的驱动程序;
        清理操作

    初始化流程:POST --> (BIOS)boot sequence --> MBR(bootloader) --> kernel + ramdisk(initrd, initramfs) --> mount rootfs (ro) --> /sbin/init (CentOS 5: /etc/inittab, CentOS6 /etc/init/*.conf) 
        设定默认运行级别 --> 使用/etc/rc.d/rc.sysinit初始化系统 --> 分别启动并关闭指定服务 --> Ctrl+Alt+Delete组合键 --> 启动字符终端 --> 启动图形终端


    GRUB: GRand Unified Bootloader
        grub程序由两段组成:
            stage1: MBR (0柱面 0磁道 1扇区)
            stage1_5: MBR随后的扇区
            stage2: 读取grub.conf配置文件,并实现引导功能的扩展

        grub的功能:
            1、提供菜单,并提供交互式接口
                e: 进入编辑模式
            2、选择要启动的内核或系统
                允许传递引导参数给内核
                选择界面可隐藏
            3、为编辑功能提供保护机制
                启用内核文件:
                    选择运行指定的内核得先输入密码
                传递参数:
                    使用e命令得先输入密码

        grub命令行接口:
            root:指定哪个分区为接下来要启动的系统或内核文件所在的分区
                root (DEVICE)
                    所有硬盘都识别为hd
                    不同的硬盘基于数字标识:如hd0, hd1等
                    同一个硬盘上的不同分区,也使用数字标识,如hd0,0  hd1,5

                    root (hd0,0)

                find (DEVICE)/path/to/file

                kernel: 指定要运行的内核文件
                initrd: 为要运行的内核指定其可用的ramdisk文件

                boot: 启动此前配置好的内核或系统

        grub.conf:
            参数:
                default=: 选择第几个title配置的内核或系统,各title从0开始编号
                timeout=#: 菜单显示的超时时长;
                splashimage=/path/to/some_image_file:指定菜单的背景图片;此图片只能为14bits色,xpm格式,gzip压缩;
                hiddenmenu: 隐藏菜单
                title TILTE STRING:显示于菜单中的标题
                    root
                    kernel
                    initrd

        grub保护机制:
            1、生成密码:
                # grub-md5-crypt
            2、保护编辑功能,则需要title之外的添加
                password --md5 密码串
            3、保护使用某内核,则需要内核对应的title之下添加
                password --md5 密码串

        安装grub的方式:
            1、使用grub-install命令
                # grub-install [--root-directory=/path/to/somewhere] DEVICE

                --root-directory=/path/to/somewhere
                    /path/to/somewhere:内核及initrd文件所在的分区的挂载点的父目录,且此挂载点必须叫boot
                        例如:/dev/sdb1: /mnt/boot
                        # grub-install --root-directory=/mnt /dev/sdb



总结:
  系统启动流程 POST --> 引导次序(BIOS)--> BootLoader(MBR) --> kernel + ramdisk (临时根) --> 根切换 (rootfs) --> /sbin/init (配置文件) 配置文件:设置默认运行级别 --> 指定系统初始化脚本进行系统初始化 --> 启动服务(关闭服务)(/etc/rc.d/rc#.d, /etc/rc.d/init.d/) --> /etc/rc.d/rc.local -> 设置CtrlAltDel组合的功用 --> 启动终端(mingetty),并在终端附加登录程序(login) --> 如果级别为5, 则要启动 X server login: root password: mageedu nsswitch: 检查用户帐是否存在,并且如果存在,还能将其解析为UID; 库(API),而非服务 /usr/lib64/libnss* /lib64/libnss* pam: pluggable authentication module, 做用户认证 库 (API) /lib64/security/* ramdisk centos5: initrd ram disk: 块设备 centos6: initramfs ram fs: 配置文件: c5: sysv init, /etc/inittab c6: upstart, /etc/inittab + /etc/init/*.conf chkconfig --add, --del, --list, --level c7: systemd, /usr/lib/systemd/ X-Window: Client --> Server X protocol twm Desktop: GNome, KDE, Xfce GRUB: GRand Unified Bootloader stage1 stage1_5 stage2 命令行接口: grub> 配置文件: /boot/grub/grub.conf 编辑模式: Linux内核:单内核,模块化 内核的某些功能: 编译进内核本体 [*] 编译成内核模块 [M] 不选择使用 [ ] 内核的组成部分: /boot/vmlinuz-VERSION /lib/modules/VERSION/ *.ko: kernel object 模块间有可能存在依赖关系

内核的模块管理

lsmod: 显示内核已装载模块

 动态装卸载模块:
       卸载:modprobe -r MOD_NAME
       装载:modprobe MOD_NAME

       装载:insmod /path/to/module_file
       卸载:rmmod MOD_NAME

  查看某模块的详细信息:
       modinfo MOD_NAME

  检查并生成模块间依赖关系的命令:
       depmod

 



以上是关于Linux 内核及系统启动流程的主要内容,如果未能解决你的问题,请参考以下文章

Centos启动流程及grub legacy

系统启动流程一,运行级别及grub

centos系列的启动流程及基础知识点

linux系统启动流程

13.1 CentOS系统启动流程介绍

Linux系统启动流程及服务控制