Linux 系統啓動流程

內核簡介:
  kernel功能:進程管理、內存管理、網絡管理、驅動程序、文件系統、安全功能
  庫:函數的集合,同時提供調用接口;不能做爲程序的執行入口單獨執行,只能被程序調用
  過程調用:procedure,無返回結果
  函數調用:function,有返回結果linux

  內核設計流派:
  單內核設計:把全部功能模塊集成於同一個程序(Linux)
  微內核設計:每種功能模塊使用一個單獨子系統實現(Windows、Solaris)
  Linux內核特色:
  支持模塊化:*.ko(內核模塊文件)如:文件系統,硬件驅動,網絡協議等
  支持模塊的動態裝載和卸載ios

  Linux內核組成部分:
  核心文件:/boot/vmlinuz-Version-Release
  ramdisk:輔助的僞根文件系統
    CentOS 5: /boot/initrd-Version-Release.img
    CentOS 六、7: /boot/initramfs-Version-Release.img
  模塊文件:/lib/modules/Version-Release/shell

Linux啓動流程:
  Centos五、6啓動流程:POST—>Boot Sequence(BIOS)—>Boot Loader (MBR)—>Kernel(ramdisk)—> rootfs (readonly)—>switchroot—>/sbin/init—>(/etc/inittab, /etc/init/*.conf)—>設定默認運行級別—>系統初始化腳本—>關閉或啓動對應級別下的服務—>啓動終端—>登錄系統(登錄界面環境)—>啓動shell(shell環境)。c#

  POST(Power OnSelf Test)加電自檢
  POST它首先對每個硬件設備進行檢查。完成後會尋找存有引導記錄的設備,找到以後讀入操做系統引導記錄,而後將系統控制權交給引導記錄,並由引導記錄來完成系統的順利啓動。centos

  Boot Sequence(BIOS)
  在系統啓動以前不知道計算機的系統在哪裏,因此在計算機的bios上定義了設備啓動順序,它會安照設備的啓動順序去查找引導加載器。緩存

  Boot Loader(MBR)
  MBR:Master Boot Record 主引導記錄在可引導設備的前512bytes中(硬盤的第一個扇區),前446bytes爲bootloader,接下來的64bytes爲分區表信息,最後2bytes標記爲55AA(表示爲可引導設備)
  Boot loader引導加載器,用來引導系統的啓動,它把用戶選定的內核加載到內存空間中,把控制權交給內核。
  Windows下引導加載器:ntloader
  Linux下引導加載器:
    LILO:LInux LOader
    GRUB:GRand Unified Bootloader
      GRUB Legacy 0.X 傳統版本爲0.X
      GRUB2    1.X 與傳統版本徹底不同的1.X版本
    功能:提供一個菜單,容許用戶選擇要啓動的系統或內核版本;把用戶選定內核裝載到RAM的特定空間中並解壓展開,然後把系統控制權移交給內核;
    MBR所給予的空間畢竟過小,容不下較大的引導程序,所以grub程序被分爲三段:"stage 1" 被裝入磁盤的MBR中;特殊的"stage 1.5"被裝入MBR隨後的扇區,它可以識別內核和"stage 2"所在分區的文件系統格式並幫助引導"stage 2",它是"stage 1"和"stage 2"之間的紐帶;"stage 2"位於文件系統上。stage 2程序和grub.conf能夠與內核文件處於不一樣的分區上(但必須位於同一磁盤),只要"stage 1.5"可以驅動它們各自所在的分區。
    GRUB引導過程分爲三段:
      stage1:MBR(0柱面0磁道1扇區)
      stage1_5:MBR隨後的扇區
      stage2:讀取grub.conf配置文件,並實現引導功能的擴展安全

  Kernel:加載系統內核,執行系統初始化信息
  在GRUB中選定內核進入,內核會對自身初始化;探測可識別到的全部硬件設備,加載硬件驅動程序(有可能須要藉助ramdisk加載驅動);以只讀方式掛載根文件系統;運行用戶空間的第一個應用程序:/sbin/init
 Centos5:initrd
  initrd文件生成工具程序:mkinitrd
  Centos6,7:initramfs(cpio格式)
  initramfs文件生成工具程序:dracut、mkinitrdbash

 ramdisk:Linux內核的特性之一,使用緩衝和緩存來加速對磁盤上的文件訪問:
  爲何將initrd改成initramfs,前者把內存模擬成磁盤,後者直接把內存模擬成文件系統;若是模擬成磁盤,將磁盤加載到內存中,內核需將initrd再次緩存到內核的內存空間當中,至關於在內存中緩存兩次;可是若是模擬成文件系統,內核能夠直接訪問文件系統所在的內存空間,這樣效率更高性能更好
  initrd 、initramfs都屬虛擬文件系統,在早期的linux系統中,通常只有硬盤或者軟盤被用來做爲Linux根文件系統的存儲設備,所以也就很容易把這些設備的驅動程序集成到內核中。可是如今的Linux系統中可能將根文件系統保存到各類存儲設備上,包括scsi、sata,usb-disk等等。若是把這些設備的驅動代碼所有編譯到內核中內核會很龐大。
  爲了解決這一矛盾,因而出現了基於ramdisk的initrd( bootloader initialized RAM disk )。initrd是一個被壓縮過的小型根目錄,這個目錄中包含了啓動階段中必須的驅動模塊、可執行文件和啓動腳本。當系統啓動的時候bootloader會把initrd文件讀到內存中,而後把initrd文件在內存中的起始地址和大小傳遞給內核。內核在啓動初始化過程當中會解壓縮initrd文件,而後將解壓後的initrd掛載爲根目錄,並執行根目錄中的/linuxrc腳本(cpio格式的initramfs爲/init,而image格式的initrd爲/linuxrc),腳本會加載真實文件系統中存放的設備驅動程序,以及在/dev目錄下建立必要的設備節點。這樣就能夠mount真正的根目錄,並切換到這個根目錄中。網絡

  Linux 發行版在內核中只編譯了基本的硬件驅動,在Linux系統安裝過程當中經過檢測系統硬件,生成包含安裝系統硬件驅動的initrd,在內核引導過程當中先加載initrd虛擬文件系統,而後由initrd掛載真正的文件系統,完成後initrd從RAM中退出,並不消耗內存,initrd只是一個暫時的文件系統。
  在Linux2.5內核中出現了initramfs,它的做用和initrd相似,只是和內核編譯成一個文件(initramfs是通過gzip壓縮後的cpio格式文件),該cpio格式的文件被連接進了內核中特殊的數據段.init.ramfs上,其中全局變量__initramfs_start和__initramfs_end分別指向這個數據段的起始地址和結束地址。內核啓動時會對.init.ramfs段中的數據進行解壓,而後使用它做爲臨時的根文件系統。模塊化

  initrd與initramfs的區別:
  initrd是init ram disk,initramfs是init ram file system,前者把內存模擬成磁盤,後者直接把內存模擬成文件系統
  cpio-initrd(initramfs)的處理流程
    一、boot loader 把內核以及 initrd 文件加載到內存的特定位置
    二、內核判斷initrd的文件格式,若是是cpio格式
    三、將initrd的內容解壓到rootfs中
    四、執行initrd中的/init文件,切換到真實的根文件系統,執行/sbin/init
  image-initrd(initrd)的處理流程
    一、boot loader把內核以及initrd文件加載到內存的特定位置。
    二、內核判斷initrd的文件格式,若是不是cpio格式,將其做爲image-initrd處理。
    三、內核將initrd的內容保存在rootfs下的/initrd.image文件中。
    四、內核將/initrd.image的內容讀入/dev/ram0設備中,也就是讀入到一個內存盤中。
    五、接着內核以可讀寫的方式把/dev/ram0設備掛載爲原始的根文件系統。
    六、若是/dev/ram0被指定爲真正的根文件系統,那麼內核跳至最後一步正常啓動。
    七、執行initrd上的/linuxrc文件,linuxrc一般是一個腳本文件,負責加載內核訪問根文件系統必須的驅動, 以及加載根文件系統。
    八、/linuxrc執行完畢,真實的根文件系統被掛載
    九、若是真實根文件系統存在/initrd目錄,那麼將/dev/ram0從/移動到/initrd;若是不存在/initrd目錄,/dev/ram0將被卸載。
    十、在真實根文件系統上進行正常啓動過程 ,執行/sbin/init。

  init程序:啓動用戶空間的第一個程序/sbin/init,完成系統初始化
  在內核、硬件及驅動信息加載完畢後,內核會呼叫用戶空間中的第一個執行程序/sbin/init,init程序主要功能是準備軟件運行環境,包括系統的主機名稱、網絡配置、文件系統格式等其餘服務的啓動管理。而這些全部的操做都是經過init的配置文件來定義
  一旦啓動了init,內核就無論了,全部的後續操做都是由init去加載運行用戶空間的應用程序來完成各類各樣的工做,只有當這些應用程序完成系統調用或者系統發生中斷時須要特權操做時,內核纔會參與;剩餘的其它過程都不在參與,而是由用戶空間的程序來完成

  init程序的類型:
  Centos 5:SysV init
  因爲Centos5採用的是SysV init方式,其特色是啓動用戶空間的服務程序,一般經過腳本進行,有依賴關係的服務將被串行啓動;這也就致使了Centos5的系統啓動過程很是緩慢
  配置文件:/etc/inittab

  Centos 6:Upstart,但程序名依然爲/sbin/init
  採用Upstart的方式,其特色是守護進程間的通訊依賴於D-Bus進行,所以,可基本實現相似並行啓動
  配置文件:centos6中/etc/inittab中只是部分配置文件,大多數配置文件在/etc/init/*.conf(*.conf爲upstart風格的配置文件)

  Centso 7:Systemd
  採用Systemd方式,其特色是服務只有在第一次被訪問時纔會真正啓動起來;所以Centos 7系統的啓動過程很是快
  配置文件:一部分在/usr/lib/systemd/system/目錄下,另一部分在/etc/systemd/system/目錄下;Systemd徹底兼容SysV腳本機制;所以service命令依然可用;不過建議使用systemctl命令來控制服務;

運行/sbin/init程序—>讀取/etc/inittab文件得到運行級別—>運行系統初始化腳本/etc/rc.d/sysinit—>運行/etc/rc#.d/

  系統運行級別:
  Centos 6:Upstart兼容了centos 5的init
  運行級別:爲了系統的運行或維護等目的而設定的機制;一共7(0-6)個級別
  0:關機,shutdown
  1:單用戶模式(single user),以root用戶登錄,無需認證;維護模式
  2:多用戶模式(multi user),會啓動網絡功能,但不會啓動NFS;維護模式
  3:多用戶模式,徹底功能模式;文本界面
  4:預留級別;目前無特別使用目的,但習慣以同3級別功能使用
  5:多用戶模式,徹底功能模式,圖形界面
  6:重啓,reboot
  默認運行級別:3或5
  運行級別切換:init #
  查看當前級別:
  who –r
  runlevel

  配置文件:/etc/inittab
  每行定義一種action以及與之對應的process
  id:runlevels:action:process
  id:一個任務的標識符,能夠本身定義只要不重複
  runlevels:在哪些級別啓動此任務;#,###,也能夠爲空,表示全部級別
  action:在什麼條件下啓動此服務;經常使用action有如下4種
    wait:等待切換至此任務所在的級別時執行一次
    respawn:一旦此任務終止,就自動從新啓動之
    initdefault:設定默認運行級別;此時process省略
    sysinit:設定系統初始化方式,process通常會指定/etc/rc.d/rc.sysinit腳本
    process:任務,要執行的程序
例如:
id:3:initdefault: 設定系統默認運行級別爲3級別(若是個內核傳遞了運行級別參數,以傳遞的參數爲準)
si::sysinit:/etc/rc.d/rc.sysinit 設置系統初始化方式爲運行/etc/rc.d/rc.sysinit腳本
運行指定運行級別下的服務腳本:
l0:0:wait:/etc/rc.d/rc 0  在0運行級別運行/etc/rc.d/rc腳本,並給腳本傳遞了參數0
l1:1:wait:/etc/rc.d/rc 1
l2:1:wait:/etc/rc.d/rc 2
l3:1:wait:/etc/rc.d/rc 3
l4:1:wait:/etc/rc.d/rc 4
l5:1:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
  rc腳本接受一個運行級別數字爲參數,"/etc/rc.d/rc #"意味着去運行去/etc/rc.d/rc#.d/目錄下的服務腳本,這些腳本用來控制對應級別下服務的啓動或中止(按優先級順序執行);
  K##*:以K開頭的是要中止的服務;##是優先級,數字越小越優先關閉;依賴別的服務才能啓動的服先關閉,被依賴的服務後關閉;
  S##*:以S開頭要啓動的服務;##是優先級,數字越小越優先啓動;被依賴的服務先啓動,依賴別的服務才能啓動的服務後啓動;
  /etc/rc.d/rc#.d/目錄下的文件軟鏈接到/etc/rc.d/init.d/目錄中的腳本

  系統初始化腳本功能:/etc/rc.d/rc.sysinit
  一、設置主機名
  二、設置歡迎信息
  三、激活udev和selinux
  四、掛載/etc/fstab文件中定義的全部文件系統
  五、檢測根文件系統,並以讀寫方式從新掛載根文件系統
  六、設置系統時鐘
  七、根據/etc/sysctl.conf文件來設置內核參數
  八、激活lvm以及軟raid設備
  九、激活swap設備
  十、加載額外設備的驅動程序
  十一、清理操做

  服務啓動腳本:
  /etc/init.d/*(/etc/rc.d/init.d/*)不一樣發行版可能路徑不同
  腳本執行方式:
  /etc/init.d/Server_Script {start|stop|restart|status}
  service Server_Script {start|stop|restart|status}

  設置服務在不一樣系統運行級別下的啓動和關閉:
  chkconfig命令:管控/etc/init.d/每一個服務腳本在各級別下的啓動或關閉狀態
  查看:chkconfig --list [name]
    chkconfig --list 查看所有服務在各級別下的狀態
    chkconfig --list Name 查看指定服務在各級別下的狀態

  添加:chkconfig --add name
  能被添加的服務的腳本定義格式之一:
    #!/bin/bash
    #chkconfig: LLL NN MM
   #description:
    LLL 指定的級別須要啓動該服務,沒指定的級別關閉該服務;若是是"-"表示7個級別該服務都是關閉的
    NN  啓動服務時的優先級
    MM  中止服務時的優先級

  刪除:chkconfig --del name

  修改指定服務在指定運行級別下的狀態:
  chkconfig [--level LEVELS] name<on|off|reset>
    --level LEVELS 指定要控制的級別,不指定默認爲2345

  注意:正常級別下,最後一個啓動項(/etc/rc.d/rc#.d/)是一個S99local的服務,沒有連接至/etc/init.d下的某腳本,而是連接至/etc/rc.d/rc.local(/etc/rc.local)腳本;所以不便或不需寫爲服務腳本的程序可是又但願能開機自動運行時,直接放置於此腳本文件中便可。

  設置登陸終端:/etc/inittab
  tty1:2345:respawn:/usr/sbin/mingetty tty1 2345運行級別啓動tty1,下面依次啓動其餘5個虛擬終端
  tty2:2345:respawn:/usr/sbin/mingetty tty2
  tty3:2345:respawn:/usr/sbin/mingetty tty3
  tty4:2345:respawn:/usr/sbin/mingetty tty4
  tty5:2345:respawn:/usr/sbin/mingetty tty5
  tty6:2345:respawn:/usr/sbin/mingetty tty6
  一、mingetty會調用login程序
  二、打開虛擬終端的程序除了mingetty以外,還有諸如getty等

  總結:用戶空間的啓動流程
  /sbin/init(/etc/inittab)設置默認運行級別
  運行系統初始化腳本/etc/rc.d/rc.sysinit,完成系統的初始化
  運行/etc/rc.d/rc#.d/目錄下面的腳本(實際是鏈接到/etc/rc.d/init.d/目錄下的腳本)關閉對應級別下的須要中止的服務,啓動對應級別下須要開啓的服務;
  設置登陸終端

  CentOS系統的啓動流程包括:內核空間的啓動流程和用戶空間的啓動流程
  參考啓動流程圖一

  參考啓動流程圖二

 

相關文章
相關標籤/搜索