linux內核及centos系統啟動流程

Linux組成

Linux: kernel+rootfs(根文件系統)

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

rootfs:程序和glibc

 庫:函數集合, function, 調用接口(頭文件負責描述)
     過程調用:procedure,無返回值
    函數調用:function
程序:二進制執行文件

內核設計流派:

單內核(monolithic kernel):Linux
把所有功能集成于同一個程序

微內核(micro kernel):Windows, Solaris(hurb)(太完美了沒有成功)
每種功能使用一個單獨子系統實現

linux設計思想:內核核心僅保留最基本功能,而把其它功能做成子系統;各子系統之間依靠通信完成基本功能

內核

Linux內核特點:

支持模塊化:.ko(內核對象有些是驅動模塊)
如:文件系統,硬件驅動,網絡協議等

支持內核模塊的動態裝載和卸載

組成部分:

一.核心文件:/boot/vmlinuz-VERSION-release

生成時間是光盤自帶的時間,出場時寫入的時間,如果沒了可以從別處考一個過來

ramdisk:輔助的偽根系統(虛擬文件系統,生成時間是安裝時的時間)
    CentOS 5: /boot/initrd-VERSION-release.img    
                虛擬出來的一個磁盤
    CentOS6,7: /boot/initramfs-VERSION-release.img
                虛擬出來的文件系統
    這是一個cpio的文檔格式
        cat 。。。|cpio -id

刪除/boot/initramfs-VERSION-release.img文件修復

linux內核及centos系統啟動流程
這個無法從別處拷貝只能單獨生成!
步驟
linux內核及centos系統啟動流程
   1.重啟進光盤修復
會發現,能進入界面引導界面卻不能下一步的生成!這說明可以進入boot,但無法下一步!
2.在/boot下重新生成此文件
linux內核及centos系統啟動流程
不切換根的話很多工具會用不了!mkinitrd命令是硬盤上的命令!
注意:最后一步要很長時間才能生成,要耐心等待,結束后exit.exit兩次重啟

  

二.模塊文件:/lib/modules/VERSION-release

注意:雖然安裝時內核10M多,其就實除了核心文件是驅動/lib/modules,
根文件系統的驅動有可能和根不相同,你可以訪問boot但不一定能訪問根,因為根的驅動在根下的lib,
所以boot里面放驅動,把boot加載,從而找到根的驅動把根掛上!
boot又是怎么啟動的呢,是前面的grub的工作了!


CentOS 系統啟動流程:


linux內核及centos系統啟動流程    

1. POST

Power-On-Self-Test,加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、串并行接口、鍵盤、CD-ROM光驅等硬件情況的檢測。

ramdisk:自檢流程!

內核中的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問
ramdisk —> ramfs 提高速度
CentOS 5: initrd 文件,  工具程序:mkinitrd
CentOS 6: initramfs 文件, 工具程序:mkinitrd, dracut

  • ROM:BIOS,Basic Input and Output System,保存著有關計算機系統最重要的基本輸入輸出程序,系統信息設置、開機加電自檢程序和系統啟動自舉程序等。

  • RAM:CMOS互補金屬氧化物半導體,保存各項參數的設定

      按次序查找引導設備,第一個有引導程序的設備為本次啟動設備

2.bootloader: 引導加載器,引導程序

  • windows: ntloader,僅是啟動OS

  • Linux:功能豐富,提供菜單,允許用戶選擇要啟動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓、展開,并把系統控制權移交給內核

      LILO:LInux LOader
      GRUB: GRand Unified Bootloader
          GRUB 0.X: GRUB Legacy, GRUB2
          例如:你裝了個雙內核,開機的菜單選項就是grub生成的
    • GRUB:

          primary boot loader : 1st stage,1.5 stage
              1.5階段被放在第一個扇區的后續扇區!(都在0柱面上,所以分區時從1扇區開始分的?。┻@個扇區裝載的就是 boot的驅動!
          secondary boot loader :2nd stage,分區文件
      
          1階段和1.5階段這些在/boot/grub下都有(以1 1_5結尾)備份文件(可以刪除),但2的不是備份文件,不能刪除!?。?/pre>
      
    • MBR:只放置了一點grub內容,用來尋找/boot下的驅動模塊(1.5階段)

        446: bootloader, 64: 分區表, 2: 55AA
        由于MBR在硬盤的第一個扇區,不用驅動!

    3.kernel:

    通過boot下的核心文件和boot下的驅動掛載根

    linux內核及centos系統啟動流程    

    自身初始化:

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

    • 加載硬件驅動程序(可能借助于ramdisk加載驅動)

        ramdisk: 加載至內存中,此段內存空間被虛擬成了塊設備;
        用于提供硬盤驅動程序;系統安裝時臨時生成的;
        ramdisk被內核識別為“根文件系統”,即rootfs,常被稱作“臨時根”;
    • 以只讀方式掛載根文件系統(真正的根)

        因為grub下的 grub.conf有寫,也寫了根的驅動程序所在位置為當下的initramfs-***.img文件
    • 運行用戶空間的第一個應用程序:/sbin/init

    4.init:

    • init讀取其初始化文件:/etc/inittab

        初始運行級別(RUN LEVEL)
        系統初始化腳本
        對應運行級別的腳本目錄
        捕獲某個關鍵字順序
        定義UPS電源終端/恢復腳本
        在虛擬控制臺生成getty
        在運行級別5初始化X
    • 個版本服務啟動

      CentOS 5:** SysV init**
        特點:啟動用戶空間的服務程序,通常通過腳本進行;有依賴關系的服務將被串行啟動;
        配置文件:/etc/inittab
      
      CentOS 6: **Upstart**
        特點:守護進程間的通信依賴于D-Bus進行,因此,可基本實現類似并行啟動;
        配置文件:/etc/inittab, /etc/init/*.conf
      
      CentOS 7: **Systemd**
        特點:服務只有在第一次被訪問到時才會真正啟動起來;
        配置文件:/usr/lib/systemd/

      系統初始化總結:

      POST —> BootSequence (BIOS) —> Bootloader(MBR) —> kernel(ramdisk) —> rootfs(只讀) —> init(systemd)



    /sbin/init

        Linux系統運行級別:為系統維護的目的而設定,途徑是設定啟動或關閉服務實現;
            0-6: 7個級別
                0:關閉所有服務;關機
                1:維護模式,單用戶模式,sigle模式;此級別可允許root用戶直接登錄而無須認證;
                2:維護模式,多用戶模式,需要用戶認讓,會啟動網絡功能,但不支持使用NFS;
                3:正常級別,完全多用戶模式,文本界面;
                4:預留級別
                5:正常級別,完全多用戶模式,圖形界面;
                6:關閉所有服務;重啟 
    
            默認級別:3,5
    
            切換級別:
                init [0-6]
                    init 0
                    init 6
    
            查看級別:
                runlevel命令
                who -r

    總結(用戶空間的啟動流程): /sbin/init (/etc/inittab)
       設置默認運行級別 —> 運行系統初始化腳本,完成系統初始化 —> 關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務—> 設置登錄終端 [—> 啟動圖形終端]

    配置文件:/etc/inittab(CentOS 5 6)配置文件格式

    linux內核及centos系統啟動流程

    格式:

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

        id:runlevel:action:process
    任務的標示符:運行級別:任務在什么時候啟動,如何啟動:啟動的到底是什么任務                
    
        id:一個任務的標識符;
        runlevels:在哪些級別啟動此任務;#,###,也可以為空,表示所有級別;
        action:在什么條件下啟動此任務;
        process:任務;

    action:

    • wait: 切換至此級別運行一次

    • respawn:此process終止,就重新啟動之

    • initdefault:設定默認運行級別;process省略

    • sysinit:設定系統初始化方式,此處一般為指定

      • /etc/rc.d/rc.sysinit

    ca::ctrlaltdel:/sbin/shutdown -t3 -r now

    例如:

    設定默認運行級別

     id:3:initdefault:

    定義完成系統初始化的腳本

    si::sysinit:/etc/rc.d/rc.sysinit

    初始化用戶空間環境;此腳本會執行許多系統初始化任務;

    啟動對應級別下設定為要啟動的服務,關閉那些設定為要停止的服務;

    l1:1:wait:/etc/rc.d/rc 1
    l2:2:wait:/etc/rc.d/rc 2
    l3:3:wait:/etc/rc.d/rc 3
    rc是一個腳本,傳遞一個參數,表示運行這個參數模式的相應腳本
    
    例如:啟動虛擬終端:一下內容表示當你在2345級別下切換終端時會自動運行/sbin/mingetty(啟動虛擬終端)程序;這就是我們用ctrl+alt+F# 啟動虛擬終端的原因
        一般啟動6個虛擬終端:
            tty1:2345:respawn:/sbin/mingetty tty1
            tty2:2345:respawn:/sbin/mingetty tty2
            tty3:2345:respawn:/sbin/mingetty tty3
    
    每個虛擬終端啟動之后,會立即通過此終端附加一個應用程序(/sbin/mingetty)調用login程序
        打開虛擬終端的程序除了mingetty之外,還有諸如getty等;
    
    如果默認級別為5,還會啟動一個圖形虛擬終端;會附加X應用程序;

    總結(centos 5用戶空間的啟動流程): /sbin/init (/etc/inittab)

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

    centos 6:

    (1) CentOS 6的init程序為upstart,其配置文件依然為/etc/init/*.conf;(/etc/inittab 僅用于定義默認運行級別)此些配置遵循upstart語法格式進行編程;

    (2) CentOS 6的服務控制事實上大多數并沒有使用upstart腳本來控制,而依然使用的是SysV風格的腳本;

    注意:*.conf為upstart風格的配置文件;                    
        rcS.conf
        rc.conf
        tty.conf
        start-tty.conf

    centos 7

    init程序:systemd,配置文件:/usr/lib/systemd/system/,  /etc/systemd/system/

    完全兼容SysV腳本機制;因此,service命令依然可用;不過,建議使用systemctl命令來控制服務;

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

    注意:centos 7 啟動時init中的服務沒有什么啟動流程,服務都是同時并行啟動,服務之間的依賴關系在啟動時默認不解決;等服務都啟動好后才解決依賴問題。(如果你在開機時就只用到三個那么就只啟動三個服務,其他都默認不啟動,等用到的時候再啟動?。?/p>


    /etc/rc.d目錄講解

    linux內核及centos系統啟動流程

    1 init.d目錄

    里面包括了各種系統服務的文件。rc#.d里面的各種文件就是來自此文件,只不過換了個名字

    2./etc/rc->rc.d/rc 此腳本的意義 當init運行等級切換時用于負責啟動或停止服務

    linux內核及centos系統啟動流程

    意味著:通過/etc/rc.d/rc#.d/下所有鏈接文件來決定如何啟動或關閉服務;

    所有以S開頭的,都被傳遞start參數以啟動; 所有以K開頭的,都被傳遞stop參數以停止;

    3./etc/rc.d/rc.sysinit腳本的功能:

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

    4、rc #.d 目錄

    此目錄保存的文件其實都是init.d下的文件只不過改了下名字,以便于服務啟動順序。
    K*:要停止的服務;K##*,優先級,數字越小,越是優先關閉;依賴的服務先關閉,而后關閉被依賴的;
    S*:要啟動的服務;S##*,優先級,數字越小,越是優先啟動;被依賴的服務先啟動,而依賴的服務后啟動;
    linux內核及centos系統啟動流程表示系統最后啟動,里面沒什么,自己可以把一些服務加進去,這樣就便于系統開機就啟動

    5./etc/init.d/* (/etc/rc.d/init.d/*)腳本執行方式:

    # /etc/init.d/SRV_SCRIPT  {start|stop|restart|status}
    # service  SRV_SCRIPT   {start|stop|restart|status}

    /etc/init.d/SVC_SCRIPTS, 此些腳本遵循LSB服務腳本的定義規范,都接受至少四個最基本的參數,{start|stop|status|restart};
        start
        stop
        restart
        status: 查看服務運行狀態;

    6.在此目錄下添加腳本的方法:

    linux內核及centos系統啟動流程                        

    1.能被添加的服務的腳本定義格式之一:

    #!/bin/bash
    #
    # chkconfig: LLLL(運行級別) NN MM
    # description: 
    LLL表示初始在哪個級別下啟動,-表示都不啟動 
    
    注意:后邊的NN表示S##*中##所代表的數字,數字要小于其它依賴于它的服務(要啟動在其他依賴于他的服務之前)
        MM代表K##*中所代表的數字,數字要大于它所依賴的服務的優先級

    2. 添加進各個rc#.d

    chkconfig —add  腳本的名字
    linux內核及centos系統啟動流程

    讓這個服務腳本受 chkconfig 管理,這樣后就會自動的讓rc#.d(指明的運行級別下)生成  KNN腳本名字 的文件或S##

    這樣以后就能直接用 service 服務名字 {stop|start|status}了

    刪除:chkconfig  --del  name
    修改指定的鏈接類型:

    chkconfig命令

    查看服務在所有級別的啟動或關閉設定情形:

    chkconfig [—list] [name]

    linux內核及centos系統啟動流程

    添加:SysV的服務腳本放置于/etc/rc.d/init.d (/etc/init.d)

    chkconfig —add name:為某存放在/etc/init.d的服務在對應的/etc/rc.d/rc0-6.d目錄添加符號鏈接;

    #!/bin/bash
    #LLLL 表示初始在哪個級別下啟動,-表示都不啟動
    # chkconfig: LLLL nn nn
    #description

    linux內核及centos系統啟動流程

    刪除:

    chkconfig —del name: 把指定SVC_SCRIPTS的在7個級別符號鏈接統統刪除;

    修改指定的鏈接類型

    chkconfig [—level levels] name

    – —level LLLL:選項明確指定的級別為on或off, 余下的級別保存原有; 省略時表示2345

    – ntsysv命令

    注意:正常級別下,最后啟動的一個服務S99local沒有鏈接至/etc/init.d下的某腳本,而是鏈接至了/etc/rc.d
    /rc.local (/etc/rc.local)腳本;因此,不便或不需寫為服務腳本的程序期望能開機自動運行時,直接放置于此腳本文件中即可。

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

    (0)
    qzxqzx
    上一篇 2016-09-10
    下一篇 2016-09-10

    相關推薦

    • 硬鏈接與軟鏈接的區別

      硬鏈接與軟連接                本文僅用于個人學習參考:         簡單介紹了硬鏈接與軟連接的區別。  &nb…

      Linux干貨 2016-10-20
    • 來兩道百度的shell開胃菜

      1、寫腳本實現,可以用shell、perl等。在目錄/tmp下找到100個以abc開頭的文件,然后把這些文件的第一行保存到文件new中。 方法1: #!/bin/sh for files in `find /tmp -type f -name "abc*"|h…

      Linux干貨 2016-09-19
    • N21天天第十六周課程練習

      1、源碼編譯安裝LNMP架構環境; 一、安裝Nginx 1、解決依賴 [root@localhost ~]# yum groupinstall 開發工具 服務器平臺開發 -y 2、安裝 [root@localhost ~]# tar xf pcre-8.37.…

      Linux干貨 2016-12-14
    • ansible部署KeepAlived動態站點

      一、設計原因 利用ansible可以自動化部署KeepAlived 的雙方模型(其中包括兩個動態的站點),多組服務器需要一樣的部署時 可以利用ansible寫的程序來代替重復性的操作。 二、設計拓撲結構及服務器詳情   三、詳細步驟 1、環境的搭建 (1)安裝ansible,同時配置私鑰免密碼進行通信 [root@localhost ~]# ssh…

      2015-05-13
    • linux網絡管理之三

      cat /etc/hosts              可以做名字解析,黑客用來冒充網站IPcentos6 更改主機名          vim /etc/sysconfig/network      &nbs…

      2017-03-21
    • vim文本編輯器之快捷鍵滿天飛

      vim文本編輯器不同于nano的是其功能非常強大,強大的功能還支持各種快捷鍵,讓我們編輯文本的時候更方便更快捷。 本文將會按照下圖所展示的功能來對命令一一講解,           打開文件:       &n…

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