開機啟動流程

grub and boot


  • Centos5,6的開機啟動流程

  • grub

  • Centos7的開機啟動流程


Centos5,6的開機啟動流程

boot1boot2

initrd / initramfs

一般存儲在/boot目錄下,以.img為結尾的文件,是一個小型的根目錄系統的映像文件,里面存放了各類系統必須的模組,為了解決內核在加載完成之后沒有模組無法訪問磁盤加載rootfs的問題。

rc

在inittab的文件中,有這么一行命令 si::sysinit:/etc/rc.d/rc.sysinit ,這句話表示將設置的run level的值作為參數賦予給rc這個腳本。
我們先來看一下rc,打開/etc/rc.d/rc:

    最主要的兩段:
        for i in /etc/rc$runlevel.d/K* ; do              #循環列出/etc/rc#.d目錄下以K開頭的文件并賦值給i。

            # Check if the subsystem is already up.
            subsys=${i#/etc/rc$runlevel.d/K??}           #做字符串切片,刪去第一個/etc/rc$.d/K##的部分。
            [ -f /var/lock/subsys/$subsys -o -f /var/lock/subsys/$subsys.init ] || continue     #如果不存在相同的文件名或者文件名.init的服務腳本,則跳出當前這一輪循環。
            check_runlevel "$i" || continue  #檢查符號鏈接是否有效。

            # Bring the subsystem down.
            [ -n "$UPSTART" ] && initctl emit --quiet stopping JOB=$subsys  
            $i stop                                                         #傳遞當前服務程序stop參數。
            [ -n "$UPSTART" ] && initctl emit --quiet stopped JOB=$subsys       
        done


        for i in /etc/rc$runlevel.d/S* ; do          #循環列出/etc/rc#.d目錄下以S開頭的文件并賦值給i。

            # Check if the subsystem is already up.
            subsys=${i#/etc/rc$runlevel.d/S??}      subsys      #做字符串切片,刪去第一個/etc/rc$.d/S##的部分。
            [ -f /var/lock/subsys/$subsys ] && continue         如果存在與服務腳本相同的文件名的文件就跳出當前這輪循環。
            [ -f /var/lock/subsys/$subsys.init ] && continue        如果存在服務腳本.init的文件名的文件就條和醋當前這輪循環。
            check_runlevel "$i" || continue     檢查符號連接是否有效。

            # If we're in confirmation mode, get user confirmation
            if [ "$do_confirm" = "yes" ]; then      
                confirm $subsys
                rc=$?
                if [ "$rc" = "1" ]; then
                    continue
                elif [ "$rc" = "2" ]; then
                    do_confirm="no"
                fi
            fi

            update_boot_stage "$subsys"
            # Bring the subsystem up.   
            [ -n "$UPSTART" ] && initctl emit --quiet starting JOB=$subsys
            if [ "$subsys" = "halt" -o "$subsys" = "reboot" ]; then     如果執行到halt或者reboot腳本,就
                export LC_ALL=C     去除所有本地化的設置
                exec $i start       傳遞start參數給rc#
            fi
            $i start        傳遞start參數給服務腳本。
            [ -n "$UPSTART" ] && initctl emit --quiet started JOB=$subsys
        done

功能就是根據選擇的run level去傳遞對應的/etc/rc.d/rc一個數字,然后rc腳本就回去檢查相對應的/etc/rc.d/rc#.d目錄下的文件,將K[##關閉優先級]開頭的文件傳遞stop參數,將S[##啟動優先級]開頭的文件傳遞start參數,來打開關閉服務。

chkconfig:更新runlevel的啟動服務。

chkconfig [--add | --del] name :將一個服務添加/刪除進系統服務。
chkconfig --list name:查詢一個服務在每一個run level下是否為開機啟動。
chkconfig [--level levels] [--type type] [--no-redirect] name <on|off|reset|resetpriorities>:設置指定的某一個run level下特定服務的狀態。

grub

大家都知道在計算機從bios中讀取到開機啟動順序之后按序去讀取MBR的過程我們稱為boot lorder,計算機在這個階段會去讀取MBR中占了446Byte的boot loader中的程序,而在Centos的發行版中基本上都是GRUB這個程序。
446Byte有多少大呢?446個英文字符,要在這么小的空間中存放一個功能如此強大的程序,是怎么做到的呢?grub分為三部分,為stage1,stage1.5和stage2,stage1存放在boot lorder中,stage1指向磁盤中的存放1.5和2的目錄(一般為boot),然后通過stage1.5文件的簡單驅動來獲得/boot的內容得到stage2。
boot3

grub的設定文件

/boot/grub/grub.conf

有些boot目錄中會有menu.lst文件,仔細看哦這個文件是通過軟鏈接的形式連到grub.conf文件去的。

主要屬性:

default=0   默認啟動的系統,0代表第一個。
timeout=5   超時時間。
splashimage=(hd0,6)/boot/grub/splash.xpm.gz  grub的背景畫面,這里為指明了splash.xpm這張圖片~
hiddenmenu  是否隱藏grub的啟動菜單。
title Fedora Core (2.6.11-1.1369_FC4)   這個就是我們在grub界面看到的第一個頁面的選項內容啦~
        root (hd0,6)    指定這個系統的根目錄
        kernel /boot/vmlinuz-2.6.11-1.1369_FC4 ro   root=LABEL=/    指定核心以及rootfs
        initrd /boot/initrd-2.6.11-1.1369_FC4.img   指定initramfs
title WinXp     這個就是第二個啦,XP哦~
        rootnoverify (hd0,0)    類似root,但是不測試安裝該分區。
        chainloader +1      GRUB讀入分區的第一個扇區的引導記錄。

grub手動指定引導

grub命令行下:

grub> find /PATH:可以查詢是否有路徑。
grub> root (hd0,1):指定根設備。
grub> kernel /vmlinux-version-relias.arch ro grub> root=ROOTFS_PATH:指定內核。
grub> initrd /initrd-version-relias.arch.img:指定ramfs文件。
grub> boot:開始引導。

grub安裝與修復

命令行中:

grub-install --root-directory=/boot /dev/sda :指定boot目錄與stage要寫入的磁盤。

grub命令行中:

grub> chroot /mnt/sysimage :掛載真正的rootfs。
grub> root (hd0,1):指定boot所在的根目錄。
grub> setup (hd0):將stage1寫入到MBR中。

Centos7的開機啟動流程

與Centos5,6相比,Centos7將系統啟動的第一支程序從init變成systemd,systemd并不是一個純粹的init系統,而且還能管理系統的各種daemon,并有用的多個新特性與功能。

  • 支持平行啟動服務,并按照相依性啟動程序

  • 按需啟動

  • 支持快照與狀態恢復

  • c group預設限制硬件資源 …

支持平行啟動服務,并按照相依性啟動程序

對比init的腳本啟動,systemd大膽的將所有需要啟動的都分為一個一個的unit,并以對應的后綴來區分,大致分為 系統服務(.service)
掛載點(.mount)
sockets(.sockets)
系統設備(.device)
交換分區(.swap)
文件路徑(.path)
啟動目標(.target)
systemd計時器(.timer)

systemd會為每一個需要啟動的服務啟動一個套接字,來使不同的daemon之間可以通信,并為每一個daemon分配一個控制組,達到一組一組的按照相依性來啟動。

按需啟動

init在系統啟動時,會啟動所有預設為啟動的服務進程,并且系統必須等待所有的服務都啟動就緒之后才會允許用戶登錄操作,這樣會讓系統啟動速度非常慢,并且浪費系統資源。 systemd就采用了按需啟動,在開機時,做到不需要的服務就不啟動,在用到之后才回去啟用,然后使用完畢后一段時間后就又會關閉。

支持快照與狀態恢復

systemd能夠將系統當前的狀態保存為快照存貯下來,并且在需要時恢復當前系統狀態。

target

在systemd中,將原來sysV,upstart一直保留的run level改為了target這種形式,但是target并沒有run level劃分為0-6,而是更加細致的分了非常多的target。

SysV啟動級別                    Systemd目標                                   注釋
0                   runlevel0.target, poweroff.target                       中斷系統(halt)
1, s, single        runlevel1.target, rescue.target                         單用戶模式
2, 4                runlevel2.target, runlevel4.target, multi-user.target   用戶自定義啟動級別,通常識別為級別3。
3                   runlevel3.target, multi-user.target                     多用戶,無圖形界面。用戶可以通過終端或網絡登錄。
5                   runlevel5.target, graphical.target                      多用戶,圖形界面。繼承級別3的服務,并啟動圖形界面服務。
6                   runlevel6.target, reboot.target                         重啟
emergency           emergency.target                                        急救模式(Emergency shell)

systemd啟動流程圖

systemd boot shot


systemctl命令

systemctl [options]

    show [NAME.unittype]:顯示指定服務狀態或當前允許的服務列表。
    status [NAME.unittype]:查看指定unit狀態。
    list-units [--type TYPE] [--all]:查看指定unit類型的load,活動狀態,運行狀態,簡述。
    list-unit-files --type TYPE [--all]:查看指定unit類型的啟動狀態,是否為開機自啟等。


    start [NAME.unittype]:啟動指定unit。
    stop [NAME.unittype]:停止指定unit。
    restart [NAME.unittype]:重新啟動unit。
    reload [NAME.unittype]:重新加載unit。
    reset [NAME.unittype]:還原設置unit。
    try-restart [NAME.unittype]:如果服務運行中才會重啟

    enable [NAME.unittype]:設置為開機啟動。
    disable [NAME.unittype]:設置為開機不啟動。

    isolate [NAME.target]:切換到指定target。
    get-default [NAME.target]:查詢開機默認target。
    set-default [NAME.target]:設置開機默認target。

    snapshot:創建一個快照,創建完成后在下次重啟后,系統會自動回復快照狀態。

    hibernate:休眠模式,把信息寫入到文件中,也就是硬盤中,不會有斷電丟失數據的問題,但恢復時最慢,和重新開機一樣。
    sleepp:睡眠模式,把信息到存到內存中,但不能斷電,斷電后數據丟失,恢復最快。
    hybrid-sleep:混合睡眠模式。
    reboot:重啟
    halt:關機

systemd文件

/etc/systemd/system.conf:systemd設定檔。
/lib/systemd/system/NAME.UNIT:unit腳本文件位置。
/etc/systemd/system/NAME.UNIT.wants:存放了指定target要啟動的所有服務。

我們來看一下/etc/systemd/system/目錄下面到底存放了什么文件。

    [root@xiao ~]# ll /etc/systemd/system/
    total 32
    drwxr-xr-x. 2 root root 4096 Nov 21  2014 basic.target.wants
    lrwxrwxrwx. 1 root root   37 Nov 21  2014 default.target -> /lib/systemd/system/multi-user.target   注意這個
    drwxr-xr-x. 2 root root 4096 Nov 21  2014 default.target.wants
    drwxr-xr-x. 2 root root 4096 Nov 21  2014 getty.target.wants
    drwxr-xr-x. 2 root root 4096 Apr  8 14:29 multi-user.target.wants
    drwxr-xr-x. 2 root root 4096 Nov 21  2014 printer.target.wants
    drwxr-xr-x. 2 root root 4096 Nov 21  2014 sockets.target.wants
    drwxr-xr-x. 2 root root 4096 Mar 22 17:48 sysinit.target.wants
    drwxr-xr-x. 2 root root 4096 Nov 21  2014 system-update.target.wants

從這個目錄我們可以看到,其實系統當前所運行的target是通過軟鏈接的形式鏈接到/lib/systemd/system/目錄下的target文件,基于這種方式,
我們就可以通過手動來切換target。

    [root@xiao system]#rm -f default.target
    [root@xiao system]#ln -s /lib/systemd/system/graphical.target default.target

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

(0)
Net18_肖肖Net18_肖肖
上一篇 2016-04-11 11:38
下一篇 2016-04-11 11:44

相關推薦

  • 馬哥教育網絡班22期第一周課程練習

    1.描述計算機的組成及其功能     計算機的組成部分分為硬件部分與軟件部分         硬件部分: I/O設備 + 運算器 + 存儲器 + 控制器       &n…

    Linux干貨 2016-08-15
  • 作業用戶和組管理

    1、創建用戶gentoo,附加組為bin和root,默認shell為 /bin/csh,注釋信息為"Gentoo Distribution" 首先來分析下題目,創建一個gentoo用戶,那我們這時候就想到了useradd命令,不錯,就是這個命令,創建用戶gentoo時會默認創建主組gentoo,那么想同時將用戶gentoo加到root,b…

    Linux干貨 2016-08-03
  • 3、常用命令介紹

    http://note.youdao.com/yws/public/redirect/share?id=4840e26ee1d2b2c928b6c26e2ba14661&type=false

    Linux干貨 2016-08-08
  • Linux安全與加密基礎(二)

    Linux安全與加密基礎(二) 常見的加密算法 SSL: Openssl與CA認證 ssh服務 dropbear AIDE sudo gpg gpg亦可用于對稱加密與文件檢驗。 文件完整性的兩種實施方式 被安裝的文件     MD5單向散列     rpm –veri…

    Linux干貨 2016-10-06
  • Linux常用命令說明

    個人認為把操作練習打在博客上比較愚蠢,關于操作部分我將以練習題的形式展示,每周固定練習這些基礎的題目 Linux常見命令練習 1.文本內容顯示 1.1cat: (1)顯示/root下adjtime文件內容 (2)把文件mm.txt的文件內容加上行號輸入到textfile2文件中 (3)把文件mm.txt和textfile2的文件內容加上行號(空白行不加)之后…

    Linux干貨 2016-10-29

評論列表(1條)

  • stanley
    stanley 2016-04-11 11:41

    上頭條只差了MARKDOWN的渲染

欧美性久久久久