天天看點

Linux-系統啟動流程相關

作者:不寐旋律

1 CentOS 6 的啟動管理

1.1 Linux 組成

Linux-系統啟動流程相關

Linux作業系統由核心(kernel)、系統工具和應用程式組成;核心是作業系統的核心,負責管理硬體資源和提供系統調用接口;系統工具包括啟動加載器、檔案系統、網絡管理等;應用程式則是使用者使用的各種軟體。

  • kernel :實作程序管理、記憶體管理、網絡管理、驅動程式、檔案系統、安全功能等功能
  • rootfs :包括程式和 glibc 庫(程式:二進制執行檔案;庫:函數集合, function, 調用接口(頭檔案負責描述))

1.2 核心設計流派

  • 宏核心(Monolithic Kernel)是一種将作業系統的核心功能和服務集中在一個單一的核心中的設計。宏核心将作業系統的各個元件(如檔案系統、裝置驅動程式、網絡協定棧等)直接內建在核心中。這意味着所有的系統調用和服務都在核心空間中執行,程序之間的通信也是通過核心來完成。
  • 微核心(Micro Kernel)則采用了一種更為子產品化的設計方式。微核心将作業系統的核心功能限制在最小的範圍内,隻包括基本的排程、程序管理和記憶體管理等功能。其他的服務和功能,如檔案系統、裝置驅動程式和網絡協定棧等,則被實作為使用者空間的服務,通過程序間通信(IPC)與核心進行互動。
Linux-系統啟動流程相關

宏核心:

  • 優點:性能較高,因為所有的系統調用和服務都在核心空間中執行,無需進行使用者空間和核心空間之間的切換。
  • 缺點:是核心的規模較大,容易導緻代碼複雜性和可維護性的問題。

微核心:

  • 優點:子產品化和可擴充性,因為各個服務和功能被實作為獨立的使用者空間程序,可以獨立地進行開發、測試和維護。此外,微核心的設計也更加靈活,可以根據需求動态加載和解除安裝服務。
  • 缺點:程序間通信的開銷,性能可能相對較低。

1.3 CentOS 6啟動流程

1.3.1 CentOS 6 啟動流程

Linux-系統啟動流程相關

1. 通過加載BIOS的硬體資訊,擷取第一個啟動裝置

2. 讀取第一個啟動裝置MBR的引導加載程式(GURB)的啟動資訊

3. 加載核心作業系統的核心資訊,核心開始解壓縮,并嘗試驅動所有的硬體裝置

4. 核心執行init程式,并擷取預設的運作資訊

5. init程式執行/etc/rc.d/rc.sysinit檔案,重新挂載根檔案系統

6. 啟動核心的外挂子產品

7. init執行運作的各個批處理檔案(scripts)

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

9. 執行/bin/login程式,等待使用者登入

10. 登入之後開始以Shell控制主機

1.3.1 硬體啟動POST

  • POST:Power-On-Self-Test,加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主機闆、記憶體、硬碟子系統、顯示子系統、串并行接口、鍵盤等硬體情況的檢測。
  • 主機闆的ROM:BIOS,Basic Input and Output System,儲存着有關計算機系統最重要的基本輸入輸出程式,系統資訊設定、開機加電自檢程式和系統啟動自舉程式等。
  • 主機闆的RAM:CMOS互補金屬氧化物半導體,儲存各項參數的設定,按次序查找引導裝置,第一個有引導程式的裝置為本次啟動裝置。
Linux-系統啟動流程相關

1.3.2 啟動加載器 bootloader

1.3.2.1 grub 功能群組成

bootloader: 引導加載器,引導程式

  • windows: ntloader,僅是啟動OS
  • Linux:功能豐富,提供菜單,允許使用者選擇要啟動系統或不同的核心版本;把使用者標明的核心裝載到記憶體中的特定空間中,解壓、展開,并把系統控制權移交給核心

Linux的bootloader

  • LILO:LInux LOader,早期的bootloader,功能單一
  • GRUB: GRand Unified Bootloader, CentOS 5,6 GRUB 0.97: GRUB Legacy, CentOS 7 以後使用GRUB 2.02

GRUB 啟動階段

  • primary boot loader :

1st stage:MBR的前446個位元組

1.5 stage: mbr 之後的扇區,讓stage1中的bootloader能識别stage2所在的分區上的檔案系統

  • secondary boot loader :2nd stage,分區檔案/boot/grub/

1.3.2.2 CentOS 6 grub 安裝

安裝 grub的兩種方法:

1、grub-install 安裝grub stage1和stage1_5到/dev/DISK磁盤上,并複制GRUB相關檔案到 DIR/boot目錄下

grub-install --root-directory=DIR /dev/DISK           

2、grub指令

#grub
grub> root (hd#,#)
grub> setup (hd#)           

1.3.2.3 grub legacy 管理

配置檔案:/boot/grub/grub.conf <-- /etc/grub.conf

stage2及核心等通常放置于一個基本磁盤分區

grub legacy 功用:

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

  • a:核心參數
  • e:編輯模式,用于編輯菜單
  • c:指令模式,互動式接口

(2) 加載使用者選擇的核心或作業系統

  • 允許傳遞參數給核心
  • 可隐藏啟動菜單

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

  • 為編輯啟動菜單進行認證
  • 為啟用核心或作業系統進行認證
Linux-系統啟動流程相關

grub的指令行接口

help: 擷取幫助清單
help KEYWORD: 詳細幫助資訊
find (hd#,#)/PATH/TO/SOMEFILE:
root (hd#,#)
kernel /PATH/TO/KERNEL_FILE: 設定本次啟動的核心檔案;額外還可添加許多核心支援使用的
cmdline參數
例如:max_loop=100 selinux=0 init=/path/to/init
initrd /PATH/TO/INITRAMFS_FILE: 設定為標明的核心提供額外檔案的ramdisk
boot: 引導啟動標明的核心           

cat /proc/cmdline 核心參數

核心參數文檔:

/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt           

grub legacy識别硬碟裝置

(hd#,#)
hd#: 磁盤編号,用數字表示;從0開始編号
#: 分區編号,用數字表示; 從0開始編号
示例:
(hd0,0) 第一塊硬碟,第一個分區           

手動在grub指令行接口啟動系統

grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot           

grub legacy配置檔案:/boot/grub/grub.conf

default=#: #設定預設啟動的菜單項;落單項(title)編号從0開始
timeout=#: #指定菜單項等待選項選擇的時長
splashimage=(hd#,#)/PATH/XPM_FILE:#菜單背景圖檔檔案路徑
password [--md5| --encrypt] STRING: #啟動菜單編輯認證
hiddenmenu:#隐藏菜單
title TITLE:#定義菜單項“标題”, 可出現多次
root (hd#,#):#查找stage2及kernel檔案所在裝置分區;為grub的根
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:#啟動的核心
initrd /PATH/TO/INITRAMFS_FILE: #核心比對的ramfs檔案
password [--md5|--encrypted ] STRING: #啟動標明的核心或作業系統時進行認證           

grub加密生成grub密碼

grub-md5-crypt
grub-crypt           

破解root密碼:

(1) 編輯grub菜單(標明要編輯的title,而後使用a 或 e 指令)
(2) 在標明的kernel後附加1, s, S,single 都可以進入單使用者模式
(3) 在kernel所在行,鍵入“b”指令           
Linux-系統啟動流程相關

案例:給grub 添加密碼,防止破解root密碼

[root@centos6 ~]#grub-crypt
Password:
Retype password:
$6$RedtvBe0D0sM8yKq$yKwmmnHSDb9wDRUuZbC3H1ZNwIlf/Mh88MXa3JzXloXyy0hXIxFwLIoMdgmYFfkWXxkP.vW3ypIla4P5zUKuT.
 
[root@centos6 ~]#vim /boot/grub/grub.conf
default=0
timeout=5
password --encrypt
$6$RedtvBe0D0sM8yKq$yKwmmnHSDb9wDRUuZbC3H1ZNwIlf/Mh88MXa3JzXloXyy0hXIxFwLIoMdgmYFfkWXxkP.vW3ypIla4P5zUKuT.
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS 6 (2.6.32-754.el6.x86_64)           

案例:生成grub啟動背景圖檔

[root@centos6 ~]#convert -resize 640x480 -colors 14 winner.png splash.xpm
[root@centos6 ~]#more splash.xpm
#生成splash.xpm.gz
[root@centos6 ~]#gzip splash.xpm
[root@centos6 ~]#mv splash.xpm.gz /boot/grub           

1.3.3 kernel的加載

Linux-系統啟動流程相關

kernel 自身初始化過程:

  • 1 啟動加載器加載核心:啟動加載器(如grub)負責加載核心鏡像到記憶體中。在這個階段,啟動加載器會解析核心鏡像的檔案系統,并将核心加載到指定的記憶體位址。
  • 2 核心引導和初始化:一旦核心被加載到記憶體中,啟動加載器會将控制權轉交給核心。核心開始執行引導代碼,進行一系列的初始化操作,包括設定基本的系統參數、初始化記憶體管理、建立頁表、初始化中斷處理等。
  • 3 裝置初始化和驅動加載:在核心初始化的過程中,核心會掃描系統中的硬體裝置,并加載相應的裝置驅動程式。這些裝置驅動程式負責與硬體裝置進行通信和管理,使得作業系統能夠與硬體進行互動。
  • 4 啟動系統服務和使用者空間初始化:一旦裝置初始化和驅動加載完成,核心會啟動各種系統服務,如網絡服務、檔案系統服務等。同時,核心會啟動init程序,init程序是使用者空間的第一個程序,負責初始化使用者空間環境,加載使用者空間的各種程序和服務。

Linux核心特點:

  • 支援子產品化:.ko(核心對象),如:檔案系統,硬體驅動,網絡協定等
  • 支援核心子產品的動态裝載和解除安裝

核心組成部分:

  • 核心檔案:/boot/vmlinuz-VERSION-release

ramdisk:輔助的僞根系統,加載相應的硬體驅動,ramdisk --> ramfs 提高速度

CentOS 5 /boot/initrd-VERSION-release.img

CentOS 6 以後版本 /boot/initramfs-VERSION-release.img

  • 子產品檔案:/lib/modules/VERSION-release

案例:誤删除核心檔案/boot/vmlinuz-2.6.32-754.el6.x86_64無法啟動,故障恢複

[root@centos6 ~]#rm -f /boot/vmlinuz-2.6.32-754.el6.x86_64
[root@centos6 ~]#reboot
#進入rescue模式
#chroot /mnt/sysimage
#mount /dev/sr0 /mnt/
#cp /mnt/isolinux/vmlinuz /boot/vmlinuz-2.6.32-754.el6.x86_64
#sync
#exit
#reboot           

ramdisk檔案的制作:

  • mkinitrd指令
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)           
  • dracut指令
dracut /boot/initramfs-$(uname -r).img $(uname -r)           

案例:誤删除/boot/initramfs-2.6.32-754.el6.x86_64.img無法啟動,故障恢複

[root@centos6 ~]#rm -f /boot/initramfs-2.6.32-754.el6.x86_64.img
[root@centos6 ~]#reboot
#進入rescue模式
#chroot /mnt/sysimage
#mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
#sync
#exit
#exit
#reboot           

1.3.4 init初始化

Linux-系統啟動流程相關
POST --> BootSequence (BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(隻讀) -->init(systemd)

init程式的類型:

  • SysV: init, CentOS 5之前

配置檔案:/etc/inittab

  • Upstart: init,CentOS 6

配置檔案:/etc/inittab, /etc/init/*.conf

  • Systemd:systemd, CentOS 7

配置檔案:/usr/lib/systemd/system、

/etc/systemd/system

1.3.4.1 運作級别

運作級别:為系統運作或維護等目的而設定;0-6:7個級别,一般使用3, 5作為預設級别

0:關機
1:單使用者模式(root自動登入), single, 維護模式
2:多使用者模式,啟動網絡功能,但不會啟動NFS;維護模式
3:多使用者模式,正常模式;文本界面
4:預留級别;可同3級别
5:多使用者模式,正常模式;圖形界面
6:重新開機           

切換級别:

init #           

檢視級别:

runlevel
who -r           

定義運作級别

/etc/inittab           

CentOS 5 的inittab檔案還定義以下内容

初始運作級别(RUN LEVEL)
系統初始化腳本
對應運作級别的腳本目錄
捕獲某個關鍵字順序
定義UPS電源終端/恢複腳本
在虛拟控制台生成getty
在運作級别5初始化X           

CentOS 5 的inittab檔案每一行格式:

id:runlevel:action:process
id:是惟一辨別該項的字元序列
runlevels: 定義了操作所使用的運作級别
action: 指定了要執行的特定操作
wait: 切換至此級别運作一次
respawn:此process終止,就重新啟動之
initdefault:設定預設運作級别;process省略
sysinit:設定系統初始化方式
process:定義了要執行的程序           

案例:CentOS 5 的inittab檔案

id:5:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down”
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled”
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
x:5:respawn:/etc/X11/prefdm -nodaemon           

CentOS 6 /etc/inittab和相關檔案

CentOS 6 init程式為 upstart, 其配置檔案/etc/inittab, /etc/init/*.conf,配置檔案的文法 遵循 upstart配置檔案文法格式,和CentOS5不同

/etc/inittab 設定系統預設的運作級别
/etc/init/control-alt-delete.conf
/etc/init/tty.conf
/etc/init/start-ttys.conf
/etc/init/rc.conf
/etc/init/prefdm.conf           

1.3.4.2 初始化腳本 sysinit

/etc/rc.d/rc.sysinit

[root@centos6 ~]#cat /etc/init/rcS.conf           

系統初始化腳本功能

(1) 設定主機名
(2) 設定歡迎資訊
(3) 激活udev和selinux
(4) 挂載/etc/fstab檔案中定義的檔案系統
(5) 檢測根檔案系統,并以讀寫方式重新挂載根檔案系統
(6) 設定系統時鐘
(7) 激活swap裝置
(8) 根據/etc/sysctl.conf檔案設定核心參數
(9) 激活lvm及software raid裝置
(10)加載額外裝置的驅動程式
(11)清理操作           

1.3.4.3 服務管理

[root@centos6 ~]#cat /etc/init/rc.conf
# rc - System V runlevel compatibility
#
# This task runs the old sysv-rc runlevel scripts. It
# is usually started by the telinit compatibility wrapper.
#
# Do not edit this file directly. If you want to change the behaviour,
# please create a file rc.override and put your changes there.
start on runlevel [0123456]
stop on runlevel [!$RUNLEVEL]
task
export RUNLEVEL
console output
exec /etc/rc.d/rc $RUNLEVEL           

service 指令:手動管理服務

service 服務 start|stop|restart
service --status-all           

/etc/rc.d/rc 控制服務腳本的開機自動運作

for srv in /etc/rc.d/rcN.d/K*; do
$srv stop
done
for srv in /etc/rc.d/rcN.d/S*; do
$srv start
done           

說明:rc N --> 意味着讀取/etc/rc.d/rcN.d/

  • K: K##:##運作次序;數字越小,越先運作;數字越小的服務,通常為依賴到别的服務
  • S: S##:##運作次序;數字越小,越先運作;數字越小的服務,通常為被依賴到的服務

配置服務開機啟動

  • chkconfig指令
  • ntsysv指令

chkconfig 指令管理服務

#檢視服務在所有級别的啟動或關閉設定情形:
chkconfig [--list] [name]

#添加服務
SysV的服務腳本放置于/etc/rc.d/init.d (/etc/init.d)
#!/bin/bash
chkconfig: LLLL nn nn #LLLL 表示初始在哪個級别下啟動,-表示都不啟動
description : 描述資訊
chkconfig --add name

#删除服務
chkconfig --del name

#修改指定的運作級别
chkconfig [--level levels] name <on|off|reset>
說明:--level LLLL: 指定要設定的級别;省略時表示2345           

1.3.4.4 非獨立服務

服務分為獨立服務和非獨立服務

瞬态(Transient)服務被超級守護程序 xinetd 程序所管理,也稱為非獨立服務

進入的請求首先被xinetd代理

配置檔案:

/etc/xinetd.conf
/etc/xinetd.d/<service>           

用chkconfig控制非獨立服務開機啟動

示例:

chkconfig tftp on           

1.3.4.5 開機啟動檔案 rc.local

/etc/rc.d/rc.local           

注意:正常級别下,最後啟動一個服務S99local沒有連結至/etc/rc.d/init.d一個服務腳本,而是指向了/etc/rc.d/rc.local腳本

不便或不需寫為服務腳本放置于/etc/rc.d/init.d/目錄,且又想開機時自動運作的指令,可直接放置于/etc/rc.d/rc.local檔案中

/etc/rc.d/rc.local在指定運作級别腳本後運作

1.3.5 CentOS 啟動過程總結

參考該圖:http://s4.51cto.com/wyfs02/M02/87/20/wKiom1fVBELjXsvaAAUkuL83t2Q304.jpg
Linux-系統啟動流程相關

1.3.6 Centos 6、7、8啟動流程的差別

  1. 啟動加載器:CentOS 6使用的是grub(GRand Unified Bootloader)Legacy版本,而CentOS 7和CentOS 8使用的是grub2;grub2相比于grub Legacy版本有更多的功能和改進。
  2. systemd:CentOS 7和CentOS 8引入了systemd作為系統初始化和服務管理的主要工具。systemd取代了CentOS 6中使用的SysV init系統;systemd提供了更快的啟動速度、并行啟動服務、更好的日志記錄和管理等功能。
  3. Target Units:CentOS 7和CentOS 8使用了Target Units的概念,取代了CentOS 6中的Runlevels。Target Units是一組預定義的系統狀态,每個狀态都有一組相關的服務;這種方式更加靈活,可以根據需要選擇不同的Target Units。
  4. 核心版本:CentOS 6使用的是2.6.x系列的核心,而CentOS 7和CentOS 8使用的是3.x系列的核心;新的核心版本帶來了更多的功能和性能改進。
  5. SELinux:CentOS 7和CentOS 8中的SELinux(Security-Enhanced Linux)預設啟用,并且有更強大的安全功能;在CentOS 6中,SELinux預設是禁用的。
Linux-系統啟動流程相關

繼續閱讀