Linux 系統啟動流程與grub的應用

Linux 系統啟動流程

  

POST –> BIOS(Boot Sequence) –> MBR(bootloader) –> kernel + initramfs(initrd) –> rootfs (ro) –> /sbin/init –> (/etc/inittab, /etc/init/*.conf) –>設定默認運行級別–>使用/etc/rc.d/rc.sysinit初始化系統 –> 分別啟動并關閉指定服務 –> 啟動終端

    1. post當我們按下開機的電源后,主板上的芯片組會首先向CPU發出一個reset指令,之后待芯片組檢測到電源供電穩定后便撤去reset指令,CPU就會跳轉到BIOS中的啟動代碼位置; BIOS首先要檢測關鍵設備是否正常,這個過程就稱為POST(加電后自檢)。

    

    2MBRCPU讀取可引導設備的第一個扇區即MBRMaster boot record),也稱“主引導記錄”,大小為512字節,其中存放著:

        引導加載程序(boot loader)446bytes,常用的boot loaderLILOGRUB,現以GRUB為主;

        分區表:64bytes

        有效性標記:2bytes

        CPU執行boot loader,boot loader選擇要啟動的內核(在當前磁盤的某或某些分區上)并加載到內存中

    

    3.kernel + initramfs內核被加載后,它要做的工作主要有:探測硬件、裝載驅動程序、以只讀方式裝載根文件系統(rootfs)、啟動第一個進程/sbin/init。

備注:內核要裝載根文件系統就需要先能驅動磁盤,即需要先裝載驅動程序,而驅動程序又在磁盤上。為解決此問題,boot loader在加載內核的同時也把initramfs(或initrd)加載到內存中,它是一個臨時的根文件系統,里面包含了啟動所必須的驅動模塊。內核掛載這個臨時根,裝載驅動程序,然后釋放臨時根,掛載實際的根文件系統,并啟動第一個進程/sbin/init


    4.init:內核初始化的最后一步就是啟動pid為1的/sbin/init進程。這個進程是系統的第一個進程,它負責產生其他所有進程。init進程上來首先做的事是去讀取/etc/inittab和/etc/init/*.conf

 

init程序類型:

         SysV: init, CentOS 5

                  配置文件:/etc/inittab

         Upstart: init, CentOS 6

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

     Systemdsystemd, CentOS 7

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

 

在/etc/inittab和/etc/init/*.conf中,大致規定了以下動作: 

    取得runlevel即運行級別

    使用/etc/rc.d/rc.sysinit進行系統初始化

    根據runlevel啟動相應的服務并關閉需要停止的服務

    確定Ctrl+Alt+Delete組合鍵功能

    啟動字符終端

    啟動圖形終端

系統運行級別:

    0:關機

    1single user mode,單用戶模式;直接以root身份登錄,無需身份認證,且不會開啟網絡服務

    2multi user mode,不支持NFS功能

    3:完全多用戶模式,文本接口

    4:未使用,預留級別

    5:完全多用戶模式,圖形接口

    6:重啟

    可在命令行切換級別:init #

 

   blob.png                                         

配置文件:/etc/inittab

                id:runlevels:action:process

各字段的含義:

             id:登記項的標識符,必須是唯一的

             runlevels:系統的運行級別,表示processaction要在哪個級別下運行,可定義多個級別,各級別間不用

                        分隔符;如果為空,表示在所有的運行級別下運行

             具體的action有:

                 respawn:當process終止后馬上啟動一個新的

                 wait:當進入指定的runlevelsprocess才會啟動一次,并且到離開runlevels為止

                 initfault:設定默認的運行級別

                 sysinit:系統初始化,只有系統開機或重啟時process才會被執行一次

    5.sysinit: 在設定了運行等級后,Linux系統執行的第一個用戶層文件就是/etc/rc.d/rc.sysinit腳本

                                               (1) 設置主機名;

                                               (2) 設置歡迎信息;

                                               (3) 激活udevselinux;

                                               (4) 掛載/etc/fstab文件中定義的文件系統;

                                               (5) 檢測根文件系統,并以讀寫方式重新掛載根文件系統;

                                               (6) 設置系統時鐘;

                                               (7) 激活swap設備;

                                               (8) 根據/etc/sysctl.conf文件設置內核參數;

                                               (9) 激活lvmsoftware raid設備;

                                               (10) 加載額外設備的驅動程序;

                                               (11) 清理操作;

    6.啟動指定的默認級別的默認為啟動的服務,停止指定的級別下默認為關閉的服務

       /etc/rc.d/rc#.d (#表示運行級別),該目錄下都是符號鏈接文件,其指向的實際服務腳本位于/etc/rc.d/init.d目錄中(該目錄有個軟鏈接/etc/init.d)。這些鏈接文件均以SK開頭:

                S##:啟動的服務

                K##:停止的服務

            ##01-99,數字越小,越優先啟動或關閉

blob.png

注意:正常級別下,最后啟動一個服務S99local沒有鏈接至/etc/rc.d/init.d一個服務腳本,而是指向了/etc/rc.d/rc.local腳本;因此,不便或不需寫為服務腳本放置于/etc/rc.d/init.d/目錄,且又想開機時自動運行的命令,可直接放置于/etc/rc.d/rc.local文件中;

 

chkconfig:查看或修改服務隨系統啟動的啟動選項,它并不是直接激活或停止一個服務,而只是修改了其符號鏈接。用法如下:

a) 讓指定的服務接受chkconfig命令管理:

   第一步:在位于/etc/rc.d/init.d目錄下的服務腳本中添加如下一行或多行注釋:

     # chkconfig: LEVEL SPRI KPRI ,例如# chkconfig: – 85 15

        chkconfig后面有三個字段,它們的含義分別為:

        LEVEL:當此服務由chkconfig控制時,默認在哪些運行級是啟動的。若默認不在任何運行級啟動,以“”號表示

        SPRI:啟動優先級

        KPRI:關閉優先級

    第二步:chkconfig –add SERVICE,該命令會自動在/etc/rc.d/rc#.d目錄中創建鏈接文件

b) chkconfig del SERVICE:讓指定服務不再接受chkconfig管理,會刪除鏈接文件

c) chkconfig –list [SERVICE]:顯示所有服務或指定服務的開機啟動設置

d) chkconfig [–level ###] SERVICE on/off/reset:若不指定–level選項,onoff操作默認只對運行級2、34、5有效,而reset默認對所有運行級有效,reset意為重置,即恢復成服務腳本中的初始設置

blob.png

grub應用


GRUB:grand uniform bootloader:統一引導加載器,找到操作系統所在的磁盤,并把內核加載到內存,將控制器轉交給內核的程序。

GRUBGrand Unified Bootloader)是由GNU下的FSF組織所推行的;

CentOS 5CentOS 6上使用的版本為Grub 0.97,

CentOS 7上使用的版本為Grub2  1.96。

 

功能:MBR中的前 446 個字節,是BooTLoader的一種,提供一個菜單,允許用戶選擇要啟動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓展開,把系統控制權移交給內核,主要是由device.map,menulst,stage1,stage2,以及一系列的stage1_5組成。

blob.png

grub legacy:

            stage1: mbr (0柱面 0磁道 1扇區)

            stage1_5: mbr之后的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統;

            stage2:磁盤分區(/boot/grub/),讀取grub.conf配置文件,并實現引導功能的擴展

 

配置文件:/boot/grub/grub.conf <– /etc/grub.conf

配置項:

              1.default=#: 設定默認啟動的菜單項;落單項(title)編號從0開始;

              2.timeout=#:指定菜單項等待選項選擇的時長;

              3.splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜單背景圖片文件路徑;

              4.hiddenmenu:隱藏菜單;

              5.password [–md5] STRING: 設置密碼,菜單編輯認證;

              6.title TITLE:定義菜單項“標題”, 可出現多次;

a) root (hd#,#)grub查找stage2kernel文件所在設備分區;為grub的“根”;

b) kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:啟動的內核,指定 kernel 文件的位置,還要             指出root(系統啟動后)的位置,掛載方式 ro,這項很關鍵

c) initrd /PATH/TO/INITRAMFS_FILE: 內核匹配的ramfs文件;

d) password [–md5] STRING: 啟動選定的內核或操作系統時進行認證;

blob.png

 

initramfs文件說明:initramfs-2.6.32-573.el6.x86_64.img

          nitramfs 是以 gzip 壓縮的 cpio 格式的文件。內核啟動時將他作為一個臨時的根文件系統。

          grub stage2 initrd加載到內存里,然后將其中的內容釋放到內存中,

          內核便去執行init腳本,這時內核將控制權交給了init文件處理。

          init 它也主要是加載各種存儲介質相關的設備驅動程序。當所需的驅動程序加載完后,

          會創建一個根設備,然后將根文件系統rootfs以只讀的方式掛載。

          這一步結束后,釋放未使用的內存,轉換到真正的根文件系統上面去,同時運行/sbin/init程序,

          執行系統的1號進程。此后系統的控制權就全權交給/sbin/init進程了。

blob.png

 

grub的功能:

          (1) 提供菜單、并提供交互式接口

                    e: 編輯模式,用于編輯菜單;

                    c: 命令模式,交互式接口;

blob.png

          (2) 加載用戶選擇的內核或操作系統

                                          允許傳遞參數給內核

                                          可隱藏此菜單

          (3) 為菜單提供了保護機制

                                          為編輯菜單進行認證

                                          為啟用內核或操作系統進行認證

如何識別設備:

                       (hd#,#)

                                 hd#: 磁盤編號,用數字表示;從0開始編號

                                 #: 分區編號,用數字表示; 0開始編號

 

                                 (hd0,0)

grub的命令行接口:

                       help: 獲取幫助列表

                       help KEYWORD: 詳細幫助信息

                       find (hd#,#)/PATH/TO/SOMEFILE

                       root (hd#,#)      指定哪個分區為接下來要啟動的系統或內核文件所在的分區

                       kernel /PATH/TO/KERNEL_FILE: 設定本次啟動時用到的內核文件;額外還可以添加許多內核支持使用

                                                      cmdline參數;

                                 例如:init=/path/to/init, selinux=0

                       initrd /PATH/TO/INITRAMFS_FILE: 設定為選定的內核提供額外文件的ramdisk;

                       boot: 引導啟動選定的內核;

 

                       手動在grub命令行接口啟動系統:

                                 grub> root (hd#,#)

                                 grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE

                                 grub> initrd /initramfs-VERSION-RELEASE.img

                                 grub> boot

 

示例1  grub保護機制,為grub設置密碼,開機進入也需要輸入密碼

a) grub-md5-crypt生成密碼

blob.png

b) 保護編輯功能,則需要title之外的添加

vi /boot/grub/grub.conf

password –md5 $1$.Co8f$ytb48fDRNEzwZBzE36GUv.

blob.png

 

        現在添加好密碼到文件后 重啟系統在開選擇grub 就需要密碼才能進入

       blob.png

示例2 如果忘記根密碼就進入單用戶模式修改密碼

a) 啟動計算機,在顯示GRUB菜單時e, 進入編輯kernele

blob.png

 

b) 輸入空格+single 回車b,重啟系統進入單用戶模式,輸入以下命令更改口令:    

blob.png

blob.png

 

安裝grub:

           (1) grub-install

                    grub-install –root-directory=ROOT /dev/DISK

                           

           (2) grub

                    grub> root (hd#,#)

                    grub> setup (hd#)

 

示例重新安裝grub, grub-install安裝

         dd if=/dev/zero of=/dev/sda bs=200 count=1 模擬破壞掉原來的grub

grub-install –root-directory=/ /dev/sda 重新安裝grub

blob.png

示例4 grub命令提示符下修復grub

         dd if=/dev/zero of=/dev/sda bs=200 count=1 模擬破壞掉原來的grub

         grub

         root (hd0,0)

         setup (hd0)

 

示例在緊急救援模式下修復

d if=/dev/zero of=/dev/sda bs=200 count=1

放入光碟重啟,進入救援模式,或者按住ESC 進入命令行提示符輸入linux rescus

blob.png

   blob.png 

   blob.png

打開一好shell 命令提示符輸入

chroot /mnt/sysimage

grub-install –root-directory=/ /dev/sda

reboot

blob.png

 

示例6 Vmware 虛擬機下制作grub

 

第一步:準備好塊新磁盤,分3個區

blob.png

 

第二步:模擬啟動時的boot目錄,和根目錄,并掛載。

mkdir /mnt/boot

mount /dev/sdb1 /mnt/boot/

blob.png

第三步:制作 grub,并生成 grub 的配置文件

grub-install –root-directory=/mnt /dev/sdb

blob.png

拷貝內核文件和initramfs 文件到 /mnt/boot 目錄下,并生成 grub.conf 文件

cp /boot/vmlinuz-2.6.32-573.el6.x86_64 /mnt/boot/vmlinuz

cp /boot/initramfs-2.6.32-573.el6.x86_64.img /mnt/boot/initramfs.img

vi /mnt/boot/grub/grub.conf

blob.png

第四步: 生成根文件系統

mkdir /mnt/sysroot

mount /dev/sdb3 /mnt/sysroot/

cd /mnt/sysroot/

mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr home root mnt media

 blob.png


第五步:拷貝使用命令和庫到對應根目錄下

cp /bin/bash /mnt/sysroot/bin/

ldd /bin/bash

cp /lib64/libtinfo.so.5 /mnt/sysroot/lib64/

cp /lib64/libdl.so.2  /mnt/sysroot/lib64/

cp /lib64/libc.so.6 /mnt/sysroot/lib64/

cp /lib64/ld-linux-x86-64.so.2 /mnt/sysroot/lib64/

sync

vi /mnt/boot/grub/grub.conf

blob.png

 

將剛才的磁盤鏡像作為另一個虛擬機的啟動盤。

blob.png

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

(0)
liangkailiangkai
上一篇 2016-03-07
下一篇 2016-03-09

相關推薦

  • N25-第三周作業

      alias NAME='COMMAND'           定義命令的別名—對當前用戶有效  un為解除別名 Which   查看命令別名 Whereis    查看程序的文檔和源碼路徑(-b &nbs…

    Linux干貨 2016-12-18
  • 文本處理工具三劍客之awk

    文本處理工具:grep,sed,awk awk:報告生成器,格式化文本輸出 AWK: Aho ,Weinberger,Kernighan gawk:GNU awk gawk – pattren  scanning  and  processing  language 基本語法:gawk  [opt…

    Linux干貨 2016-09-22
  • shell腳本編寫-5

      1、 數組 變量:存儲單個元素的內存空間 數組:存儲多個元素的連續的內存空間,相當于多個變量的集合 數組名和索引 索引:編號從0 開始,屬于數值索引 注意:索引可支持使用自定義的格式,而不僅是數值格式,即為關聯索引,bash4.0版本之后開始支持。而且bash 的數組支持稀疏格式(索引不連續) 1)、定義數組 聲明數組: declare -a …

    Linux干貨 2016-09-01
  • 用戶與權限管理

    用戶與權限管理      昨天學完了用戶與權限管理,講解了用戶的運行機制和權限的作用。 用戶的產生來源于3A機制:    認證(Authentication):就是驗證用戶身份的。    授權(Authorization) :驗證完身份后,…

    2017-07-27
  • 硬鏈接與軟鏈接的區別

    硬鏈接(Hard Link):   硬連接指通過索引節點來進行鏈接(即一個指針指向文件索引節點)。在Linux的文件系統中,保存在磁盤分區中的文件不管是什么類型都給它分配一個編號,稱為索引節點號(Inode Index)。在Linux中,多個文件名指向同一索引節點是存在的。一般這種鏈接就是硬鏈接。硬鏈接的作用是允許一個文件擁有多個有效路徑…

    Linux干貨 2016-10-20
欧美性久久久久