天天看點

Linux基礎知識之啟動流程分析

作者:王嘯皓月山巅

Linux系統啟動原理:

1.power on 開機。

2.開機自檢:

電腦開機後首先加載BIOS(Basic Input/Output System基本輸入輸出系統)。BIOS程式首先檢查計算機能否滿足運作的基本條件,這個叫做“硬體自檢Power On Self Test”。也就是BIOS POST開機自檢。

3.BIOS對硬體進行檢測:

主要檢查:主機闆、CPU、記憶體、磁盤、網卡、聲霸卡、顯示卡、滑鼠、鍵盤、顯示器等。

4.啟動順序:

硬體自檢完成後,BIOS把控制權轉交給下一個階段的啟動順序。BIOS需要有一個外部儲存設備的啟動排序,排在前面的裝置就是優先轉交控制權的裝置。這種啟動順序就是引導順序Boot Sequence。一般是:硬碟、網卡、CD光牒、移動硬碟等。

5.加載MBR (主引導記錄)

MBR是主引導記錄,Master Boot Record 。主引導記錄一共512位元組。位于磁盤的0柱面0磁道0号扇區(第一個扇區)。MBR 512位元組分成三部分,446個位元組Bootloader主引導記錄,64個位元組的硬碟分區表DPT(Disk Partition Table),2個位元組扇區結尾标志55aa。它的主要作用是告訴計算機去硬碟的哪個位置去找作業系統。

一般GRUB是用來加載和管理系統啟動的完整程式,它是Linux發行版中最常見的引導程式boot loader。引導程式是計算機啟動時運作的第一個軟體,grub程式安裝在boot loader裡面。GRUB是GRandUnified Bootloader大型統一引導程式。

6.啟動管理器grub

計算機讀取“主引導記錄”的前面446位元組,不再把控制權交給哪一個分區,而是運作事先安裝的啟動管理器boot loader,由使用者選擇啟動哪一個作業系統。Linux中最流行的啟動管理器是GRUB。在centos7中啟動管理器是GRUB2。

grub的作用是在系統中選擇性地引導不同的OS,實際上是加載引導不同的核心鏡像檔案,當核心挂載成功之後,就把控制權交給核心程式。

7.centos7中的啟動管理器grub2

MBR主引導記錄加載并執行grub2引導加載程式。grub2配置檔案位于/boot/grub2/grub.cfg中,由grub2 mkconfig使用/etc/grub.d中的模闆和/etc/default/grub中的設定自動生成。

grub2-mkconfig -o /boot/grub2/grub.cfg

grub2配置檔案在/boot/grub2/grub2.cfg中,/etc/grub2.cfg是它的軟連結。

在grub2.cfg檔案中設定作業系統的啟動centos7系統,比如:

menuentry 'xxx Linux' {

set root='hd0,gpt1'

linuxefi /boot/vmlinux-4.14.105-19-1002 root=/dev/sda1

initrdefi /boot/initramfs-4.14.105-19-1002.img

}

如果是centos6的系統,一般是:

title CentOS (2.6.32-754.35.1.el6.x86_64)

root (hd0,0)

kernel /boot/vmlinuz-2.6.32-754.35.1.el6.x86_64 ro root=UUID=94e4e38

4-0ace-437f-bc96-057dd64f42ee 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 console=tty0 console=ttyS0,115200n8 net.ifnames=0

initrd /boot/initramfs-2.6.32-754.35.1.el6.x86_64.img

grub引導菜單決定啟動哪個作業系統。

8.加載核心

加載核心kernel:根據grub設定的核心鏡像所在的路徑,系統讀取核心鏡像,并且進行解壓操作。系統将解壓後的核心放置在記憶體中,并使用start_kernel()函數來啟動一系列的初始化函數并且初始化各種裝置,完成Linux 核心環境的建立。

Linux的系統核心放在了/boot的啟動目錄中。

①:config-$(uname -r)檔案,是核心的配置檔案,是核心編譯時選擇的功能和子產品。

②:efi目錄:是可擴充固件接口,是英特爾為全新PC固件的體系結構、接口和服務提出的建議标準。

③:grub目錄:啟動引導程式grub的資料目錄,裡面放了一個splash.xpm.gz,是背景圖的圖檔。

④:initramfs-$(uname -r).img 是一個虛拟的檔案系統,在centos7.x中使用initramfs替換掉了centos6.x中的initrd,但是功能是一樣的。

⑤:symvers-$(uname -r).gz 是子產品的符号資訊。

⑥:System.map-$(uname -r) 是核心功能和核心位址的對應清單,映射清單。

⑦:vmlinuz-$(uname -r) 用于啟動Linux的核心,這個檔案是一個壓縮的核心鏡像檔案。

⑧:vmlinux-$(uname -r) 是Linux的核心檔案。

Vmlinux與linuz是有差別的。VM代表Virtual Memory虛拟核心。vmlinux是一個包括linux kernel的靜态連結的可運作檔案,編譯核心源碼得到的最原始的核心檔案,未壓縮,比較大,是elf格式的檔案。

vmlinux是elf格式的檔案,可以通過readelf -h檢視程式頭表(program headers),是5個。還可以通過readelf -S 檢視vmlinux的節頭表(section headers)。

vmlinuz是可引導的,經過壓縮的Linux核心。vmlinuz是vmlinux經過gzip和objcopy制作出來的壓縮檔案。vmlinuz是一個統稱,它有兩種詳細的表現形式:zImage和bzImage。

bzImage是vmlinux經過gzip壓縮後的檔案,适用于大核心(bzImage是x86 linux常用的一種壓縮鏡像檔案 )。

zImage是vmlinux經過gzip壓縮後的檔案,适用于小核心( zImage是ARM32 linux常用的一種壓縮鏡像檔案)。

bz表示big zImage,它的格式與zImage類似,但采用了不同的壓縮算法,bzImage的壓縮率更高。

執行指令:file vmlinuz-$(uname -r)可以看到檔案類型是Linux kernel x86 boot executable bzImage。

Linux安裝在ide硬碟中,并且采用的是預設的ext3/ext4檔案系統的,核心啟動後加載根分區和子產品的加載都沒問題,Linux系統會順利啟動。如果Linux系統安裝在scsi硬碟上,或者使用LVM檔案系統,核心在加載根目錄之前要加載scsi硬碟或者lvm檔案系統的驅動。SCSI磁盤和LVM檔案系統的驅動都放在硬碟的/lib/modules/目錄中,核心沒有辦法識别scsi硬碟或者lvm檔案系統,Linux使用initramfs這個虛拟的檔案系統去處理問題。centos7.x中使用initramfs虛拟檔案系統,通過引導程式加載到記憶體中,然後會解壓并且在記憶體中仿真成一個根目錄,并且這個仿真的檔案系統能夠提供一個可執行程式,通過程式去加載啟動過程中所需要的子產品,比如SATA、SCSI磁盤驅動和LVM、RAID檔案系統的驅動。

通過 initramfs 虛拟檔案系統在記憶體中模拟出一個根目錄,然後在這個模拟根目錄中加載 SCSI 等硬體的驅動,就可以加載真正的根目錄了,之後才能調用 Linux 的第一個程序 /sbin/init或者是systemd程序,centos7中是systemd。

當所需要的驅動程式加載完成之後,會根據/boot/grub2/grub2.cfg配置檔案中的root=(hd0,gpt1)的部分所指定的内容建立一個根裝置,然後将根檔案系統以隻讀的方式挂載,并切換到真正的根檔案系統上,同時調用系統程序的/sbin/init程式或者是/usr/lib/systemd/systemd程式,進入系統初始化的階段。

在初始化的最後,核心運作initramfs中的init程式,該程式将探測硬體裝置、加載驅動,挂載真正的檔案系統,執行檔案系統上的/sbin/init或者systemd,進而切換到真正的使用者空間。真正的檔案系統挂載後,initramfs即完成了使命,其占用的記憶體也會被釋放。

initramfs是可以解壓的,使用skipcpio指令:

/usr/lib/dracut/skipcpio initramfs-$(uname -r).img | zcat| cpio -ivd

解壓之後可以看到init程序做了軟連結,軟連結到了/usr/lib/systemd/systemd。

Linux基礎知識之啟動流程分析

牡丹

鼓勵的話語:順境不飄,逆境不憂,絕境不慌。胸懷大志,當忍則忍。