CentOS 6系統啟動流程

Linux系統的組成

內核+根文件系統
內核功能:
    進程管理、內存管理、文件系統管理、網絡管理、安全功能、驅動程序

運行中的系統環境可分為兩層:內核空間、用戶空間
    用戶空間:應用程序(進程或線程)
    內核空間:內核代碼(系統調用)

內核設計流派:
    單內核設計:把所有功能集成與同一個程序
        Linux
    微內核設計:每種功能使用一個單獨的子系統實現
        Windows,Solaris

    Linux內核特定:
        支持模塊化:.ko(Kernel Object)
        支持模塊運行時動態裝載或卸載

        組成部分:
            核心文件:/boot/vmlinuz-VERSION-release
            ramdisk:
                CentOS 5:/boot/initrd-VERSION-release.img
                CentOS 6,7:/boot/initramfs-VERSION-release.img
            模塊文件:/lib/modules/VERSION-release

CentOS系統啟動流程

整體來說系統啟動分為以下幾個過程:

%ZZ(2}_)I(VCNDFP$47J1F0.png

1.加電自檢

步驟1:通過BIOS(Basic Input Output System)即基本輸入輸出系統來檢測硬件設備是否存在且運行正常,如:CPU、內存、硬盤,如果有異常情況,BIOS自檢階段會報錯,從而導致系統無法啟動
步驟2:去讀BIOS啟動順序當中的第一個可引導設備(例如硬盤)的第一個扇區(MBR 512字節),然后執行里面的代碼,實際上這里BIOS并不關心啟動設備第一個扇區中是什么內容,它只是負責讀取該扇區內容、并執行

2.Boot Loader

 我們首先來了解一下MBR,它是Master Boot Record的縮寫。硬盤的0柱面、0磁頭、1扇區稱為主引導扇區。它由三個部分組成,主引導程序(Bootloader)、 硬盤分區表DPT(Disk Partition table)和硬盤有效標志(55AA)
 Boot loader:引導加載器
    Windows:ntloader
    Linux:LILO、GRUB

我們以GRUB為例來分析整個過程:
    Boot loader的主要功能是功能豐富,提供菜單,允許用戶選擇要啟動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓、展開,并把系統控制權移交給內核。存放于MBR的前446bytes當中,但是446bytes容納這么多功能,顯然是很難得,因此,將Boot loader程序分為三個階段來運行:
        stage1:存放于MBR的前446bytes當中,負責引導stage2
        stage1.5:在MBR之后的扇區中存放,讓stage1中的bootloader能識別stage2所在的分區上的文件系統
        stage2:通過Bootloader加載所有配置文件及相關的環境參數信息,這些配置文件及相關的環境參數存放于磁盤分區上的/boot/grub目錄下

3.加載kernel

在Bootloader開始讀取操作系統內核文件后,接下來會將內核文件解壓縮后裝載到內存當中,然后根據內核提供的功能開始測試與加載各個設備(CPU、硬盤、網卡等)。
通過ramdisk來加載設備的驅動程序
    ramdisk:
        能夠通過bootloader程序將其加載到內存當中,然后這個文件會被加壓縮并且在內存中模擬一個根文件系統,這個根文件系統能夠提供一個可運行的程序,通過該程序加載在啟動過程當中所需要的核心模塊。
    CentOS 5:initrd,工具程序:mkinitrd
    CentOS 6:initramfs,工具程序:mkinitrd,dracut
        mkinitrd initramfs-KERNEL-VERSION.img KERNEL-VERSION

Boot loader可以加載kernel以initrd,然后在內存中讓initrd解壓縮成根目錄,然后內核可以在這個虛擬的根文件系統上加載和是的驅動程序,來加載硬盤等設備,之后釋放虛擬的根文件系統,并以只讀方式掛載磁盤上真實的根文件系統,之后啟動/sbin/init程序

內核空間啟動過程

POST --> BootSequence(BIOS) --> BootLoader(MBR) --> kernel(ramdisk) --> rootfs(readonly) --> /sbin/init

4.啟動用戶空間第一個執行程序/sbin/init

init程序
    CentOS 5:采用Sys V,配置文件為/etc/inittab
    CentOS 6:采用Upstart方式,特點是守護進程間的通信依賴于D-Bus進行,因此,可基本實現類似并行啟動;
        配置文件:/etc/inittab、/etc/init/*.conf
    CentOS 7:采用systemd方式,服務只有在第一次被訪問到時才會真正啟動起來,因此,啟動過程非常之快
        配置文件:/usr/lib/systemd/system, /etc/systemd/system

運行級別:為了系統的運行或維護等目的而設定的機制
    0:關機,shutdown
    1:單用戶模式(single),root用戶,無須認證可直接登錄
    2:多用戶模式,會啟用網絡功能,但不會啟用nfs,維護模式
    3:正常模式,多用戶,全功能,文本界面,通常用于服務器
    4:預留級別
    5:正常模式,多用戶,全功能,圖形界面操作,一般用于個人
    6:重啟,reboot

    默認級別:3,5
    級別切換:init #
    級別查看:who -r或runlevel

在內核、硬件及驅動信息加載完畢后,內核會呼叫用戶空間中的第一個執行程序/sbin/init,是所有進程的父進程,init程序主要功能是對系統進行初始化:

    1.首先會去讀取配置文件/etc/inittab、/etc/init/*.conf
        /etc/inittab文件格式
            id:一個任務的標識符
            runlevels:在哪些級別下運行此任務#,##,可以為空,表示所有級別
            action:在什么條件下運行此任務
            process:任務

        action:
            wait:切換至此級別運行一次
            respawn:此process終止,就重新啟動之
            initdefault:默認運行級別;process省略
            sysinit:設定系統初始方式,此處一般指為/etc/rc.d/rc.sysinit

    2.根據以上配置文件當中所定義運行級別以及參數去執行/etc/rc.d/rc.sysinit進行系統的初始化,/etc/rc.d/rc.sysinit所做的事情主要以下幾點
        (1)根據配置文件中的設定來配置主機名(去讀/etc/sysconfig/network文件中HOSTNAME進行)
        (2)打印文本歡迎信息
        (3)掛載所有定義在/etc/fstab文件中的文件系統
        (4)激活swap設備
        (5)激活SELinux和udev
        (6)檢測根文件系統,并實現以讀寫方式重新掛載
        (7)設置系統時鐘
        (8)根據/etc/sysctl.conf文件設定內核參數的值
        (9)激活LVM和RAID設備
        (10)加載額外的設備驅動程序
        (11)清理操作

    3.根據默認運行級別執行/etc/rc.d/rc腳本
        /etc/rc.d/rc腳本根據默認運行級別去啟動或關閉/etc/rc.d/rc#.d目錄下的所有腳本
            K*:要停止的服務;k##*,優先級,數字越小,越是優先關閉;依賴的服務先關閉,而后關閉被依賴的
            S*:要啟動的服務;S##*,優先級,數字越小,越是優先啟動,被依賴的服務先啟動,而依賴的服務后啟動
        rc腳本:接受一個運行級別數字為參數
            /etc/init.d/*(/etc/rc.d/init.d/*)腳本執行方式
                # /etc/init.d/SRV_SCRIPT {start|stop|restart|status}
                # service SRV_SCRIPT {start|stop|restart|status}

            chkconfig命令:管控/etc/init.d目錄下每個腳本在各級別下的啟動或關閉狀態
                查看:chkconfig --list [NAME]
                添加:chkconfig --add SRV_NAME
                    能被添加至服務腳本定義格式之一:
                        #!/bin/bash
                        #
                        # chkconfig: LLL NN NN
                        # description:
                刪除:chkconfig --del SRV_NAME
                修改指定的連接類型:
                    chkconfig [--level LEVELS] name <one|off|reset>
                        --level LEVELS:指定要控制的運行級別,默認為2345
    4.執行/etc/rc.d/rc.local腳本
        正常級別下,最后啟動的一個服務S99local沒有連接至/etc/init.d/下的某腳本,而是鏈接至了/etc/rc.d/rc.local腳本;因此,不便或不需寫為服務腳本的程序期望能開機自動運行時,直接放置于此腳本文件中即可
    5.在完成系統所有先關服務啟動之后,接下來Linux就會啟動終端或者是X Window來向用戶提供登錄界面
        根據/etc/init/tty.conf文件中的配置啟動一個應用程序-----login
        如果默認運行級別為5,會啟動一個圖形虛擬終端,附加X應用程序

用戶空間的啟動流程:/sbin/init

設置默認運行界別 --> 運行系統初始化腳本,完成系統初始化 --> 關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務 --> 設置登錄終端 --> login

系統啟動流程簡要總結

POST加電自檢 --> Boot Sequence(BIOS) --> Boot Loader(GRUB) --> kernel(ramfs) --> rootfs(readonly) --> switchroot --> /sbin/init --> (/etc/inittab, /etc/init/*.conf) --> 設定默認運行級別 --> 初始化系統腳本(/etc/rc.d/rc.sysinit) --> 關閉或啟動對應級別下的服務(/etc/rc.d/rc#.d/) --> 啟動終端程序

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

(0)
zhai796898zhai796898
上一篇 2016-09-15
下一篇 2016-09-15

相關推薦

  • class15磁盤管理(二) 高級磁盤管理(一)

    掛載點和/etc/fstab 配置文件系統體系 被mount、fsck和其它程序使用 系統重啟時保留文件系統體系 可以在設備欄使用文件系統卷標 使用mount -a命令掛載  /etc/fstab 中的所有文件系統 文件掛載配置文件 /etc/fstab每行定義一個要掛載的文件系統;   &nbsp…

    Linux干貨 2016-09-05
  • 循環語句for、while、until

    作用:    循環語句的作用是它可以讓一段代碼重復的執行,直到所需條件不滿足為止。 在linux中變量的賦值方式有三種:       第一:直接等于號賦值       第二:通過read交互賦值       第三:for循環的賦值 bash腳本中的循…

    Linux干貨 2016-08-22
  • inotify+rsync同步方案(ubuntu,適用其他發行版)

    系統:Ubuntu 16.04.1  工具:rsync 3.1.1 、inotify -tools 3.14      作者:jevtse    本文除了軟件安裝部分,其他內容同樣適用其他linux系統;同步目標主機:172.16.250.…

    2017-03-05
  • class-6 積累應用

    1、三種權限rwx對文件和目錄的不同意義     ## 讀寫執行對于文件的意義         r:針對于文本文件         w:可修改內容,但不能刪除文件本身,需要x權限配合  &n…

    Linux干貨 2016-08-05
  • Google 開源技術protobuf

    1.  Protobuf簡介        protobuf是google提供的一個開源序列化框架,類似于XML,JSON這樣的數據表示語言,其最大的特點是基于二進制,因此比傳統的XML表示高效短小得多。雖然是二進制數據格式,但并沒有因此變得復雜,開發人員通過按照一定的語法定義結構化的消息格式,然后送給命令行…

    系統運維 2015-04-04
  • 網絡班23期學習宣言

    馬哥Linux運維學院 學習宣言 親愛的小伙伴:        歡迎大家報名馬哥Linux運維網絡學習班,跟隨馬哥學習Linux技術,成就Linux大牛之夢。在這里,我們不僅可以學習到最優秀的技術課程,還可以跟著追夢的小伙伴們一起學習、一起進步。 為了督促大家一直積極認真努力的學習,請各位同學在評論區寫出你的學習宣言?!?/p>

    2016-09-05
欧美性久久久久