CentOS 系統啟動流程

CentOS 系統啟動流程



一、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.orgwKioL1fWj2CR-RxsAABLI23WHcc213.png

2)ramdisk:輔助的偽根文件系統 ;作用:加載驅動(非必要的)

      CentOS 5: /boot/initrd-VERSION-release.img

      CentOS6,7: /boot/initramfs-VERSION-release.img

3)模塊文件:/lib/modules/VERSION-releasewKioL1fWkrWBbeKrAABLy7FK6Is290.png



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.png



一、內核空間詳細過程如下:


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

[root@centos7 ~]# runlevel
3 5
[root@centos7 ~]# init 3
PolicyKit daemon disconnected from the bus.
We are no longer a registered authentication agent.
[root@centos7 ~]# runlevel
5 3
[root@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腳本:接受一個運行級別數字為參數,如下:

[root@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
[root@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

[root@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
[root@CentOS6 ~]# chkconfig --list NetworkManager
NetworkManager 	0:off	1:off	2:off	3:off	4:off	5:off	6:off
[root@CentOS6 ~]# chkconfig --level 35 NetworkManager on
[root@CentOS6 ~]# chkconfig --list NetworkManager
NetworkManager 	0:off	1:off	2:off	3:on	4:off	5:on	6:off
[root@CentOS6 ~]# chkconfig --level 35 NetworkManager off
[root@CentOS6 ~]# chkconfig NetworkManager on
[root@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

[root@CentOS6 ~]# cd /etc/init
[root@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]

    文件如下:

[root@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

原創文章,作者:zhumengxiaotao,如若轉載,請注明出處:http://www.www58058.com/46334

(4)
zhumengxiaotaozhumengxiaotao
上一篇 2016-09-13
下一篇 2016-09-14

相關推薦

  • 淺談正則表達式

    1.       什么是正則表達式 基本說來,正則表達式是一種用來描述一定數量文本的模式。Regex代表Regular Express。本文將用<<regex>>來表示一段具體的正則表達式。 一段文本就是最基本的模式,簡單的匹配相同的文本。   2. &n…

    Linux干貨 2016-08-12
  • DHCP

        動態主機設置協議(Dynamic Host Configuration Protocol,DHCP)是一個局域網的網絡協議,使用UDP協議工作,主要有兩個用途: 用于內部網絡或網絡服務供應商自動分配IP地址給用戶 用于內部網絡管理員作為對所有電腦作中央管理的手段     …

    Linux干貨 2017-07-24
  • Linux進程篇16.4top命令:進程管理工具

    top命令:進程管理工具

    2017-12-18
  • 初學Linux之shell腳本編程

    shell程序的特點;shell腳本的結構和格式要求;變量;算術運算和邏輯運算;條件測試;防止擴展和shell登錄的相關配置文件

    2018-01-01
  • 馬哥教育網絡班22期+第12周課程練習

    1、請描述一次完整的http請求處理過程; 1. 建立或處理連接:接收請求或拒絕請求; 2. 接收請求:接收來自于網絡上的主機請求報文中對某特定資源的一次請求的過程; 3. 處理請求:對請求報文進行解析,獲取客戶端請求的資源及請求方法等相關信息; 4. 訪問資源:獲取請求報文中請求的資源; 5. 構建響應報文…

    Linux干貨 2016-11-28
  • Zabbix基于Proxy分布式部署實現Web監控

    前言 在日常運維工作中,難免會遇到這樣或那樣的故障,如何能在第一時間發現故障,并及時定位故障原因,保證業務不受影響,我想這應該是做好一個運維必須要掌握的技能。但人力不可能實時掌控系統的變化,于是監控系統應運而生,監控便是運維的眼睛,把監控和性能管理做好后,運維就是一件很輕松的事情。目前比較流行的開源監控工具有Cacti、Nagios(Icinga)、Zabb…

    Linux干貨 2015-07-13
欧美性久久久久