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 16:07
下一篇 2016-09-15 17:42

相關推薦

  • N22-第十四周作業

    系統的INPUT和OUTPUT默認策略為DROP; ~]# iptables -P INPUT DROP ~]# iptables -P OUTPUT DROP 1、限制本地主機的web服務器在周一不允許訪問;新請求的速率不能超過100個每秒;web服務器包含了admin字符串的…

    Linux干貨 2017-03-15
  • 認識DNS

    DNS全稱是Domain Name System的簡稱,即域名系統。因特網上作為域名和IP地址相互映射的一個分布式數據庫,能夠使用戶更方便的訪問互聯網,而不用去記住能夠被機器直接讀取的IP數串。通過主機名,最終得到該主機名對應的IP地址的過程叫做域名解析(或主機名解析)。DNS協議運行在UDP/TCP協議之上,使用端口號53。 認識DNS 安裝 創建一臺DN…

    Linux干貨 2016-12-07
  • centos6安裝docker

    使用的操作系統是是centos6.3,按照官方的推薦的配置,把linux內核升級到3.8以上。安裝步驟如下: 1、升級內核版本(包含aufs) cd /etc/yum.repos.d     wget http://www.hop5.in/yum/el6/hop5.repo   …

    Linux干貨 2016-05-05
  • 源碼編譯安裝apache httpd-2.2.29

        1.程序包編譯         ? 程序包編譯安裝:   (需要gcc、make工具)            &…

    Linux干貨 2016-08-24
  • I/O重定向及管道

    一、I/O重定向     程序=指定+數據     讀取數據:input     輸出數據:output     打開的文件都有一個fd:文件描述符     l…

    Linux干貨 2016-08-02
  • 由摩根定律引發的思考

    在Linux中,我們常常需要對一些條件進行判斷,而對于多個條件的組合判斷是基于摩根定律而進行的。所以理解摩根定律對于我們學習條件判斷是很有必要的,下面我們就先介紹摩根定律進而引出其在一些具體場景上的應用。   一、摩根定律 在Linux中的條件判斷中,摩根定律可以以下式來表示: !( A || B )=!A && !B !( A &…

    Linux干貨 2016-08-16
欧美性久久久久