LINUX 启动流程

举报
李国有 发表于 2019/07/21 23:21:00 2019/07/21
【摘要】 ### 系统启动流程 系统组成:内核+根分区文件系统 磁盘分区及相关文件 启动分区 /boot 内核设计流派 单内核设计: 把所有功能集成于同一个程序 Linux 微内核设计:每种功能使用一个单独的子系统实现 Windows,Solaris Linux 内核特点...

### 系统启动流程

    系统组成:内核+根分区文件系统 

    磁盘分区及相关文件

    


    启动分区  /boot


    内核设计流派

        单内核设计: 把所有功能集成于同一个程序 

            Linux

        微内核设计:每种功能使用一个单独的子系统实现

            Windows,Solaris

        

    Linux 内核特点

        支持模块化:

        支持模块运行时动态装载或者卸载


        内核组成

            核心文件: /boot/vminuz-VERSEION-Release

            模块文件: /lib/modules/

            ramdisk: 临时内存根文件


    CentOS 系统的启动流程


        POST: '加电自检'

            ROM: CMOS

                BIOS: Basic Input and output system

            

        Boot Sequence:

            按次序查找各引导设备、第一个有引导程序的设备、为本次启动要用的设备


            bootloader: 引导加载器、程序

                Winodws: ntloader

                Linux: 

                    LILO: Linux Loader --- 无法加载大硬盘  (目前手机使用最多)

                    GRUB: Grand Uniform Bootloader 

                        GRUB 0.X ---CentOS5/6  Grub Legay

                        GRUB 1.X ---CentOS7  (是一个完全重写的程序 )  GRUB2

                    

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

            

            MBR: Master Boot Record

                512 bytes:

                    446 bytes: bootloader

                    64bytes: fat

                    2bytes: 55AA(表示有效、如果是非55AA则表示MBR无效)

            

            GRUB:

                bootloader : 1st stage

                Pattion: filesystem driver 1.5 stage

                disk partition: /boot/grub 2nd stage


        加载Kernel

            自身初始化:

                探测可以识别到的所有硬件设备:

                加载硬件驱动程序(会借且于randisk加载驱动)

                以只读方式挂载根文件系统 

                运行用户空间的第一个应用程序

                    :/sbin/init

                    CentOS5 使用 Sysv init

                        配置文件:/etc/inittab

                    CentOS6 使用 Upstar

                        配置文件: /etc/inittab  

                            重要配置在 /etc/init/*.conf

                    CentOS7 使用 Systemd

                        配置文件: /usr/lib/systemd/

                            /etc/systemd/system/

            ramdisk

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

                    CentOS 5 : initrd

                        工具:mkinitrd

                    CentOS6/7 :initramfs

                        工具:dracut(mkinitrd)

        系统初始化流程(内核级别),POST---> BootSequence(BIOS)---->bootloader(MBR) ---->Kernel(ramdisk)---> rootfs(readonly)----->/sbin/init()


        /sbin/init

            CentOS5 : Sysv init

                运行级别:为了系统的运行或者维护等目的而设定的机制

                    0-6 : 7个级别

                        0: 关机

                        1: 单用户模式(single user) root 账号,不需要认证、维护模式

                        2: 多用户模式,会启动网络功能、但不会启动nfs,维护模式

                        3: 多用户模式,完整功能模式、(不会启动用图形)

                        4: 预留级别、目前无特殊使用目的、功能和3级别一样

                        5: 多用户模式,完全功能模式、图形界面

                        6: 重启模式

                ~]# runlevel (查看目前运行的级别)


                配置文件: /etc/inittab

                    每行定义一种action以及与之对应的process

                        id:runlevels:action:process

                            id:一个任务的标识符

                            runlevel: 运行级别或以写多个、空表示所有级别

                            action: 在什么条件下启动此任务

                            process: 具体的任务是

                        

                        action

                            wait: 等待切换至此余男所在的级别时执行一次

                            respawn: 一旦任务终止、就自动重启

                            initdefault: 设定默认运行级别、此时process省略

                            sysinit: 系统初始化方式、此处一身孕为指定/etc/rc.d/rc.sysinit脚本


                        示例:

                            id:3:initdefault:

                            si::sysinit:/etc/rc.d/rc.sysinit

                            L:0:wait:/etc/rc.d/rc 3

                                意味着去启动或者关闭/etc/rc.d/rc3.d/目录下服务脚本所控制服务

                                    K*: 要停止的服务 K##*,优先级、数字越小、越是优先关闭,依赖的服务先关闭、而后关闭被依赖的

                                    S*: 要启动的服务 S##*,优先级、数字越小、与关闭的顺序相反


                系统初始化脚本:/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:清理操作

                用户空间启动流程:(/sbin/init(/etc/inittab))

                    设置默认运行级别 ---> 运行系统初始化脚本 、完成系统初始化 ---> 关闭对应级别下需要停止的服务,启动对应级别下需要开开启的服务 ---> 设置登陆终端 ---> 启动图形终端


### Grub

    如果识别设备

        (hd#,#)

            hd# : 磁盘编号 

            #: 分区编号

    grub的命令行接口

        help: 获取帮助

        find: 查找文件

        root (hd#,#): 定义根设备

        kernel /PATH/TO/Kernel_file: 设定本次启动时用到的内核文件


        initrd /PATH/TO/INITRAMFS_FILE: 设定为选定的内核 提供的额外的文件的randisk

        boot: 引导启动选择的内核 



    配置文件 /boot/grub/grub.conf

        配置项:

            default=#: 设定默认启动的菜单藏在

            timeout=#: 指定菜单等待的选择时长

            splashimge=(hd#,#)/PATH/TO/XPM_PIC_FILE: 指明菜单背景图片文件路径

            hiddenmenu:隐藏菜单

            passwdord [--md5] STRING:菜单编辑认证

            title TITLE: 定义菜单项”标题“

                root (hd#,#): grub查找stage2 及kernel文件所在设备分区;为grub的根

                kernel /PATH/TO/VMLINUX_FIEL  [Patterns] : 启动的内核 

                initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件

                password [--md5] STRING:启动选定的内核或操作系统时进行谁


        ~]#grub-md5-crypt 密码生成(md5)


    进入单用户模式

        1: 编辑grub菜单(e命令)

        2: 在选定的kernel后、附加

            1,s,S,single

        3: 在kernel所在行、键入'b'命令

    

    如何安装grub

        ~]# grub-install --root-direcotry=ROOT  /dev/DISK

        方案二

        ~]# grub

            grub> root(hd#,#)

            grub> setup(hd#)


### 流程

    POST --> bootloader ---> kernel ---> rootfs ---> switchroot ---> /sbin/init


    内核信息查看

        uname 

            -r : release号

            -n : hostname


        lsmod

            显示的内核来自于/proc/model

        

        modinfo

            show info about a linux kernel module

             -F field: 只显示指定字段信息

             -n :只显示文本

        modprobe

            模块装载

            modprobe -r module_name  ---remove

            modprobe module_name

        

        depmod

            模块生成依赖

        

        insmod 

            install module

            insmod [filename] []

        rmmod

            remove module


    ramdisk 文件管理 

        mkinitrd 

        dracut


        ~]#mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)

        --with=<module>: 除了默认的模块之外还需要安装的模块


    内核信息输出的文件系统

        /proc: 内核状态和统计信息的输出接口、同时还提供一个配置接口/proc/sys

            参数:

            只读:信息输出 /proc/#/*

            可写:配置 /proc/sys/

            命令:

                sysctl 命令 ---> 专用于查看或者设定/proc/sys目录中的值 

                    sysctl [options] [variable [=value]]

                    查看

                        ~]# sysctl -a 

                        ~]# sysctl variable

                    修改

                        ~]# sysctl -w variable=value

                echo 命令

                    查看 

                        ~]# cat /proc/sys/PATH/TO/SOMEFILE

                    修改

                        ~]# echo "value" /proc/sys/PATH/TO

            配置文件

                /etc/sysctl.conf  /etc/sysctl.d/*.conf

                永久有效

                立即生效  sysctl -p key:value


            核心参数:

                net.ipv4.ip_forward: 核心转发

                vm.drop_cache :手动回收 buffer

                kernel.hostname: 主机名

                net.ipv4.icmp_echo_ignore_all: 忽略所有ping

        /sys/

            sysfs: 输出内核各硬件设备的相关属性信息

                也有内核对硬件特性可设置的信息

            

            udev: 通过读取/sys目录下的硬件设备信息按需为各硬件设备 创建文件、:udev是用户 空间程序 


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。