CentOS6系統啟動流程

概述

    了解系統的啟動流程,有助于我們了解Linux系統上的一些工作原理,有助于我們深入的理解一個系統的運作方式,那么本篇就以CentOS6系統為例,介紹一下有關Linux系統啟動相關的內容,分為一下幾個部分:

    1、Linux系統的一些基礎概念

    2、CentOS6上的啟動流程概述

    3、系統啟動相關故障恢復和系統服務腳本案例

第一章    Linux系統啟動相關的基本概念

    1、Linux系統的組成部分:內核+根文件系統

        內核的功能:進程管理、內存管理、網絡協議棧、文件系統、驅動程序、安全功能(加密解密的棧、SELINUX等)

    2、運行中的系統環境可分為兩層:內核空間、用戶空間

        用戶空間:一般執行的是應用程序(進程或線程)

        內核空間:執行的是內核代碼,當用戶空間的程序需要用到特權指令,硬件調度等內核級別操作時,通過系統調用,向內核發起申請,由內核執行后,將結果返回給用戶空間的程序

    3、內核設計流派:

        單內核設計:把所有功能集成于同一個程序,linux是單內核

        微內核設計:每種功能使用一個單獨的子系統實現,windows是微內核

    4、Linux內核特點:

        支持模塊化:雖然是單內核設計,把所有功能集成于同一個程序,但是linux支持模塊化的設計,將一些非關鍵性的功能等,做成模塊,一般內核模塊文件為XXX.ko  (kernel object)

        支持模塊運行時動態裝卸載:當一個模塊需要用到時,可以動態對其進行裝載,用不到時,可以動態進行卸載,這樣實際上就類似微內核的設計理念

    5、Linux內核的組成部分:

        核心文件:如:/boot/vmlinuz-2.6.32-642.el6.x86_64 

        ramdisk:因為系統啟動時,根文件系統的一定是在某個磁盤分區上,而內核如果沒有編譯該根文件系統的相關驅動,這樣就會導致無法正常啟動系統;并且內核需要加載的各種模塊文件,其都在/lib/modules/目錄下,此目錄必然在/根下,而根無法驅動,也會造成相關內核模塊無法正常運行,進而也不能啟動系統,此時,就需要借助ramdisk來完成對根文件系統的驅動。而ramdisk是在/boot目錄下,/boot目錄是由grub的1.5階段進行驅動的

                centos5:/boot/initrd-VERSION-RELEASE.img

                centos6、7:/boot/initramfs-VERSION-RELEASE.img

        各種模塊文件:/lib/modules/內核版本號/* 

        如果安裝了多個內核版本,則對應的目錄下就有多個文件,或多個目錄

第二章    CentOS6上的啟動流程概述

    1、CentOS6上的啟動流程概述

    blob.png  

    2、POST加電自檢

        POST: Power-On-Self-Test,加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、 串并行接口、鍵盤、 CD-ROM光驅等硬件情況的檢測。
                ROM: BIOS, Basic Input and Output System,保存著有關計算機系統最重要的基本輸入輸出程序,系統信息設置、 開機加電自檢程序和系統啟動自舉程序等。
                RAM: CMOS互補金屬氧化物半導體,保存各項參數的設定
                按次序查找引導設備,第一個有引導程序的設備為本次啟動設備

        

    3、bootloader程序(Linux系統上為grub)

        引導過程:根據BIOS中設定的次序查找各引導設備,第一個有引導程序的設備,即為本次啟動要用到的設備

        引導程序:bootloader:引導加載器、程序

                windows:叫ntloader

                Linux:

                        LILO:linux loader  現在很多android用的就是此引導程序,對1024柱面后的分區不支持 

                        GRUB:grand uniform bootloader

                                Centos6: GRUB 0.X  零點幾的版本

                                Centos7: GRUB 1.X  一點幾的版本

                                1.X與0.X有很大不同,故GRUB 0.X的版本被稱為grub legacy,而GRUB 1.X的版本被稱為Grub2

        引導程序的功能:

            提供一個菜單,允許用戶選擇要啟動的系統或不同的內核版本;并能夠把用戶選定的內核,裝載到內存中的特定空間中,對其進行解壓展開,而后把整個系統的控制權,移交給內核

        MBR:Master Boot Record主分區不能超過4個

            MBR:一共512個字節byte,前446個字節存儲bootloader,后64byte存儲了分區表(fat),最后2個字節是存儲著4個16進制數據,一般為55AA,表示該MBR是有效的,其他數字表示該MBR無效

            英文字符中,1個字符就需要1個字節

            GRUB:因為MBR中只有前446個字節存儲bootloader,GRUB是bootloader的一種實現方式,也就是說GRUB正常情況下,只能有446個英文字符,這樣對程序員來說,要求太高,故通常情況下,grub分成以下幾個階段:

                    第一階段:存儲在bootloader中

                    第1.5階段:文件系統驅動,稱為第1.5階段,通常存儲在MBR緊跟著的扇區中,用來驅動/boot分區

                    第二階段:放在硬盤的/boot分區的/boot/grub下

                    第三階段:加載內核

                一般情況下,系統啟動時是加電自檢,然后bootloader進行加載內核,但是grub風格的bootloader是先加載grub的第二階段,就是加載磁盤中的/boot/grub,該程序就擺脫了446字節的限定,從而提供了豐富的啟動接口,然后由該程序加載內核

            注意:UEFI、GPT并不適用以上理論

    4、加載內核,內核進行自身初始化

        自身初始化的步驟和功能

            <1>進行自身初始化:

                探測可識別到的所有硬件設備

            <2>加載硬件驅動程序;(可能會借助于ramdisk加載驅動)

            <3>以只讀方式掛載根文件系統;(之所以要以只讀方式掛載,是為了避免萬一內核有bug,造成的文件系統損壞)

            <4>運行用戶空間的第一個應用程序:/sbin/init                    

    5、ramdisk程序介紹

        Linux內核的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問

        ramdisk 是一種把內存當磁盤用的機制,用來啟動時加載相應的驅動等

            早期centos5上用的是initrd(就是把內存當磁盤使用),后來centos6和7換成了initramfs(內存當文件系統使用),之所以換,是因為initrd是把內存當磁盤用,但是一旦涉及到磁盤,為了加速寫入和讀取的速率,就會有緩沖和緩存的出現,但是ramdisk機制本身就是在內存上實現,如果再進行緩沖和緩存,就會造成系統浪費,所以,后期就換成了initramfs

        centos5上initrd的創建工具程序:mkinitrd

        centos6、7上initramfs上的創建工具程序:dracut或mkinitrd

        initrd 映像實際上是一個 RAM 磁盤,其中包含帶有基本配置文件、二進制文件、庫和驅動程序的小型文件系統。在這個小型文件系統中,有一個將在引導期間裝入到內存中的根文件系統,還有一個用于裝入系統設備驅動程序的初始化腳本;它將在加載完所有設備驅動程序后重新加載實際的根文件系統磁盤。

        在內核引導過程中,初始 RAM 磁盤(initrd)是由grub階段 2 引導加載程序加載到內存中的,它會被復制到 RAM 中并掛載到系統上。這個 initrd 會作為 RAM 中的臨時根文件系統使用,并允許內核在沒有掛載任何物理磁盤的情況下完整地實現引導。由于與外圍設備進行交互所需要的模塊可能是 initrd 的一部分,因此內核可以非常小,但是仍然需要支持大量可能的硬件配置。在內核引導之后,就可以正式裝備根文件系統了(通過 pivot_root):此時會將 initrd 根文件系統卸載掉,并掛載真正的根文件系統。

    6、系統第一個程序init

        init程序的類型:

            centos5:SysV init

                其配置文件:/etc/inittab

            centos6: Upstart

                其配置文件:/etc/inittab和/etc/init/*.conf

            centos7:Systemd

                其配置文件:/usr/lib/systemd/system/、/etc/systemd/system/

        init管理用戶空間的各個程序運行,除非有需要進行內核特權級別操作時,內核才會被用戶空間的各個系統調用,完成一些內核級別的操作

       

        init初始化用戶空間的啟動流程為:/sbin/init程序主要是通過讀取/etc/inittab文件來完成一定的任務,完成的任務有:

            定義默認運行級別–>運行系統初始化腳本(/etc/rc.d/rc.sysinit)完成系統初始化–>關閉指定運行級別下的各服務,啟動指定級別下需要開啟的各服務–>啟動tty虛擬終端,調用login程序,顯示登錄提示符,讓終端進行登錄

    7、/etc/inittab配置文件詳解

        配置文件/etc/inittab的格式及其功能:

        (以centos5上的該文件為例介紹,有助于理解centos6、7上對應的文件的作用)

        每行定義一種action,以及與之對應的process

        每行的格式為id:runlevel:action:process

            id:一個任務的唯一標識符

            runlevel:在那些級別啟動此任務;可以是一個數字,也可以多個數字,也可以為空(表示所有級別),例如:3或35或空

            action:在什么條件下啟動此任務

            process:具體執行的任務

            常見的action:

                wait  等待切換至此任務所在的級別時,執行一次(剛切換時執行)

                respawn:一旦此任務終止,就自動重新啟動之

                initdefault:設定默認運行級別,此時,process省略,因為一旦有了initdefault,就表示是定義默認的運行級別,而不需要運行別的process

                sysinit:設定系統初始化方式,該action對應的process一般為指定/etc/rc.d/rc.sysinit腳本,該腳本定義了整個系統初始化時的腳本(centos5、6有用到該腳本,但centos7沒有用到該腳本)

        例如:

            id:3:initdefault: 表示定義默認運行級別就是3

            si::sysinit:/etc/rc.d/rc.sysinit   表示所有級別利用/etc/rc.d/rc.sysinit腳本完成系統初始化

            tty1:2345:respawn:/usr/sbin/mingetty tty1  表示在2345運行級別啟動mingetty指令,給指令傳遞參數tty1,一旦該程序停止,要自動重啟。mingetty會調用login程序,打開虛擬終端的程序,除了minget    ty之外,還有諸如getty等

            l3:3:wait:/etc/rc.d/rc 3   表示當切換到3級別時運行/etc/rc.d/rc腳本,往腳本里傳遞參數為3,意味著去啟動或關閉/etc/rc.d/rc3.d/目錄下的服務腳本所控制的服務

    8、Linux運行級別:為了系統的運行或維護等目的而設定的機制

        0-6一共七個級別,各級別的意義:

            0:關機,shutdown

            1:單用戶級別(single user),root用戶,無需認證,維護模式

            2:多用戶模式,帶網絡功能,但無nfs功能,維護模式

            3:完全多用戶模式;文本界面

            4:預留級別,目前無特別使用目的,但習慣以同3級別功能使用

            5:完全多用戶模式,圖形化界面

            6:重啟 reboot

        默認級別:3、5

        級別切換:init 數字

        級別查看:who -r或runlevel

    9、系統初始化腳本/etc/rc.d/rc.sysinit

        系統初始化腳本文件:/etc/rc.d/rc.sysinit的功能:

            <1>設置主機名

            <2>設置歡迎信息

            <3>激活udev和selinux(udev主要是用來創建設備文件)

            <4>掛載/etc/fstab文件中定義的所有文件系統

            <5>檢測根文件系統,并以讀寫方式重新掛載根文件系統

            <6>設置系統時鐘

            <7>根據/etc/sysctl.conf文件的設定,來設定內核參數

            <8>激活lvm及軟raid設備

            <9>激活swap設備

            <10>加載額外設備的驅動程序

            <11>清理操作

    10、系統相關運行級別上的相關服務

        init在利用/etc/inittab配置文件,進行用戶空間系統初始化時,會有關于默認運行級別的定義,當定義好默認運行級別,利于/etc/rc.d/rc.sysinit完成系統初始化后,就會按照運行級別,來關閉、打開相應級別下的服務

        各種服務的控制腳本程序是存放在/etc/rc.d/init.d/目錄下,然后各個對應級別下要關閉或開的程序以軟連接的方式存放在/etc/rc.d/rc運行級別.d/目錄下

            以K開頭的表示要關閉的服務,后面數字表示優先級,數字越小,越先關閉

            以S開頭的表示要開啟的服務,后面數字表示優先級,數字越小,越先開啟

            一般是先關閉相關服務后,再開啟相關服務

        /etc/rc.d/rc.local 該腳本為正常行級別的最后一個腳本,可以將一些希望開機時自動啟動,但又不合適編輯成服務腳本的一些命令或程序,寫在該文件中,單獨成行,即可完成開機自動啟動

        建議在生產環境里面,將ctrl+alt+del里面重啟的快捷鍵禁用

        對應的文件在/etc/init/control-alt-delete.conf里,可通過/etc/inittab獲知其定義信息

        /etc/rc.d/init.d/下的腳本的格式:

            這類腳本都需要在開頭注釋段標明:一般要接受至少start、stop、restart、status四個參數

            #!/bin/bash

            # crond    start/stop the cron daemon 標明腳本功能 ,此項可以不寫

            # chkconfig:2345 11  88  標明該服務腳本初始狀態下的運行級別,啟動優先級,關閉優先級,必須要寫

            # description:  描述

                功能代碼段

                …

        chkconfig命令管理系統服務腳本

            利用chkconfig命令自動在各級別目錄下創建對應的K或S的鏈接文件,且可以管理服務腳本的開機啟動或關閉等

            要想利用chkconfig進行管理,腳本必須要滿足上述注釋段的要求,然后將腳本放到/etc/init.d/目錄下

            然后利用"chkconfig  –add  腳本名  –level 運行級別"  將腳本添加到chkconfig可管理的列表中,不指定–level則默認是從腳本中讀取運行界別的定義。

            添加完成后,可利用"chkconfig 腳本名 on|off"來管理腳本的啟動或關閉 

            將腳本移除chkconfig的管理列表:chkconfig –del 腳本名

            查看所有服務腳本的運行級別的開機運行狀態:chkconfig

            查看指定腳本的開機運行狀態:chkconfig 腳本名

            修改腳本的運行級別:chkconfig [–level LEVELS] 腳本名  on|off|reset   表示將腳本的指定的級別是on還是off還是reset

                –level LEVELS如果不指定,默認為2345級別

        xinetd管理的服務

            service 命令:手動管理服務
            service 服務 start|stop|restart
            service –status-all
            瞬態( Transient)服務被xinetd進程所管理,進入的請求首先被xinetd代理
            配置文件: /etc/xinetd.conf、 /etc/xinetd.d/<service>(每個被xinetd管理的服務在xinetd.d下都有一個對應的控制腳本)
            用chkconfig控制的服務: chkconfig SERVICE_NAME on

第三章    系統啟動相關故障恢復和系統服務腳本案例

    1、刪除initramfs文件,造成系統無法啟動,并恢復

        (刪除initramfs文件后,如果沒有重啟系統,只需cd到/boot目錄,然后執行mkinitrd initramfs-`uname -r`.img  `uname -r`命令,重新生成initramfs文件即可)

        步驟一、刪除initramfs文件,重啟系統

    1.png

    2.png

        步驟二、插入系統光盤,利用光盤引導進入緊急救援模式

    3.png

    4.png

    4.png

    5.png

    6.png

    7.png

    8.png

    9.png

    10.png

    

        步驟三、進入緊急救援模式后,chroot進入真正的根文件系統,運行mkinitrd命令生成新的initramfs文件

            (主要要切換到/boot目錄下執行mkinitrd命令)

            且命令格式為:mkinitrd initramfs-`uname -r`.img  `uname -r`

            文件生成完成后,重啟系統即可完成系統的進入

    11.png

    12.png

    2、破解root用戶密碼

        步驟一:啟動系統,在啟動前,按任意鍵,進入引導菜單界面

    1.png

        步驟二:按a鍵,進入grub引導編輯菜單界面,在后面添加1或者S或s或single然后回車進入單用戶模式

    2.png

    3.png

        步驟三、運行passwd命令修改密碼,然后運行reboot重啟系統即可完成對root密碼的修改

    4.png

    

    3、編寫服務腳本/root/bin/testsrv.sh,完成如下要求
        (1) 腳本可接受參數: start, stop, restart, status
        (2) 如果參數非此四者之一,提示使用格式后報錯退出
        (3) 如是start:則創建/var/lock/subsys/SCRIPT_NAME, 并顯示“啟動成功”
            考慮:如果事先已經啟動過一次,該如何處理?
        (4) 如是stop:則刪除/var/lock/subsys/SCRIPT_NAME, 并顯示“停止完成”
            考慮:如果事先已然停止過了,該如何處理?
        (5) 如是restart,則先stop, 再start
            考慮:如果本來沒有start,如何處理?
        (6) 如是status, 則如果/var/lock/subsys/SCRIPT_NAME文件存在,則顯示
            “ SCRIPT_NAME is running…”
            如果/var/lock/subsys/SCRIPT_NAME文件不存在,則顯示“ SCRIPT_NAME is stopped…”
            其中: SCRIPT_NAME為當前腳本名
        (7)可用chkconfig 和 service命令管理

    腳本代碼為:

    !/bin/bash    
    #chkconfig:35 88 10
    #description:nwc test service
    
    FILE=/testdir/server_file
    
    function START() {
            if [ -f $FILE ];then
                    echo "$0 has been start"        
            else
                    touch $FILE && echo "Start success" || echo "Start fail"
            fi  
    }
    
    
    function STOP() {
            if [ -f $FILE ];then
                    rm -rf $FILE && echo "Stop success" || echo "Stop fail"
            else
                    echo "$0 has been stopped"
            fi  
    }
    
    function RESTART() {
            STOP
            START
    }
    function STATUS() {
            [ -f $FILE ] && echo "$0 is running..." || echo "$0 is stopped..."
    }
    
    
    case $1 in
    start)
            START
    ;;
    
    stop)
            STOP
    ;;
    
    restart)
            RESTART
    ;;
    
    status)
            STATUS
    ;;
    
    *)
            echo "Usage: $0 start|stop|restart|status"
    ;;
    esac

    將腳本拷貝到/etc/rc.d/init.d/目錄下,并給予執行權限,過程和效果如下

[root@localhost ~]# cd /etc/rc.d/init.d/
[root@localhost init.d]# ll nwcservice 
-rwxr-xr-x 1 root root 644 9月   8 17:35 nwcservice
[root@localhost init.d]# chkconfig --add nwcservice
[root@localhost init.d]# chkconfig | grep "nwcservice"
nwcservice     	0:關閉	1:關閉	2:關閉	3:啟用	4:關閉	5:啟用	6:關閉
[root@localhost init.d]# chkconfig nwcservice on
[root@localhost init.d]# service nwcservice start
/etc/init.d/nwcservice has been start
[root@localhost init.d]# service nwcservice stop
Stop success
[root@localhost init.d]# service nwcservice restart
/etc/init.d/nwcservice has been stopped
Start success
[root@localhost init.d]# service nwcservice status
/etc/init.d/nwcservice is running...
[root@localhost init.d]# service nwcservice dsjhkdsa
Usage: /etc/init.d/nwcservice start|stop|restart|status
[root@localhost init.d]#

    

原創文章,作者:M20-1倪文超,如若轉載,請注明出處:http://www.www58058.com/44783

(0)
M20-1倪文超M20-1倪文超
上一篇 2016-09-09
下一篇 2016-09-09

相關推薦

  • Vim編輯器使用詳解

    Vim編輯器使用詳解 vim介紹 為什么要學習vim vim三種模式 vim工作模式(圖解) vim如何打開文件 vim關閉文件 命令模式光標跳轉 字符間跳轉: 單詞間跳轉: 行首行尾跳轉: 行間移動: VIM的命令模式下的命令: 字符編輯: 替換命令(r, replace) 刪除命令: 復制命令 粘貼命令(p, paste): : 其他相關的編輯操作: 翻…

    Linux干貨 2016-09-06
  • 設計模式(一)工廠模式Factory(創建型)

      在面向對象編程中, 最通常的方法是一個new操作符產生一個對象實例,new操作符就是用來構造對象實例的。但是在一些情況下, new操作符直接生成對象會帶來一些問題。舉例來說, 許多類型對象的創造需要一系列的步驟: 你可能需要計算或取得對象的初始設置; 選擇生成哪個子對象實例; 或在生成你需要的對象之前必須先生成一些輔助功能的對象。 在…

    Linux干貨 2015-06-23
  • Mariadb數據庫復制系列(二):主主復制

       實驗二:MySQL雙主復制架構的實現 雙主的實現方式與主/從類似,僅是兩個主機即使主節點,又是對方的從節點雙主模型容易造成數據的不一致性,因此要慎用! 1、實驗環境 2、在兩個節點上安裝mariadb-server服務 3、修改兩個節點的服務器配置文件 4、兩個節點上各自啟動服務,各授權一個具有復制權限的用戶 5、查看兩個節點的二進制日志的狀態 6、在…

    Linux干貨 2016-11-24
  • N27_第二周作業。

    linux上的文件管理類命令都有哪些?其常用的使用方法及其相關示例演示。 答: 有cp、mv、rm cp ?復制命令 常用選項: cp -i ? ? ? ?#交互式 cp -r ? ? ? #遞歸復制目錄及其子目錄的內容 cp -a ? ? ?# 歸檔,相當于dR –preserve=all cp -d ? ? #表示不跟蹤符號鏈接所指向的原文件…

    2017-10-09
  • Homework Week-7 RAID及bash編程

    1、創建一個10G分區,并格式為ext4文件系統;    (1) 要求其block大小為2048, 預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl;    (2) 掛載至/data/mydata目錄,要求掛載時禁止程序自動運行,且不更新文件的訪問時間戳; fdisk /dev/sda n …

    Linux干貨 2016-09-26
  • Linux 基礎知識(二)

    一、Linux文件管理類命令的使用方法及其相關示例演示? 1、文件管理 2、文件查看 二、Bash特性詳解 1、命令行展開 (1)在/tmp目錄下創建:a_c,a_d,b_c,b_d 方法一:mkdir -pv {a,b}_{c,d} (2)在/tmp目錄下創建mylinux目錄,其結構如下:         方法一:…

    Linux干貨 2016-09-26

評論列表(1條)

  • 馬哥教育
    馬哥教育 2016-09-10 11:40

    一如既往的認真,認真踏實,理論部分透徹,實驗部分完整,贊一個。

欧美性久久久久