设为首页 收藏本站
查看: 1086|回复: 0

[经验分享] CentOS 系统启动流程

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-9-14 10:06:27 | 显示全部楼层 |阅读模式
一、Linux系统的组成部分:内核+根文件系统
1.内核:
  • 进程管理:进程之间的通信为:IPC(Inter Process Communication)机制,有消息队列、semerphor、shm、socket(跨主机之间的通信)
  • 内存管理;
  • 网络管理;
  • 文件系统;
  • 驱动程序;
  • 安全功能;

2.运行中的系统环境可分为两层:内核空间、用户空间
  • 用户空间:应用程序(表现为进程或线程)
  • 内核空间 :内核代码(系统调用)

3.内核设计流派:
  • 单内核设计:把所有功能集成与同一程序;
        Linux
  • 微内核设计:每种功能使用一个单独的子系统实现;

       Windows,Solaris
4.Linux内核特点:
  • 内核模块化:.ko(kernel object)如:文件系统,硬件驱动,网络协议等
  • 支持模块运行时动态装载或卸载;

5.Linux内核组成部分:
1)核心文件:/boot/vmlinuz-VERSION-release
      内核官方站点:https://www.kernel.org wKioL1fWj2CR-RxsAABLI23WHcc213.jpg
2)ramdisk:辅助的伪根文件系统 ;作用:加载驱动(非必要的)
      CentOS 5: /boot/initrd-VERSION-release.img
      CentOS6,7: /boot/initramfs-VERSION-release.img
3)模块文件:/lib/modules/VERSION-release wKioL1fWkrWBbeKrAABLy7FK6Is290.jpg



CentOS 系统的启动流程
(注:以下讲解仅适用于PC架构的主机和MBR类型的架构)
Linux系统启动过程大致按照如下步骤进行(简述):

1)加电自检,BIOS启动引导阶段;
     在该过程中实现硬件的初始化以及查找启动介质;
     从MBR中装载启动引导管理器(GRUB)并运行该启动引导管理;
2)GRUB启动引导阶段;
     装载stage1
     装载stage1.5
     装载stage2
     读取/boot/grub.conf文件并显示启动菜单;
     装载所选的kernel和initrd文件到内存中
3)内核阶段:
     运行内核启动参数;
     解压initrd文件并挂载initd文件系统,装载必须的驱动;
     挂载根文件系统
4)init用户空间初始化阶段:
     启动/sbin/init程序;
     运行rc.sysinit脚本,设置系统环境,启动swap分区,检查和挂载文件系统;
     读取/etc/inittab文件,运行在/et/rc.d/rc<#>.d中定义的不同运行级别的服务初始化脚本;
     打开字符终端1-6号控制台/打开图形显示管理,设置登录

如图所示: wKioL1fXYWChE4uHAAJXxpa2b04715.jpg



一、内核空间详细过程如下:

1.POST:(power on system test)加电自检
  • 负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测。
  • ROM:BIOS(Basic Input and Output System),即基本输入输出系统,它是装载ZA在一个硬件芯片CMOS之上,加电过程就是给CMOS通电,然后启动其上的BIOS程序,BIOS程序会根据CMOS上面的一些配置信息去读取其他硬件设备信息并检测其是否存在并能正常运行,之后进行硬件设备的初始化。
  • CMOS:互补金属氧化物半导体,保存各项参数的设定;
  • ROM+RAM



2.Boot Sequnence
按次序查找引导设备,第一个有引导程序的设备为本次启动设备,即:bootloader;
1)bootloader: 引导加载器,引导程序
  • windows: ntloader,仅是启动OS;
  • Linux:

          LILO:LInux LOader
          GRUB: GRand Unified Bootloader
              GRUB 0.X: Grub Legacy,
              GRUB 1.X: Grub2
  • grub功能:功能丰富,提供一个菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间RAM中,解压、展开,并把系统控制权移交给内核;


2)bootloader装在MBR中:Master Boot Record(主引导记录)
     512bytes :
      446bytes: bootloader,
           64bytes: 分区表
           2bytes: 55AA(有效标识)
3)GRUB(2各阶段)
          bootloader : 1st stage
          Partitioon :1.5 stage  filesystem driver
          Partitioon :2nd stage  分区文件在/boot/grub上


3.Kernel:加载系统内核,执行系统初始化信息
1)自身初始化:
      ·探测可识别到的所有硬件设备
      ·加载硬件驱动程序(可能借助于ramdisk加载驱动)
      ·以只读方式挂载根文件系统
      ·运行用户空间的第一个应用程序:/sbin/init
2)ramdisk:
    内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问
       ·ramdisk--> ramfs 提高速度(完成对真正根文件系统的驱动加载)
             CentOS 5: initrd, 工具程序:mkinitrd
             CentOS 6: initramfs,工具程序:mkinitrd,dracut

     一旦启动了init,内核就不管了,所有的后续操作都是由init去加载运行用户空间的应用程序来完成各种各样的工作,只有当这些应用程序完成系统调用或者系统发生中断时需要特权操作时,内核才会参与;剩余的其他过程都不在参与,而是由用户空间的程序来完成。


4.启动用户空间的第一个执行程序/sbin/init,完成系统初始化
    在内核、硬件及驱动信息加载完毕后,内核会呼叫用户空间中的第一个执行程序/sbin/init,init程序主要功能是准备软件运行环境,包括系统的主机名称、网络配置、文件系统各式等其他服务的启动管理。而这些所有的操作都是通过init的配置文件来定义。

1)init功能:
  • 设定默认运行级别;
  • 指定系统运行的初始化脚本;
  • 启动指定级别下要启动的服务,并关系需要停止的服务;
  • 定义[ctrl][alt][del]组合键的功能;
  • 初始化字符(mingetty6)终端;
  • 启动图形终端


2)init程序的类型:
  • SysV: init, CentOS 5之前

         配置文件:/etc/inittab
  • Upstart: init,CentOS6

         配置文件:/etc/inittab, /etc/init/*.conf
  • Systemd:systemd, CentOS 7

         配置文件:/usr/lib/systemd/system,/etc/systemd/system
3)详见用户空间启动流程

总结:系统初始化流程(内核级别):
    POST --> BootSequence(BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只读) --> /sbin/init(systemd)



二、用户空间启动流程
第一执行程序:/sbin/init

1.init配置文件类别:
  • CentOS 5:
        由于centos5采用的是SysV init方式,其特点是启动用户空间的服务程序,通常通过脚本进行,有依赖关系的服务将被串行启动;这也就导致了centos5的系统启动过程非常缓慢。其配置文件为:/etc/inittab;
         
  • CentOS 6:
        采用Upstart的方式,其特点是守护进程间的通信依赖于D-Bus进行,因此,可基本实现类似并行启动;配置文件:?etc/inittab,/etc/init/*.conf
         
  • CentOS 7:
        采用Systemd方式,其特点是服务只有在第一次被访问时才会真正启动起来;因此centos 7系统的启动过程会非常之快;其配置文件为:/usr/lib/systemd/*.



2.运行级别:为系统运行或维护等目的而设定;0-6:7个级别
  0:关机,shutdown
      1:单用户模式(single user),root用户,无需认证,维护模式;
      2: 多用户模式(multi user),会启动网络功能,但不会启动NFS,维护模式;
      3:多用户模式(multi user),完全功能模式;文本界面;
      4:预留级别;目前无特别使用目的,但习惯以同3级别功能使用;
      5:多用户模式(multi user),完全功能模式;图形界面
      6:重启,reboot
默认级别:3, 5
切换级别:init #
查看级别:runlevel; who -r


   
[iyunv@centos7 ~]# runlevel
3 5
[iyunv@centos7 ~]# init 3
PolicyKit daemon disconnected from the bus.
We are no longer a registered authentication agent.
[iyunv@centos7 ~]# runlevel
5 3
[iyunv@centos7 ~]# who -r
         run-level 3  2016-09-12 19:59                   last=5


3.init 的处理流程

     1)init读取其初始化文件:/etc/inittab

     2)初始运行级别(RUN LEVEL),默认的级别为3;

     3)使用/etc/rc.d/rc.sysinit进行系统初始化;

     4)对应运行级别的脚本目录,由于采用的是3级别,因此只进行                                      l3:wite:/etc/rc.d/rc.3

     5)配置好[ctrl][alt][del]组合的功能;

     6)配置不断电系统pf、pr两种机制;

     7)启动mingetty 6个终端

     8)如果是5级别,则会以/etc/Xll/启动图形化界面


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

    (1) 设置主机名;

    (2) 设置欢迎信息;

    (3) 激活udev和selinux;

    (4) 挂载/etc/fstab文件中定义的文件系统;

    (5) 检测根文件系统,并以读写方式重新挂载根文件系统;

    (6) 设置系统时钟;

    (7) 激活swap设备;

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

    (9) 激活lvm及软raid设备;

    (10) 加载额外设备的驱动程序;

    (11) 清理操作。


5.CentOS 5 的配置文件/etc/inittab

1)每一行定义一种action以及与之对应的process
   id:runlevel:action:process
        id:一个任务的标识符;
        runlevels:在哪些级别启动此任务;#,###,也可以为空,表示所有级别
        action:在什么条件下启动此任务;
        process:任务;
    action:
        wait: 等待切换至此级别时运行一次;
        respawn:一但此任务终止,就重新启动之
        initdefault:设定默认运行级别;process省略
        sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit
        ca::ctrlaltdel:/sbin/shutdown -t3 -r now
2)示例启动如下:   
   id:3:initdefault:
        默认的运行级别为3
   si::sysinit:/etc/rc.d/rc.sysinit
        无论运行哪个级别都会运行此脚本,系统初始化
   l0:0:wait:/etc/rc.d/rc 0
    ...
  l6:0:wait:/etc/rc.d/rc 6


6.启动或关闭所对应的服务

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

     K*:要停止的服务;K##,优先级,数字越小越优先关闭,依赖的服务先关闭 ,而后关闭被依赖的
     S*要启动的服务; S##,优先级,数字越小越是优先启动,被依赖的服务先启动,而依赖的服务后启动   
     rc脚本:接受一个运行级别数字为参数,如下:

   
[iyunv@CentOS6 ~]# ls /etc/rc.d/
init.d  rc  rc0.d  rc1.d  rc2.d  rc3.d  rc4.d  rc5.d  rc6.d  rc.local  rc.sysinit
[iyunv@CentOS6 ~]# ls /etc/rc.d/rc3.d/
K01smartd        K30spice-vdagentd  K73winbind         K84ospfd           K89rdisc         S08iptables     S13rpcbind           S25netfs      S55sshd       S99local
K05wdaemon       K50dnsmasq         K74ntpd            K84ripd            K92pppoe-server  S10network      S15mdmonitor         S26acpid      S80postfix
K10psacct        K50snmpd           K75ntpdate         K84ripngd          K95rdma          S11auditd       S22messagebus        S26haldaemon  S82abrt-ccpp
K10saslauthd     K50snmptrapd       K75quota_nld       K84wpa_supplicant  K99rngd          S11portreserve  S24nfslock           S26udev-post  S82abrtd
K15htcacheclean  K60nfs             K84bgpd            K85zebra           S01sysstat       S12rsyslog      S24rpcgssd           S28autofs     S90crond
K15httpd         K61nfs-rdma        K84NetworkManager  K87restorecond     S02lvm2-monitor  S13cpuspeed     S25blk-availability  S50bluetooth  S95atd
K15svnserve      K69rpcsvcgssd      K84ospf6d          K89netconsole      S08ip6tables     S13irqbalance   S25cups              S50kdump      S99firstboot

脚本框架:
  for srv in /etc/rc.d/rc#.d/K*;do
       $srv stop
  done
  
  for srv in /etc/rc.d/rc#.d/S*;do
       $srv start
  done  

/etc/init.d/*(/etc/rc.d/init.d/*)服务脚本执行方式:
   # /etc/init.d/SRV_SCRIPT {start|stop|restart|status}
   # service SRV_SCRIPT {start|stop|restart|status}


注意:

     正常级别下,最后启动一个服务S99local没有链接至/etc/init.d下某脚本,而是指向了/etc/rc.d/rc.local(/etc/rc.local)脚本;因此,不便或不需写为服务脚本,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中。


7.启动6个终端及调用login程序

1:2345:respawn:/usr/sbin/mingettytty1
2:2345:respawn:/usr/sbin/mingettytty2
   ...
6:2345:respawn:/usr/sbin/mingettytty6

mingetty会自动调用login程序
    x:5:respawn:/etc/X11/prefdm -nodaemon


===========================================================================================

chkconfig 命令:

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

管控/etc/init.d/每个服务脚本在各级别下的启动或关闭状态:

查看:
    chkconfig [--list] [name]
添加:
    chkconfig  --add name
        能被添加的脚本定义格式:
             #!/bin/bash
             #LLLL 表示初始在哪个级别下启动,-表示都不启动
             # chkconfig: LLLL nnnn
删除:
    chkconfig --del name
修改指定的链接类型
     chkconfig [--level levels] name <on|off|reset>
          --level LLLL: 指定要设置的级别;省略时表示2345

   
[iyunv@CentOS6 ~]# chkconfig --list
NetworkManager     0:off   1:off   2:off   3:off   4:off   5:off   6:off
abrt-ccpp         0:off   1:off   2:off   3:on    4:off   5:on    6:off
abrtd             0:off   1:off   2:off   3:on    4:off   5:on    6:off
acpid             0:off   1:off   2:on    3:on    4:on    5:on    6:off
atd             0:off   1:off   2:off   3:on    4:on    5:on    6:off
auditd             0:off   1:off   2:on    3:on    4:on    5:on    6:off
autofs             0:off   1:off   2:off   3:on    4:on    5:on    6:off
bgpd             0:off   1:off   2:off   3:off   4:off   5:off   6:off
blk-availability    0:off   1:on    2:on    3:on    4:on    5:on    6:off

   
[iyunv@CentOS6 ~]# chkconfig --list NetworkManager
NetworkManager     0:off   1:off   2:off   3:off   4:off   5:off   6:off
[iyunv@CentOS6 ~]# chkconfig --level 35 NetworkManager on
[iyunv@CentOS6 ~]# chkconfig --list NetworkManager
NetworkManager     0:off   1:off   2:off   3:on    4:off   5:on    6:off
[iyunv@CentOS6 ~]# chkconfig --level 35 NetworkManager off
[iyunv@CentOS6 ~]# chkconfig NetworkManager on
[iyunv@CentOS6 ~]# chkconfig --list NetworkManager
NetworkManager     0:off   1:off   2:on    3:on    4:on    5:on    6:off


总结:CentOS 5用户空间的启动流程:/sbin/init(/etc/inittab)

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


CentOS 6

    init程序为: upstart, 但依然为/sbin/init;

    其配置文件:/etc/inittab(仅用于定义默认级别), /etc/init/*.conf;

    配置文件的语法遵循upstart配置文件语法格式,和CentOS5不同

文件如下:

    /etc/init/*.conf  rcS.conf,rc.conf,tty.conf

   
[iyunv@CentOS6 ~]# cd /etc/init
[iyunv@CentOS6 init]# ls
ck-log-system-restart.conf  init-system-dbus.conf   quit-plymouth.conf  rcS-sulogin.conf                 serial.conf
ck-log-system-start.conf    kexec-disable.conf      rc.conf             readahead-collector.conf         splash-manager.conf
ck-log-system-stop.conf     plymouth-shutdown.conf  rcS.conf            readahead.conf                   start-ttys.conf
control-alt-delete.conf     prefdm.conf             rcS-emergency.conf  readahead-disable-services.conf  tty.conf


CentOS 6启动流程

    POST --> Boot Sequence(BIOS) --> Boot Loader --> Kernel(ramdisk) --> rootfs--> switchroot--> /sbin/init-->(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别--> 系统初始化脚本rc.sysinit--> 关闭或启动对应级别的服务--> 启动终端


CentOS 7

    init程序:systemd

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

    完全兼容SysV脚本机制;因此,service命令依然可用;不过,建议使用systemctl来控制服务

    # systemctl {start|stop|status|resport} name.[service]

    文件如下:

   
[iyunv@centos7 ~]# ls /usr/lib/systemd/system
abrt-ccpp.service                        gdm.service                         ntpdate.service                    sys-fs-fuse-connections.mount
abrtd.service                            geoclue.service                     oddjobd.service                    sysinit.target
abrt-oops.service                        getty@.service                      paths.target                       sysinit.target.wants
abrt-pstoreoops.service                  getty.target                        plymouth-halt.service              sys-kernel-config.mount
abrt-vmcore.service                      graphical.target                    plymouth-kexec.service             sys-kernel-debug.mount
abrt-xorg.service                        graphical.target.wants              plymouth-poweroff.service          syslog.socket
accounts-daemon.service                  gssproxy.service                    plymouth-quit.service              syslog.target.wants
alsa-restore.service                     halt-local.service                  plymouth-quit-wait.service         sysstat.service
alsa-state.service                       halt.target                         plymouth-read-write.service        systemd-ask-password-console.path
alsa-store.service                       halt.target.wants                   plymouth-reboot.service            systemd-ask-password-console.service
anaconda-direct.service                  hibernate.target                    plymouth-start.service             systemd-ask-password-plymouth.path
anaconda-nm-config.service               htcacheclean.service                plymouth-switch-root.service       systemd-ask-password-plymouth.service
anaconda-noshell.service                 httpd.service                       polkit.service                     systemd-ask-password-wall.path



如上:

  CentOS系统的启动流程包括:内核空间的启动流程和用户空间的启动流程

如下图所示:
wKiom1fXtWzhZ_XHAAixY_zIucM828.jpg


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-272082-1-1.html 上篇帖子: windows 2003安装完成之后网卡未驱动起来,使用驱动精灵万... 下篇帖子: linux下svnsync同步版本库配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表