linux操作系統啟動流程 & grub簡述

linux操作系統啟動流程 & grub簡述

linux操作系統啟動流程 & grub簡述

CentOS 5 啟動流程

1.POST:通電自檢
2.BIOS:BOIS自檢,加載硬盤
3.讀取MBR,進行MBR引導
4.bootloader:grub引導菜單
5.加載內核 Kernel(ramdisk)
6.啟動init進程,依據inittab文件設定運行級別
7.init進程,執行rc.sysinit文件
8.啟動內核模塊,執行不同級別的腳本程序
9.執行/etc/rc.d/rc.local
10.啟動mingetty,進入系統登陸界面。

1.BIOS

打開計算機電源,計算機會首先加載BIOS信息。BIOS中包含了CPU的相關信息、設備啟動順序信息、硬盤信息、內存信息、時鐘信息、PnP特性等等。開機時將ROM中的指令映射到RAM的低地址空間,CPU讀取到這些指令,硬件的健康狀況進行檢查,按照BIOS中設置的啟動設備來啟動。

2.MBR

硬盤上第0磁道第一個扇區被稱為MBR,也就是Master Boot Record,即主引導記錄,它的大小是512字節,可里面卻存放了預啟動信息、分區表信息。
系統找到BIOS所指定的硬盤的MBR后,就會將其復制到0×7c00地址所在的物理內存中。被復制到物理內存的內容就是Boot Loader,那就是lilo或者grub了。

3.bootloader

Boot Loader 就是在操作系統內核運行之前運行的一段小程序。bootloader供一個菜單,允許用戶選擇要啟動的系統或不同的內核版本; 把用戶選定的內核裝載到RAM中的特定空間中,解壓、展開,而后把系統控制權移交給內核。

Boot Loader有若干種,其中Grub、Lilo和spfdisk是常見的。

grub簡介

grub啟動三階段:

  • stage1: 引導安裝在MBR中的引導程序(bootloader)
  • stage1_5: mbr之后的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統;
  • stage2:讀取存放在磁盤上的grub(存放位置:/boot/grub),grub的配置文件:/boot/grub/grub.conf,在etc目錄下有此文件的連接文件:/etc/grub.conf

注意:stage2及內核通常放置于同一個磁盤分區。

grub stage2功用:

  • 提供菜單、并提供交互式接口
    e: 編輯模式,用于編輯菜單;
    c: 命令模式,交互式接口;
  • 加載用戶選擇的內核或操作系統
    允許傳遞參數給內核
    可隱藏此菜單
  • 為菜單提供了保護機制
    為編輯菜單進行認證
    為啟用內核或操作系統進行認證

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

如何識別設備

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

grub配置文件

[root@localhost ~]# cat /boot/grub/grub.conf 
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-696.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=d420f98e-b665-44d9-a4fd-e0e1503ea87c rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-696.el6.x86_64.img

參數:
    default=#: 設定默認啟動的菜單項;落單項(title)編號從0開始;
    timeout=#:指定菜單項等待選項選擇的時長;
    splashimage=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜單背景圖片文件路徑;
    hiddenmenu:隱藏菜單;
    password [--md5] STRING: 菜單編輯認證;
    title TITLE:定義菜單項“標題”, 可出現多次;
        root (hd#,#):grub查找stage2及kernel文件所在設備分區;為grub的“根”; 
        kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:啟動的內核
        initrd /PATH/TO/INITRAMFS_FILE: 內核匹配的ramfs文件;
        password [--md5] STRING: 啟動選定的內核或操作系統時進行認證;

實例:手動恢復grub

1>.屏幕上出現grub的啟動項選擇菜單時按c鍵也是可以進入grub>狀態的

linux操作系統啟動流程 & grub簡述

linux操作系統啟動流程 & grub簡述

2>.輸入“ root (hd ” ,然后按兩次 TAB 鍵; /* 這會列出你電腦上可能的磁盤設備,硬盤為 hd0/hd1 或 sd0/sd1 等 */

然后,選擇你的安裝 Linux 系統的硬盤,比如 hd0 ,輸入 “ root (hd0, ” 再按兩次 TAB 鍵; /* 這會列出你的第一塊硬盤上的分區情況,你會知道哪個是 swap 交換分區, 0x82 ,哪個是 Linux 分區 0x83 */

linux操作系統啟動流程 & grub簡述

3>.cat指令是用來查看文件內容的,有時我們不知道Linux的/boot分區,以及/根分區所在的位置,要查看/etc/fstab的內容來得知
這時,我們就要用到cat (hd[0-n],y)/etc/fstab 來獲得這些內容;注意要學會用tab鍵命令補齊的功能;

linux操作系統啟動流程 & grub簡述

4>.root (hd[0-n,y) 指令來指定/boot所在的分區

選擇你認為可能的 /boot 目錄所在的分區:第一塊硬盤第一個分區

linux操作系統啟動流程 & grub簡述

5>.kernel 指令,用來指定Linux的內核,及/所在的分區

如果/boot有自己獨立的分區,kernel格式如下;

kernel /vmlinuz在這里按tab鍵來補齊,就看到內核全稱了 ro root=/dev/hd[a-z]X

linux操作系統啟動流程 & grub簡述

6>.initrd 命令行來指定initrd文件

如果/boot是獨立的一個分區,格式如下:

grub> initrd /init在這里tab 來補齊;

linux操作系統啟動流程 & grub簡述

7>.boot 引導系統

前面的幾個步驟都弄好 。就進入引導

linux操作系統啟動流程 & grub簡述

4.加載內核

Kernel,內核,Kernel是Linux系統最主要的程序,實際上,Kernel的文件很小,只保留了最基本的模塊,并以壓縮的文件形式存儲在硬盤中,當GRUB將Kernel讀進內存,內存開始解壓縮內核文件。

initrd(Initial RAM Disk),它在stage2這個步驟就被拷貝到了內存中,這個文件是在安裝系統時產生的,是一個臨時的根文件系統(rootfs)。因為Kernel為了精簡,只保留了最基本的模塊,因此,Kernel上并沒有各種硬件的驅動程序,也就無法識rootfs所在的設備,故產生了initrd這個文件,該文件裝載了必要的驅動模塊,當Kernel啟動時,可以從initrd文件中裝載驅動模塊,直到掛載真正的rootfs,然后將initrd從內存中移除。

Kernel會以只讀方式掛載根文件系統,當根文件系統被掛載后,開始裝載第一個進程(用戶空間的進程),執行/sbin/init,之后就將控制權交接給了init程序。

總結

  1. 探測可識別到的所有硬件設備;
  2. 加載硬件驅動程序;(有可能會借助于ramdisk加載驅動)
  3. 以只讀方式掛載根文件系統:rootfs;
  4. 運行用戶空間的第一個應用程序:/sbin/init

5. init:依據inittab文件設定運行級別

內核被加載后,第一個運行的程序便是/sbin/init,該文件會讀取/etc/inittab文件,并依據此文件來進行初始化工作。其實/etc/inittab文件最主要的作用就是設定Linux的運行等級,其設定形式是“:id:5:initdefault:”,這就表明Linux需要運行在等級5上。Linux的運行等級設定如下:

[root@localhost ~]# cat /etc/inittab 
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
# 
id:5:initdefault:

7個級別:
    0:關機, shutdown
    1:單用戶模式(single user),root用戶,無須認證;維護模式;
    2、多用戶模式(multi user),會啟動網絡功能,但不會啟動NFS;維護模式;
    3、多用戶模式(mutli user),完全功能模式;文本界面;
    4、預留級別:目前無特別使用目的,但習慣以同3級別功能使用;
    5、多用戶模式(multi user), 完全功能模式,圖形界面;
    6、重啟,reboot

默認級別:3, 5                   
級別切換:init #                 
級別查看:
    who -r
    runlevel 

配置文件/etc/inittab

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

        id:一個任務的標識符,用于唯一標識每個登記項,不能重復
        runlevels:系統的運行級別,表示process的action要在哪個級別下運行,該段中可以定義多個運行級別,各級別之間直接寫不用分隔符;如果為空,表示在所有的運行級別運行
        action:表示對應登記項的process在一定條件下所要執行的動作。
        process:任務;

    action:
        wait:等待切換至此任務所在的級別時執行一次;
        respawn:一旦此任務終止,就自動重新啟動之;
        initdefault:設定默認運行級別;此時,process省略;
        sysinit:設定系統初始化方式,只有系統開機或重新啟動的時候,這個process才會被執行一次,此處一般為指定/etc/rc.d/rc.sysinit腳本;

例子:
id:3:initdefault:
    表示我們默認的運行級別是3,也就是說我們默認開機啟動會進入命令行模式。

si::sysinit:/etc/rc.d/rc.sysinit
    所所有的運行級別下,init依賴/etc/rc.d/rc.sysinit這個腳本對系統進行初始化


l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
.....
l6:6:wait:/etc/rc.d/rc 6

    l0:標識
    0:動作在0級別下運行
    wait:是指在切換至0級別時執行后面的process(/etc/rc.d/rc 0),并且init進程會等待直到這些進程終止。/etc/rc.d/rc 0 這是一個腳本,后面的0是傳遞進去的參數 ,傳遞進去0就代表著要去啟動或關閉/etc/rc.d/rc0.d/目錄下的服務腳本所控制服務;
        K*:要停止的服務;K##*,優先級,數字越小,越是優先關閉;依賴的服務先關閉,而后關閉被依賴的;
        S*:要啟動的服務;S##*,優先級,數字越小,越是優先啟動;被依賴的服務先啟動,而依賴的服務后啟動  

        [root@localhost rc1.d]# cd /etc/rc.d/rc0.d
        [root@localhost rc0.d]# ls
        K01smartd        K16abrt-ccpp               K60crond             K75ntpdate         K87irqbalance   K92ip6tables     K99sysstat
        K05atd           K16abrtd                   K61nfs-rdma          K75quota_nld       K87restorecond  K92iptables      K99vmware-tools
        K05wdaemon       K25sshd                    K73winbind           K75udev-post       K88auditd       K92pppoe-server  S00killall
        K10cups          K30postfix                 K74acpid             K83bluetooth       K88rsyslog      K95firstboot     S01halt
        K10psacct        K30spice-vdagentd          K74haldaemon         K84NetworkManager  K89netconsole   K95rdma
        K10saslauthd     K43vmware-tools-thinprint  K74ntpd              K84wpa_supplicant  K89portreserve  K99cpuspeed
        K15htcacheclean  K50dnsmasq                 K75blk-availability  K85mdmonitor       K89rdisc        K99lvm2-monitor
        K15httpd         K50kdump                   K75netfs             K85messagebus      K90network      K99rngd

6.系統初始化腳本rc.sysinit

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

  1. 設置主機名;
  2. 設置歡迎信息;
  3. 激活udev和selinux;
  4. 掛載/etc/fstab文件中定義的所有文件系統;
  5. 檢測根文件系統,并以讀寫方式重新掛載根文件系統;
  6. 設置系統時鐘;
  7. 根據/etc/sysctl.conf文件來設置內核參數;
  8. 激活lvm及軟raid設備;
  9. 激活swap設備;
  10. 加載額外設備的驅動程序;
  11. 清理操作;

7.啟動內核模塊,執行不同級別的腳本程序

執行/etc/inittab中腳本:

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
.....
l6:6:wait:/etc/rc.d/rc 6

8.執行/etc/rc.d/rc.local

/etc/rc.d/rc.local是給用戶自定義啟動時需要執行的文件。

9.啟動mingetty,進入系統登陸界面

tty1:2345:respawn:/usr/sbin/mingetty tty1
... ...
tty6:2345:respawn:/usr/sbin/mingetty tty6

(1)mingetty會調用login程序;
(2)打開虛擬終端的程序除了mingetty之外,還有諸如getty等;

CentOS6啟動流程

1.POST:通電自檢  
2.BIOS:BOIS自檢,加載硬盤  
3.讀取MBR,進行MBR引導  
4.bootloader:grub引導菜單  
5.加載內核 Kernel(ramdisk)    
6.啟動init進程,依據inittab文件設定運行級別 (inittab用于定義默認運行級別) 
7.init進程,執行rc.sysinit文件  
8.分別執行/etc/init/rcS.conf、/etc/init/rc.conf、/etc/init/start-ttys.confl來調用命令執行/etc/rc#.d/文件
        里面定義的是各種服務的啟動腳本,可以ls查看,S開頭代表開機啟動的服務,K開頭的是關機要執行的任務。#代表數字,一個數字代表一個運行級別,共7個運行級別,這里就不多說了
9.執行/etc/rc.d/rc.local  
10.執行/bin/login程序,等待用戶登錄

CentOS7啟動流程

1.POST:通電自檢  
2.BIOS:BOIS自檢,加載硬盤  
3.讀取MBR,進行MBR引導  
4.bootloader:grub引導菜單  
5.加載內核和inintamfs模塊   
6.內核開始初始化,使用systemd來代替centos6以前的init程序
7.執行initrd.target
        包括掛載/etc/fstab文件中的系統,此時掛載后,就可以切換到根目錄了
8.從initramfs根文件系統切換到磁盤根目錄
        entos7表面是有“運行級別”這個概念,實際上是為了兼容以前的系統,每個所謂的“運行級別”都有對應的軟連接指向,默認的啟動級別時/etc/systemd/system/default.target,根據它的指向可以找到系統要進入哪個模式 
        模式:

        0 ==> runlevel0.target, poweroff.target
        1 ==> runlevel1.target, rescue.target
        2 ==> runlevel2.target, multi-user.target
        3 ==> runlevel3.target, multi-user.target
        4 ==> runlevel4.target, multi-user.target
        5 ==> runlevel5.target, graphical.target
        6 ==> runlevel6.target, reboot.target
9.systemd執行sysinit.target
10.systemd啟動multi-user.target下的本機與服務器服務
11.systemd執行multi-user.target下的/etc/rc.d/rc.local
12.Systemd執行multi-user.target下的getty.target及登錄服務
        getty.target是啟動終端的systemd對象。如果到此步驟,系統沒有被指定啟動圖形桌面,到此就可以結束了,如果要啟動圖形界面,需要在此基礎上啟動桌面程序
13.systemd執行graphical需要的服務

區別

linux操作系統啟動流程 & grub簡述

 

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/100142

(0)
eighteenxueighteenxu
上一篇 2018-06-03
下一篇 2018-06-03

相關推薦

  • Linux系統報錯修復的方法 . 2

    /boot/vmlinuz-2.6.32-696.el6.x86_64.img文件丟失怎么辦
    內有centos6的啟動流程

    2018-05-12
  • 網絡基礎

    計算機網絡基礎

    2018-05-10
  • 阿X吃雞錄————第四站

    diff -u a b >ab 生成ab即為補丁,在a或者b文件丟失時 patch -b a/b ab 生成丟失的文件內容 etc/下創建nologin文件會使普通文件無法登陸(普通用戶登陸會顯示文件中的內容) [-t num ] 判斷是否文件在終端被打開(文件描述符) read 對變量賦值 echo -e “ \c” read name 會不產生換行…

    Linux筆記 2018-08-06
  • iproute家族命令簡介

    iproute家族命令簡介

    Linux筆記 2018-04-20
  • 筆記整理-軟件包管理

      管理包工具: rpm? 集包與工具于一身的管理器 獲取途徑: https://www.centos.org/download/ http://mirrors.aliyun.com http://mirrors.sohu.com http://mirrors.163.com   常見包的文件名組成: zlib -3.0-11.e17.x…

    Linux筆記 2018-04-22
  • 馬哥教育– 第一周作業

    一、描述計算機的組成及其功能。 計算機由運算器,控制器,存儲器,輸入設備和輸出設備五大部分組成。 運算器的功能是用于完成算術運算、邏輯運算。負責計算機執行的所有數學與邏輯功能。 控制器的功能是主要負責對程序所執行的指令進行分析,并協調計算機各部件進行工作計算機的所有其他部件。 存儲器的功能是用于儲存信息的設備,通常是將信息數字化后再利用電、磁、光學等方式的媒…

    2018-05-12
欧美性久久久久