1. 程式人生 > >Linux啟動流程詳解

Linux啟動流程詳解

linux 詳解 啟動流程 grub mbr 內核

linux啟動流程

第一部分 Linux啟動基礎知識

1.1 linux centos6.8啟動流程圖

技術分享

BIOS加電自檢à

加載MBRà加載啟動grubà加載內核à啟動/sbin/init進程à啟動/bin/login進程à進入登陸頁面

1.2 BIOSBasic Input/Output System )基礎輸入輸出系統

BIOS是加載在電腦硬件系統上的最基本的軟件代碼。它的主要功能是為計算機提供最底層的、最直接的硬件設置和控制。它保存著計算機最重要的基本輸入輸出的程序、系統設置信息、開機後自檢程序和系統自啟程序。BIOS程序一般被存放在主板ROM(只讀存儲芯片)之中,即使在關機或者掉電以後,程序也不會丟失。

BIOS的主要作用可以分為以下三點:

  • 自檢及初始化程序POST(Power On Self Test):

計算機接通電源後,POST程序將對內部所有設備進行檢查,完整的自檢包括了對CPU、640K基本內存、1M以上拓展內存、ROM、主板、CMOS存儲器、串並口、顯示卡、軟硬盤子系統及鍵盤的測試。在自檢過程中若發現有問題,BIOS將給出提示信息或鳴笛警告。若沒有問題,完成自檢後BIOS將按照系統CMOS設置中的啟動順序搜尋軟、硬盤驅動器及CDROM、網絡服務器等有效的啟動驅動器,讀取操作系統引導記錄,然後將系統控制權交給主引導記錄,由主引導記錄完成系統的啟動。

  • 硬件中斷處理:

計算機通電時,BIOS會告訴CPU等硬件設備的中斷號,在進入操作系統之前輸入某個硬件的命令,它就會根據中斷號使用相應的硬件來完成命令的工作。

  • 程序服務請求:

通過特定的端口發出指令,實現發送和接受外部設備的數據,從而實現對硬件的控制。

在安裝操作系統之前,BIOS便存在於硬件系統之中,故BIOS並不屬於內核kernel。

1.3 MBRMaster Boot Record)主引導記錄

MBR主引導記錄

組成

大小

主引導程序

446byte

分區表

64byte

有效標識符

(又稱幻數 magic number)

2byte

MBR是硬盤上的一個扇區,由主引導程序、硬盤分區表DPT和分區有效標誌三部分組成。

MBR共有512字節的空間,第一部分的主引導程序(boot loader)占446個字節;第二部分的分區表DPT(Disk Partition Table)占64個字節,每十六個字節記錄一個分區,記錄分區數量及其大小;第三部分的分區有效標誌占2個字節,標誌磁盤已被格式化,操作系統可正確加載。

由MBR的組成及其作用,亦可知MBR並不屬於linux內核kernel。

1.4 linux內核Kernel組成

1.4.1 kernel組成圖解

技術分享

1.4.1 kernel組成詳解

linux內核kernel主要有五個子系統組成,分別為進程調度(SCHED)、內存管理(MM)、虛擬文件系統(Virtual File System,VFS)、網絡接口(NET)和進程間通訊(IPC)。

  • 進程調度:控制進程對CPU的訪問。當許需要選擇下一個進程運行時,由調度程序選擇最值得運行的進程。可運行進程實際上是僅等待CPU資源的進程,如果某個進程在等待其他資源,則該進程是不可運行進程。Linux使用了比較簡單的基於優先級的進程調度算法選擇新的進程。

  • 內存管理:內存管理(MM)允許多個進程安全共享主內存區域。Linux的內存管理支持虛擬內存,即在計算機中運行的程序,其代碼,數據,堆棧的總量可以超過實際內存的大小,操作系統只是把當前使用的程序塊保留在內存中,其余的程序塊則保留在磁盤中。必要時,操作系統負責在磁盤和內存間交換程序塊。內存管理從邏輯上分為硬件無關部分和硬件有關部分。硬件無關部分提供了進程的映射和邏輯內存的對換;硬件相關部分為內存管理硬件提供了虛擬接口。

  • 虛擬文件系統:隱藏了各種硬件的具體細節,為所有的設備提供了統一接口,VFS提供了多達數十種不同的文件系統。虛擬文件系統可以分為邏輯文件系統和設備驅動程序。邏輯文件系統指Linux所支持的文件系統,如ext2,fat等,設備驅動程序指為每一種硬件控制器所編寫的設備驅動程序模塊。

  • 網絡接口:提供了對各種網絡標準的存取和各種網絡硬件的支持。網絡接口可分為網絡協議和網絡驅動程序。網絡協議部分負責實現每一種可能的網絡傳輸協議。網絡設備驅動程序負責與硬件設備通訊,每一種可能的硬件設備都有相應的設備驅動程序。

  • 進程間通信:支持進程間多種通信機制,包括信號量、共享內存、管道等。這些機制可以協助多個進程、多資源的互斥訪問、進程間的同步的消息傳遞。

(由於篇幅原因,不再在這裏討論內核kernel,但在之後的文章中會詳細討論內核的組成和運行機制)

1.5 linux系統劃分----內核空間(Kernelspace)和用戶空間(Userspace)

內核空間:存放內核源代碼和數據

用戶空間:存放用戶應用程序和數據。

第二部分 centos6.8詳細啟動過程

2.1 BIOS

系統通電,加載BIOS,開啟POST(Power On Self Test)加電自檢程序,識別並檢測所有主板硬件,若發現問題,系統將給出提示信息或鳴笛警告,若沒有發現問題,則按照啟動順序(Bootsequence)依次尋找可引導設備。自檢結束後,將MBR主引導記錄加載到內存中。

2.2 MBR

MBR加載進入內存,即引導程序GRUB和分區信息家在進入內存,將加載啟動多重系統引導裝載程序GRUB(GRand Unified Bootloader)。

2.3 GRUB

GRUB引導分為兩個階段:

第一階段,運行MBR中的stage1(存在於MBR中,用匯編語言編寫):

  • 初始化基本硬件;

  • 為加載stage2(存在於磁盤中,用C語言編寫)準備空間。

  • 將stage2加載進入RAM空間中;

  • 設置好堆棧;

  • 跳轉到stage2的C程序入口

第二階段,啟動/boot/grub/stage2,讀取/boot/grub/grub.conf配置文件:

  • 初始化本階段要用到的硬件設備;

  • 檢測系統內存映射;

  • 將kernel映像(/boot/vmlinuz)和虛擬根文件系統映像(/boot/intramfs)從flash加載到RAM空間;

  • 為內核設置啟動參數;

  • 調用內核。

2.4 內核空間

2.4.1 啟動內核

第一階段:訪問虛擬根文件系統(/boot/intramfs),執行init進程,完成加載驅動模塊等任務;

第二階段:以只讀方式掛載真實根文件系統,執行用戶空間的/sbin/init進程。

2.5用戶空間

2.5.1 /sbin/init進程

  • 根據/etc/inittab設置默認系統運行級別;

  • 執行/etc/rc.d/rc.sysinit系統初始化腳本;

  • 加載/lib/modules系統內核模塊;

  • 根據之前設定的運行級別,相應地執行/etc/rc.d/rc腳本,完成相應的初始化工作和啟動相關服務;

  • 執行/etc/rc.d/rc.local腳本,執行用戶個性化的設置或程序。

進入登錄狀態。

第三部分 啟動過程重要文件

3.1 stage1

  • MBR中:

x86 boot sector;

GRand Unified Bootloader, stage1 version 0x3, boot drive 0x80, 1stsector stage2 0x6224, GRUB version 0.94;

partition 1: ID=0x83, active, starthead 32, startsector 2048, 409600sectors;

partition 2: ID=0x82, starthead 159, startsector 411648, 1572864sectors;

partition 3: ID=0x83, starthead 135, startsector 1984512, 18987008sectors, code offset 0x48

  • /boot/grub/stage1中:

x86 boot sector;

GRand Unified Bootloader, stage1 version 0x3, GRUB version 0.94,code offset 0x48

  • 將MBR中的引導記錄信息加載出來,以及查看方法:

[[email protected] grub]# dd if=/dev/sda count=1 of=/tmp/MBR

1+0 records in

1+0 records out

512 bytes (512 B) copied, 4.9834e-05 s, 10.3 MB/s

[[email protected] grub]# file /tmp/MBR

/tmp/MBR: x86 boot sector; GRand Unified Bootloader, stage1 version0x3, boot drive 0x80, 1st sector stage2 0x6224, GRUB version 0.94; partition 1:ID=0x83, active, starthead 32, startsector 2048, 409600 sectors; partition 2:ID=0x82, starthead 159, startsector 411648, 1572864 sectors; partition 3:ID=0x83, starthead 135, startsector 1984512, 18987008 sectors, code offset 0x48

3.2 /boot/ *stage1_5/boot/grub/stage2

1) stage1_5:

e2fs_stage1_5 ffs_stage1_5 jfs_stage1_5 reiserfs_stage1_5 vstafs_stage1_5

fat_stage1_5 iso9660_stage1_5 minix_stage1_5 ufs2_stage1_5 xfs_stage1_5

2) stage2:

GRand Unified Bootloader stage2 version 3.2,

installed partition 65535,

identifier 0x0,

GRUB version 0.97,

configuration file (hd0,0)/grub/grub.conf

3.3 /boot/grub/grub.conf

GRUB的配置文件。

# Note that you do nothave to rerun grub after making changes to this file 不需要在更改該文件之後重新運行,也可完成配置修改

# NOTICE: You have a /boot partition. This means that 指定內核和虛擬文件系統的位置

# all kernel and initrd paths arerelative to /boot/, eg.

# root (hd0,0)

# kernel /vmlinuz-version roroot=/dev/sda3

# 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-573.el6.x86_64)

root (hd0,0)

kernel /vmlinuz-2.6.32-573.el6.x86_64 roroot=UUID=f6eff611-2e35-4d5e-bf28-06f5fca7fc59 rd_NO_LUKS rd_NO_LVMLANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgbquiet #內核版本,默認系統字符集

initrd /initramfs-2.6.32-573.el6.x86_64.img #虛擬文件系統的版本

3.4 /etc/inittab

# Defaultrunlevel. 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) 多用戶模式(沒有NFS)

# 3 - Fullmultiuser mode 多用戶模式

# 4 –unused 未使用

# 5 - X11 桌面模式

# 6 -reboot (Do NOT set initdefault to this) 重啟

#

id:3:initdefault: (這一行便是設置的默認運行級別)

3.5 /etc/rc.d/rc.sysinit

  • 設置主機名;

  • 設置歡迎信息;

  • 激活Udex和selinux/;

  • 掛載/etc/fstab文件中定義的文件系統;

  • 設置系統時鐘;

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

  • 激活LVM以及軟RAID設備;

  • 激活SWAP分區;

  • 加載額外設備的驅動程序;

  • 執行清理操作

3.6 /etc/fstab

設置的文件系統,包括文件系統的名稱、類型、地址。

# Created by anaconda onTue Apr 25 14:56:28 2017

#

# Accessible filesystems,by reference, are maintained under ‘/dev/disk‘

# See man pages fstab(5),findfs(8), mount(8) and/or blkid(8) for more info

#

UUID=f6eff611-2e35-4d5e-bf28-06f5fca7fc59/ ext4 defaults 1 1

UUID=97012ecf-af98-4063-9839-722e0e06a30f/boot ext4 defaults 1 2

UUID=dbf823e7-030f-4ef5-b27d-04408b7e3b8fswap swap defaults 0 0

tmpfs /dev/shm tmpfs defaults 0 0

devpts /dev/pts devpts gid=5,mode=620 0 0

sysfs /sys sysfs defaults 0 0

proc /proc proc defaults 0 0

3.7 /etc/rc.d/rc.local

這個進程在其他的init腳本執行完畢後在執行,可以在這裏設置自己想要執行的操作。

#!/bin/sh

#

# This script will beexecuted *after* all the other init scripts.

# You can put your owninitialization stuff in here if you don‘t

# want to do the full SysV style init stuff.

touch /var/lock/subsys/local #創建一個/var/lock/subsys/local的文件

參考文獻:

《從BIOS到內核的過程分析》,seek_0380,CSDN博客;

《BIOS》,百度百科;

《BIOS的主要作用》,若木,學習啦網;

《MBR》,百度百科;

《linux內核的組成部分》,leafhunter,新浪博客;

《MBR&/BOOT和GRUB三者關系總結》,dale_chenjiawen,CSDN博客;

《linux系統啟動流程詳解》,wang7396,CSDN博客;

《什麽是BIOS?BIOS的作用是什麽?》,hix747810800,百度經驗;




由於水平有限,在總結過程中難免有一些錯誤,希望各位能在發現問題之後或有哪些不解,可以留言評論,我會及時更改錯誤和回復大家,不勝感激。

本文出自 “零容忍” 博客,請務必保留此出處http://lingrongren.blog.51cto.com/12744457/1925425

Linux啟動流程詳解