• 二十四、系统启动流程


    CentOS 5和6的启动流程

     整个系统某一时刻要么执行内核代码,要么在执行rootfs某个路径下某个应用程序的某个用户代码

     linux :kernel+rootfs

        kernel :进程管理、内存管理、网络管理

    一、

    kernel的功能

        1、输出系统调用

        2、实现tcp/ip,文件系统

        3、协调硬件工作

        4、模块化装载驱动,让硬件工作

    进程管理:(创建、调度、销毁、进程结构体、task struct、tast list、虚拟内存空间和地址、物理内存空间和地址、常驻内存集、虚拟内存集、进程间通信IPC机制、内核多任务工作、进程的类型、结构、定义、进程的状态) 创建进程和销毁进程系统调用

    网络管理(网络定义、CSMA/CD、PARC实验室、网络拓扑、网桥和交换机隔离冲突产生广播(MAC表)、MAC、路由器隔离广播域(路由表)、IP协议、分类、子网掩码的作用、ARP协议和攻击方式?、广域网和城域网、端口号作用、进程间通信、URL、ISO的OSI模型、如何将主机接入网络 创建、绑定、监听socket(多路复用)) 内核中实现tcp/ip协议,通过系统调用输出

    内存管理(申请内存、释放内存) 通过系统调用完成 

    文件系统 (文件系统中识别一切皆是文件,按名存取,交换分区,日志型文件系统和非日志型文件系统,格式化,VFS,)通过系统调用open() read() write()

    安全管理: selinux,权限模型

    驱动程序

    二、

    为什么会用到rootfs?

    linux系统运行需要路径完成,目录格式在FHS中定义。不同路径提供完成不同的功能,/bin,/sbin开机所需的程序,/lib,/lib64开机程序所依赖的库

    库和二进制程序的区别

      相同:都是程序
      不同:
          库: 没有执行入口,只能作为有执行入口程序的片段运行,与运行的程序一块存活(函数的生命周期)
          二进制程序有执行入口

    程序开发调用的库 和 源码编译为二进制程序运行时加载至共享内存中的不相同

    程序开发时,调用syscall二次封装的库(Glibc库 gun/libc)及查看头文件

    glibc库的位置: /usr/lib,/usr/lib64,/lib,/lib64

    头文件:记录库的数量和有多少个调用的函数库,函数名,及可向函数传递的参数

    :函数集合,functions 功能

    函数:代码片段,函数可以接受参数,完成灵活多样的功能

    函数名:方便使用代码就为其取了一个名字

        调用函数:即为调用函数名,完成功能

        调用接口:即为功能入口或功能的名字

    依据库被调用执行后是否有执行结果返回对库调用进行分类

        过程调用:没有返回值,procedure

        函数调用:有返回值:function

     操作系统的组成:kernel + 程序(【程序运行时所依赖的】库+二进制程序)

    三、内核

    kernel设计流派

       单内核:所有功能在内核单个进程中以线程实现。稳定,效率高。如果任何一处出故障,全体崩溃。(Linux)

       微内核:每种功能使用一个单独子系统实现。不稳定,效率低。任何处出故障不影响全局,可单模块修复。(Windows,Solaris)

       微内核理论比单内核更为先进,但是微内核多个子系统间的协调过于复杂,所以单内核和微内核设计思想或建构方式不分伯仲。

        

    Linux内核特点

        1、进程轻量,轻量到相当于微内核中线程线程的概念。

        2、进程中类似于轻量级进程模式运行进程,进程称为thread

        3、linux线程实现与windows、Solaris不一样

        4、当有人质疑Linux使用单内核时,linus曾说:只要linux能跑起来,而且没有什么严重的问题,我们就应该让它进行下去,毕竟稳定压倒一切

        5、吸收微内核设计:支持模块化设计:内核中模块 .ko (kernel object) 程序调用的库 .so (share object) 模块相当于程序的库的概念,只是模块只能被kernel调用。库只能被程序调用

        6、更多硬件、协议、文件系统运行

     7、支持模块的动态装载和卸载

    kernel组成

        核心文件: /boot/vmlinuz-VERSION-release

              ramdisk: (安装系统后由安装程序生成)

                    CentOS 5: /boot/initrd-1.2.3-1.OS.CPU.img

                    CentOS 6+: /boot/initramfs-1.2.3-1.OS.CPU.img

        模块文件: /lib/modules/VERSION-release  与核心文件VERSION-release版本保持一致

        内核文件:/lib/modules/VERSION-release /kernel

     四、CentOS x86平台 启动流程

    4.1、POST加电自检

       加电 -- CPU自举(CPU找到ROM特定地址空间中的特定指令,CPU运行指令,完成硬件自检)-- 显示BIOS界面

    4.2、Boot Sequence(MBR)

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

        

       如果存储设备都没有MBR,到网络设备时:

            1、通过网卡发送广播,找到dhcp服务器,获取一个IP地址

            2、并通过dhcp获得能够传递过来一个引导加载程序的文件服务器(tftp)

            3、传递引导程序过来,完成系统引导

    MBR工作(系统引导)

        引导加载器:MBR=446(bootloader) + 64(fat) + 2 SSAA

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

        引导加载器分类:

            Windows NT Loader (New Technology)

            Linux 

                LILO Linux Loader 古老,无法加载1024后的柱面,现多用于嵌入式

                grub:grand uniform boot 统一引导加载器(Linux,Windows,BSD),突破LILO限制

                    grub1 CentOS5,6 0系

                    grub2 CentOS 7 1系

        Step1: 找到MBR时,运行MBR中的bootload进入1

        Step1.5:是分区的文件系统的驱动。 step1.5在MBR后面的一段空间中,1完成后自动运行1.5

        Step2:进入分区,运行grub程序,根据配置显示菜单,根据用户选择的内核,和ramdisk,加载至内存。移交控制权给内核

    4.3、Kernel工作

     自身初始化内核自动解压、展开

        1、探测可识别到的所有硬件设备;

        2、加载驱动(包括从ramdisk中加载驱动)

     3、只读方式挂载根文件系统

     5、运行用户空间的第一个应用程序:/sbin/init

        

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

                ramdisk分类

                    CentOS 5: ramdisk 在内存中当作磁盘,当内核挂载根时,需要再一次缓冲ramdisk

             initrd  ,    工具程序:mkinitrd

                    CentOS 6,7: ramfs 在内存中当作文件系统,直接挂载

            initramfs, 工具程序:mkinitrd(已放弃),dracut

                

    4.4、只读切换挂载rootfs

    4.5、启动init

                init分类

                    CentOS 5 System V init (1、进程切换,2、进程依赖 。 串行启动进程)

                配置文件:/etc/inittab

                    CentOS 6 Ubuntu upstart --> init (dbus:进程间通信基于BUS总线。基于dbus机制,没有依赖。接近并行启动进程 )

                配置文件: /etc/inittab, /etc/init/*.conf (未使用该配置文件启动)   /etc/init.d/* 脚本启动

                    CentOS 7 MAC/OS---> systemd (1、不借助bash解释器 ,systemd能完成初始化[仅启动需要的进程,不需要的进程,假启动,在需要访问此进程时,都会启动])

                配置文件: /etc/systemd/system , /usr/lib/systemd/system

                    

        CentOS5,6: service

        CentOS 7: systemctl

    4.6、init程序初始化

    1、设置主机名

    1)CentOS 5: HOSTNAME=`/bin/hostname`
    2)CentOS 6: HOSTNAME=$(/bin/hostname)
    # Set the hostname.
    update_boot_stage RChostname
    action $"Setting hostname ${HOSTNAME}: " hostname ${HOSTNAME}
    [ -n "${NISDOMAIN}" ] && domainname ${NISDOMAIN}

    2、设置欢迎信息 baner

    1)CentOS 5: echo -en $"		Welcome to "
    2) CentOS 6echo -en $"		Welcome to "

    3、激活udev和selinux

    4、挂载/etc/fstab文件中定义的文件系统

    action $"Mounting local filesystems: " mount -a -t nonfs,nfs4,smbfs,ncpfs,cifs,gfs,gfs2 -O no_netdev
    else
            action $"Mounting local filesystems: " mount -a -n -t nfs4,smbfs,ncpfs,cifs,gfs,gfs2 -O no_netdev
    fi

    5、检测根文件系统,并以读写挂载文件系统

     mount -n -o remount,ro /
     

    6、设置系统时钟 

    7、激活swap设置

    8、根据/etc/sysctl.conf文件设置内核参数

    9、激活lvm2及software RAID

    10、加载额外设备的驱动

    11、清理操作

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

    CentOS 6启动区别  (ubunt研发)

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

    0:关机
    1:单用户模式
    2:无网络支持的多用户模式
    3:有网络支持的多用户模式
    4:保留,未使用
    5:有网络支持有X-Window支持的多用户模式
    6:重新引导系统,即重启

     默认级别:3,5

    切换级别: init #

    查看级别: runlevel  或 who -r     

      注意:

        多数的桌面的linux系统缺省的runlevel是5,用户登陆时是图形界面,而多数的服务器版本的linux系统缺省的runlevel是3,用户登陆时是字符界面,runlevel 1和2除了调试之外很少使用,runlevel s和S并不是直接给用户使用,而是用来为Single user mode作准备。

    [coosh@vmtest ~]$ runlevel 
      N 3
    后者代表当前的runlevel,前者代表之前的runlevel,如果runlevel自开机后一直没有改变过,则前者为字母N。

    配置文件: /etc/inittab   

        id:runlevel:action:process

          action :   wait 切换至此级别运行一次;

              respawn:此process终止,就重新启动之;

              initdefault :设定默认运行级别,process省略;

              sysinit:完成系统初始化

      

        程序: upstart

        配置文件: /etc/inittab 切割成/etc/init/*.conf

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

    说明:rc  0 ---> 意味着读取/etc/rc.d/rc0.d/

      K*  : K##*   ##运行次序,数字越小,越先运行;数字越小的服务,通常为依赖到别的服务;

      S*  : S##*   ##运行次序,数字越小,越先运行;数字越小的服务,通常为依赖到别的服务;

    #!/bin/sh
    #
    # NetworkManager:   NetworkManager daemon
    #
    # chkconfig: - 23 84  所有级别
    ( 第一个数字(0-6级别):表示默认当我们授shouchkconfig显示控制时候--初始化时在那些级别下设定为S;
                 为“-”时所有级别都不为S,即所有级别下都自动添加K开头链接
     第二个数字 :s## (S23)
     第三个数字 :K## (K84)

    chkconfig 命令

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

        chkconfig  [--list]  [name]

      添加 :

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

        chkconfig --add  name

       删除:

        chkconfig  --del  name

      修改制定的链接类型:

        chkcofnig [--level ] name  <on|off|reset>

            --level  ### :制定要设置的级别:省略时表示2345

     chkconfig 命令参考 :http://note.youdao.com/noteshare?id=c151989eaa65a0d87a1ca4089c0e854a&sub=17478E269CA54395AD1192BE12A10743

    注意:正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本;

    因此,不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中。

     4.7、终端

     用户登录之前shell程序是不会启动的,启动的是登录程序

     tty.conf 与终端相关

    exec /sbin/mingetty $TTY

    mingetty会调用login程序

        rc.conf 启动服务

    exec /etc/rc.d/rc $RUNLEVEL

        rcS.conf 初始化

    exec /etc/rc.d/rc.sysinit 系统初始化脚本

    如何跳过开机密码,进入维护模式

        1、启动系统时,设置其运行级别1;

    wKiom1mim3nguOhJAAASWcZY-Pc725.png

         2、在此界面下,按任意键。      

          向上下箭头:完成上下移动。

          e : 在启动前编辑高亮菜单 

          a : 在启动前修改内核参数

          c : 打印一个命令行

    wKioL1mim62jq0scAAAuTKzUPlQ650.png

         3、按e编辑高亮菜单

            b 引导起动

            e 编辑boot顺序所选的命令行

            c 打印一个命令行

            o 在所选行后,打开一个新行

            O 在所选先前,打开一个新行

            d 删除,光标所在行

    wKioL1minIDzcf3nAAA3xPfuiNc611.png

        3、光标移到kernel /vmlinuz行,按e键。    

            类BASH的行编辑器,支持命令行补全(TAB)

            ENTER:在编辑完毕后,可以按ENTER键,接受你的改变

    wKiom1minbyQ_yEBAAAmhLsTdsE356.png

        4、在其后可以输入 1 或 s 或 S 或 single , 并按ENTER键,保存

    wKiom1minzLj2-KOAAAczpOpHgU210.png

    wKioL1minyLinFTFAAANXvcSGyk783.png

        5、再按b键引导,即可完成元密码登入bash

          wKiom1mioDjQC-Q1AAAV2KvACzY017.png

        6、修改密码

    1)echo "PASSWORD" | passwd -n 2 -x 2 -i 100 root  (见passwd命令参数即可

    2)passwd root

    3)openssl passwd -salt $(openssl rand -hex 4) -1 和 usermod -p PASSWORD user

     7、切换运行级别

     runlevel 
    
     init 3
     

    详细centos6系统启动流程 :http://note.youdao.com/noteshare?id=b6c9a064fafa9781aa1bb2a934d91393&sub=FCA25BC0C7D54FD6A8A1B656B8E08CF0

  • 相关阅读:
    页面性能优化的简单介绍
    JavaScript基础介绍
    迅雷/快车/旋风地址转换器
    关于 API 中返回字串的一些问题
    将文件夹映射为驱动器的工具
    BCB/Delphi2007 隐藏任务栏图标
    所有小工具
    oracle ora01033和ora00600错误
    批量更改文件名的批处理文件
    替代Windows运行功能的工具FastRun
  • 原文地址:https://www.cnblogs.com/liuzhiyun/p/11414805.html
Copyright © 2020-2023  润新知