系统启动流程以及内核管理

Posted

tags:

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

linux的组成:

 linux是单内核的系统,而windows是多个微内核的组成的操作系统 
 linux内核的作用:进程管理,内存管理,设备管理,网络管理,硬件驱动,安全机制

启动流程:

1,POST加电自检
    作用:对电脑的各种硬件进行检测,看是否正常
        ROM(主要):加载Bios保存电脑的输出程序,但是它是保存在内存之中
        RAM:保存电脑的各种参数设置,不然BIOS设置存不住,比如时间。并且指定对应的启
        动项,如从光盘还是硬盘启动
        bootloader:引导加载器,负责引导程序。解压,展开内核,并且把控制权交给内核。如
        用GRUB启动,在6,7版本上不一样
2,MBR引导
    1,前446个字节放的是bootloader,中间64个字节存放磁盘的分区表,最后两个字节是55AA
3,grub
    1,加载grub文件夹中的内容
4,kernel进行初始化
    1,以只读的方式挂载根
    2,运行系统的第一个程序/sbin/init
    3,探测所有的硬件设备
    4,加载各种硬件的驱动程序

    在centos7中硬件的驱动程序是按照需求加载的,如果开机启动时没有检测到硬件,那么就
    不会加载相对应的驱动程序,用来节省启动时间,让启动的更加迅速

    vmlinuz放着最核心的驱动文件,这个文件在光盘中存在,是红帽公司出厂的时候打包到光
    盘中。如果丢失可以进行复制。在编译内核或内核文件丢失时候可以用到此文件,后缀要
    加上内核的版本号(name -r)

注:硬件的驱动程序存放在/lib/modules/kernel` uname -r `/中,如果需要则加载,不需要不
加载

辅助的文件系统存放在greb下的initramfs.img文件中

注:在6,7上放的虚拟的文件系统,在跟早的系统上放的是虚拟的光盘,然而光盘占用的磁盘
空间非常的大,从而导致启动的时长更加长

用modeinfo 可以看到驱动模块的详细信息,以及驱动模块的存放目录

    综上所述:在系统中特定的文件系统的根放在grub下的initramfs中,可以看到文件系统的驱
    动不是放在boot目录中,而是放在其他目录中。那么在系统启动时,并不会加载文件系统驱
    动所在的目录。但是如果不加载文件系统驱动,则无法挂载根目录,导致系统无法启动。
    因此在centos中,会在grub下这个文件中会做一个这个伪根目录,以便于启动的时候运行

    注:查看initramfs.img文件,不过要改文件名,改成GZ后缀的文件名,改成之后在进行解
    压缩。就可以看到操作系统的根的驱动。只有在启动过程中有这个驱动,那么才可以加载
    文件系统的根

    常见问题:
        1,没有initramfs.img文件
            解决:
                切换根目录
                用mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)来进行修复

        2,在centos7上没有boot目录的内容
            解决:
                拷贝光盘里的vmlinuz文件,加上版本号
                重启系统即可

内核的特点:

在官网下载内核,下载之后解压后的init目录下存放着内核的源码,可以查看,并修改源码,
并且修改启动的第一个进程

在centos6和7上对应的init文件不属于一个包,可以用rpm来查看,因为在这两个系统上并不
是由一个应用程序启动的

早期centos的加载是等待执行,可以理解成当一个进程启动完成之后,才会启动另一个进
程。这样很多缺点,如系统启动时间过长,或者某一个应用程序无法启动,从而导致整个系
统都无法启动。所以在centos后期的版本中进程之间是并行执行启动,这样可以大大的节省
启动时间,也可以在启动时排除一些进程不必要的干扰

    默认启动模式:在centos6上可以改动/etc/inittab中改开机启动的模式,在centos7也有此
    文件,但是centos7上无法再此文件中定义启动的模式,需要通过调用系统命令来修改系
    统的默认启动模式,且在centos7系统中定义的只有两种启动模式,分别是图形和命令行
        centos6:
            查看:runlevel
            修改:在配置文件中修改id:3:initdefault: 
            注:
                0,关机模式
                1,单用户模式(系统进行维护,破解root口令)
                3,多用户模式
                5,图形界面
                6,重启

                如在配置文件中误修改成重启模式,可在开机界面进入单用户模式修改

        centos7:
            查看:systemctl get-default
            修改:
                systemctl set-default graphical.target  
                systemctl set-default multi-user.target         

系统的启动流程:

系统启动的第一个程序:/sbin/init
init读取其初始化文件:
    centos6:/etc/inittab
    centos7:systemctl set-default name.target(只有/lib/systemd/system/*.target文件中AllowIsolate=yes 才能切换)

/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) 清理操作 
rc N --> 意味着读取/etc/rc.d/rcN.d/(进行系统初始化)
    作用:在其中有很多的K开头的文件和S开头的文件,其中K代表是关闭,S代表是启动,其
    中的数字代表启动的顺序

    注:
        1,在切换模式的时候/etc/rc.d/rcN.d/里面的服务也会重新启动一遍
        2,自己编写的脚本在启动时尽量往后放,因为自己编写的脚本需要依赖很多其他程序才
        能够运行,当然关闭的时候要首先关闭自己编写的脚本

        调整服务的启动次序:
            chkconfig可以查看到当前的各个服务的启动级别,也可以进行设置

            例:chkconfig --level 345 atd off 改这个级别下的自启动,如果不带任何选项,那么则代
            表的是2-5模式之中关闭

        源码包安装的服务在书写启动脚本的格式(尽量用case语句):
            必须加上的行:
                chkconfig 2345(-) (S)96  (K)06 (设置启动的等级,启动和关闭的顺序)
                description: test service (在centos6上加不加都可以,在5版本上必须得加上这一行,才
                能启动对应的服务)
        美化启动脚本,引用相应的functions文件中的action函数:
            source /etc/init.d/function
            action "xxx is stop"

        将启动脚本通过chkconfig命令加入到启动项里,如果删除可以用这个命令删除,不然会有
        相应的缓存文件
        chkconfig add :添加服务
        chkconfig del :删除服务

        注:在linux运行的过程中可能一些服务由于种种原因导致无法启动,那么切换开机启动模式,然后在对相关进行改动即可

        如果不想用chkconfig加入到自启动中,可以加入到rc.local中,注意这个脚本中的服务是最
        后启动的服务

        xinetd(超级守护进程)管理的服务:
            作用:
                centos6系统中一些服务的代理服务,在centos7中交由systemd代理。在centos6中的某
                些服务会依赖于这个服务的启动而启动,从而来减少系统的压力比如已经淘汰的Telnet
                服务,就是依赖于xinted服务的启动而启动
            对象:
                一些访问量不多的服务,当有人访问这个服务时才会启动对应的服务,可以节约一些启
                动的资源
            启动:
                要修改要启动服务对应的配置文件,把disabled这一项改成no

    在生产中要注释掉的快捷键,避免误操作:ctrl alt delete 三键连按是重启
            centos6:
                注释/etc/init/control-alt-delete.conf的start on control-alt-delete这一行
            centos7:
                删除/usr/lib/systemd/system/ctrl-alt-del.target

grub:

配置文件:
    default=#: 设定默认启动的哪一个内核;落单项(title)编号从0开始, 
    timeout=#:指定菜单项等待选项选择的时长
    splashimage=(hd#,#)/PATH/XPM_FILE:菜单背景图片文件路径(可以自定义启动图片,
    但是图片的像素是640*480,后缀是xpm.gz)
    title TITLE:定义菜单项“标题”
    hiddenmenu:隐藏菜单(如果没有,那么不按e就可以看到启动项)
    password [--md5] STRING: 可以为启动项增加密码
    kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核 
    initrd /PATH/TO/INITRAMFS_FILE: 内核匹配的ramfs文件

    注: initrd必须在kernel下面,因为要先加载文件系统

grub分区启动的常见问题:
    1,缺少前446个字节的bookloader(一阶段,进入救援模式)
        解决:
            进入救援模式下
            1:
                grub-install --root-directory=DIR(挂载的目录) /dev/DISK(对应的分区)——————挂载对应的磁盘
            2(boot下的备份文件必须要存在):
                #] grub
                grub>root (hd0,0)—————挂载根分区 
                grub>setup (hd0)—————生成对应的MBR分区表
    2,没有grub配置文件(二阶段错误,出现grub提示符)
        解决:
            手动写grub.conf配置文件
    3,没有grub目录和前446个字节
        解决:
            1,切换根目录
            2,grub-install /dev/sda
            3,写grub.conf文件
                default=0
                timeout=3
                title my linux
                kernel /vmlinuz ro root=/dev/sda1 selinux=0
                initrd /initramfs.img
                注:root (hd0,0)可写可不写,默认根分区是第一个分区
            4,重启系统
    4,boot分区全部删除
        解决:
            1,进入救援模式,开启一个shell,切换根目录
            2,挂载光盘,拷贝内核文件(vmlinuz),mkinitrd /boot initramfs.img `uname -r`(可以直接装内核,不过要强制安装内核)
            3,grub-install /dev/sda(重做MBR分区)
            4,写grub.conf文件
            5,重启系统
    5,删除boot分区,删除fstab文件(基于逻辑卷安装的系统)
        解决:
            centos6:
                1,用fdisk命令先找到根分区的属于哪个分区,然后用blkid命令查看当前分区有没有逻
                辑卷,并找到对应的挂载目录
                2,用lvdisplay可以看到逻辑卷是否处于启用状态,如果没有启用,可以用vgchange -ay可以启用逻辑卷
                3,启用之后编辑/etc/fstab(要在对应的根目录下)
                4,重启系统
                5,切换根目录
                6,生成grub-install /dev/sda(重做MBR分区)
                7,写grub.conf文件
            centos7:
                1,进入BIOS界面,设置光盘启动,进入救援模式
                2,挂载光盘,并强制安装内核
                3,安装完成之后,制作grub配置文件grub2-install /dev/sda(重做MBR分区)
                4,用 grub2-mkconfig -o /boot/grub2/grub.cfg 生成grub.cfg文件
                5,重启电脑
grub加密(6,7上的加密方式不一样)
    6上加密:
        在grub.conf的配置文件中加入password这一行,后面跟上对应的密码
            明文:
                直接输入密码
            密文:
                grub-md5-crypt生成密码串
                加入配置文件password --md5 密码串(输入a进入单用户模式改密码)
    7上加密:
        明文:
            在/etc/grub.d/00_header中加入如下几行
            cat << EOF
            set superusers=‘admin‘
            password admin qwe123
            E0F
        密文:
            用grub2-mkpasswd-pbkdf2生成密文
            把密文写入到配置文件之中
            g重新生成配置文件:grub2-mkconfig  -o  /boot/grub2/grub.cfg

制作小型的linux系统:

必须要有的分区:boot分区,根分区

拿到独立的磁盘,进行分区,分区之后创建文件系统

把创建分系统挂载到系统的目录上,并用相应的命令用grub-install生成boot下必须要的文
件(生成完成后需要检查一下boot下的文件是否存在)

书写grub.conf配置文件在centos6上要手动输入,在centos7上可以用grub2-mkconfig生成对
应的文件

把根目录挂载对应的目录下,并创建常用文件夹,并且复制一些常用命令对应的动态链接库
文件,并复制网卡的驱动模块(modeinfo查看驱动的位置,ethtool -i 查看网卡驱动insmod可
以加载网卡模块)

切换根目录,检查是否成功,成功后即可移植此磁盘到别的电脑中

创建一台新的虚拟机把对应的磁盘加入到虚拟机之中,然后开启虚拟机,并加载网卡驱动

注:
    使新制作的系统有网络功能:
    查看网卡的驱动模块:ethtool -i ech0
    查看网卡驱动模块的所在位置,并拷贝到新的磁盘中:modinfo e1000
    启动新的虚拟机,添加网卡驱动模块:insmod e1000
    添加成功后用ifconfig添加网址即可通讯

proc文件夹:

作用:内存中加载的文件吧·

配置文件:/etc/sysctl 配置文件的格式中.代表目录中的/(如路由转发等,以及禁止ping的
功能,在centos6上是写好的文件,在centos7上是空白,需要手动添加)
写完配置文件后,可以用sysctl -p选项可以让配置立即生效,可以用sysctl -a查看当前内存中
生效的配置文件(如果该文件中没有内容,那么需要手动添加)

清除缓存(man proc):
    echo 3 > /proc/sys/vm/drop_caches

内核编译(通常在/boot目录下):

编译方法:和大部分软件的源代码编译的方式差不多,但是内核中有很多的功能,要在生产
中判断有些功能是否启用(内核裁剪),从而加快系统的运行效率

编译过程:
    准备好安装编译环境,以及10G以上内存空间,查看主机的CPU架构,下载好对应的内核
    源码包(www.kernel.org)

    .config:准备文本配置文件

    make menuconfig:配置内核选项(看哪些功能需要,哪些功能不需要)

    make && make install (生成的内核在/lib/modules/生成对应的文件,名字就是内核的版本) 
查看当前生效的内核模块:

    lsmod显示由核心已经装载的内核模块(其实是查看/proc/modules文件)

    modinfo可以显示所有模块的信息,即使是没有装载的模块都会显示出来

    modprobe可以加载相应的模块(模块的配置文件在/etc/modprobe.d/中)

    注:insmod也可以加载和卸载模块,不过此命令会有依赖性,所有不常用类似于rpm装软件包。
        modprobe在加载和卸载内核模块的时候,不会检查驱动的依赖性,类似于装软件的yum

Busybox:

作用:可以用来定制小型的Linux操作系统,比如手机系统,到各种智能的终端设备,它占用
的空间十分小,只需要一个小型的内核和Busybox就可以运行

原理:每个命令都有相应的动态链接库文件,但是这些库文件中有些库文件是相同的,所以
可以利用这个软件对一些启动的动态链接库进行优化,排除掉冗余的库文件,从而来简化系
统的各项功能

编译:
    装一些依赖的软件包
    装完之后下载busybox,解压后进入其中
    make menuconfig 选一些特定的功能
    make && make install   如果出错,执行make clean后,重新执行上面命令 
    mkdir /mnt/sysroot/ 
    cp -a _install/* /mnt/sysroot/ 

检查:切换根目录,看命令是否执行,如果制作小型的linux系统,那么则需要对应的boot分区,以及相应的文件

注:busybox仅支持sh,ash,不支持bash。如果想切换根目录致_install下,需要切换shell,或者把bash命令,以及相关的库文件拷贝到该目录下,即可切换

systemd:

管理启动的软件:可以并行启动一些程序(取出一些程序的依耐性,在Ubantu上也有使用)

systemd启动机制:
    基于socket的激活机制:socket与服务程序分离(有些程序是基于套接字文件启动的程序,
    比如mysql,这个服务启动的时候会打开相应的3306端口,在本地打开MySQL是按照套接
    字文件进行启动,而远程打开则是通过3306端口进行访问) 
    基于d-bus的激活机制
    基于device的激活机制  
    基于path的激活机制 

优点:可以同时启动多个应用服务,启动成功没有任何提示,启动不成功会报错
缺点:不止任何的扩展,但是在6上面可以支持定义的一些启动项

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

Linux系统启动与内核管理(下)

Linux系统启动流程内核及模块管理

Centos启动流程及grub legacy

13linux系统启动流程

CentOS 系统启动流程

CentOS系统启动流程