1. 程式人生 > >centOS 6啟動流程

centOS 6啟動流程

hid nod 檢測 line wpa -h trap 屬於 服務

centOS6啟動流程


  • centOS6啟動流程
    • linux內核組成
    • centos6啟動大致流程
    • 1.post加電自檢
    • 2.Boot Sequence
    • 3.MBR引導
    • 4.Grub啟動
      • 制作initramfs文件
      • grub.conf的參數
      • grub的功能
        • 提供啟動菜單、並提供交互式接口
        • 加載用戶選擇的內核或操作系統
        • 為菜單提供了保護機制
      • 安裝grub
        • grub-install命令
        • grub交互式
    • 5.啟動 init 進程
    • 6.登錄

我們平時使用linux系統,點擊電源鍵,電腦開機到我們輸入賬號密碼直接使用操作系統,其中經過了一列的步驟,那我們在輸入賬號密碼之前,我們的計算機都進行了什麽樣的操作呢,接下來我們來了解一下linux的啟動操作流程。

linux內核組成

Linux內核特點:
支持模塊化:.ko(內核對象)
如:文件系統,硬件驅動,網絡協議等
支持內核模塊的動態裝載和卸載

組成部分:
核心文件:/boot/vmlinuz-VERSION-release
ramdisk:輔助的偽根系統
CentOS 5: /boot/initrd-VERSION-release.img
CentOS 6,7: /boot/initramfs-VERSION-release.img
模塊文件:/lib/modules/VERSION-release

centos6啟動大致流程

技術分享

1.post加電自檢

POST(Power-On-Self-Test)加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、串並行接口、鍵盤、CD-ROM光驅等硬件情況的檢測。
BIOS(Basic Input and Output System)保存著有關計算機系統最重要的基本輸入輸出程序,系統信息設置、開機加電自檢程序和系統啟動自舉程序

等。
在加電自檢完成後,計算機就會找到引導記錄,由引導記錄繼續開機的進一步操作。

2.Boot Sequence

在計算機真正啟動之前,我們的計算機會先確定開機啟動項是什麽,這個一般在BIOS的boot裏面設定的,不同的版本的BIOS設定方式不一樣,但是效果都是一樣的。一般我們的電腦就是硬盤啟動。當計算機這一步執行後,就會找到硬盤中的讀取硬盤,先找到的就是0扇區,即前446字節。

3.MBR引導

MBR(Master Boot Record)MBR記錄一般是在磁盤0磁道0扇區,共512個字節。前446個字節是BootLoder,後 4*16 的 64 個字節是存放分區信息的,最後 2 個字節是校驗信息,一般是 55AA。在加電自檢後,就會開始這一部分的內容,從這裏開始才是真正的開機引導。
計算機不知道我們的系統在哪裏,所以需要程序進行引導,這個引導的程序就叫bootloader,不同操作系統的bootloader是不同的,windows使用的bootloader程序是ntloader,只能對windows進行引導不能對其他系統進行引導,而Linux的bootloader叫GRUB,可以對其他操作系統進行引導(包括windows),而MBR前446就屬於grub一部分。

4.Grub啟動

前面說到,MBR的446字節的東西就是grub的一部分忙也就是說,我們的計算機啟動磁盤後會找到grub,我們看看grub文件夾中的內容。
技術分享

grub程序主要是由device.map,menu.lst,stage1,stage2,以及一系列的stage1_5組成。
device.map:存放的是內核文件的根分區
menu.lis:是grub.conf的鏈接文件,但是這個名字我覺得更與它的功能接近,就是菜單列表。裏賣弄設置了可以選擇的內核菜單。存放於stage2中。
stage:用於grub引導程序過大,所以分2段引導,第一段存放在MBR中,第二段存放於內核文件系統中,第一段引導完成後可以找到第二段。 但是,第二段是存放於內核文件系統中的,此時還沒有格式化文件系統,如何可以訪問到第二段的 menu.lst 呢?就需要借助於中間層 stage1_5,有它來協助 stage1 段來訪問 stage2 段。stage1_5通常位於 stage1 字段後的 63 個扇區。 由於stage2 在內存中存放可以使用的文件系統不確定,所以這就是有多個 stage1_5 的原因了,因為stage1_5會找到偽根系統,偽根系統就像是一個小型的linux,裏面有相對用的文件系統,我們可以借助偽根系統來找到我們的真正系統采用的什麽文件系統。

技術分享
initramfs 是以 gzip 壓縮的cpio格式的文件。內核啟動時將他作為一個臨時的根文件系統。 grub 的 stage2 將initrd加載到內存裏,讓後將其中的內容釋放到內容中,內核便去執行init腳本,這時內核將控制權交給了init文件處理。 init它也主要是加載各種存儲介質相關的設備驅動程序。當所需的驅動程序加載完後,會創建一個根設備,然後將根文件系統rootfs以只讀的方式掛載。這一步結束後,釋放未使用的內存,轉換到真正的根文件系統上面去,同時運行/sbin/init程序,執行系統的1號進程。此後系統的控制權就全權交給/sbin/init進程了。

制作initramfs文件

有時候我們如果誤刪除或者其他原因導致initramfs這個文件丟失,我們可以通過命令將其找回,示範如下:

  • (1) mkinitrd命令
    為當前正在使用的內核重新制作ramdisk文件
    mkinitrd/boot/initramfs-$(uname-r).img $(uname-r)
  • (2) dracut命令
    為當前正在使用的內核重新制作ramdisk文件
    dracut/boot/initramfs-$(uname-r).img $(uname-r)
    推薦使用nkinitrd,具有更好的兼容性

技術分享

grub.conf的參數

技術分享

  • default默認啟動的內核title, 0 表示是第一個
  • timeout默認等待時間
  • splashimage=(hd0,0)/grub/splash.xpm.gz指定菜單的背景圖片的路徑。為xpm格式,采用gzip壓縮,只能為14bits色
  • hiddenmenu隱藏菜單
  • title標題名,用戶可自定義
  • root(hd0,0)指定 grub 的根位置

    (hd#,#)
        hd#: 磁盤編號,用數字表示;從0開始編號
        #: 分區編號,用數字表示; 從0開始編號
    (hd0,0) 第一塊硬盤,第一個分區
  • kernel指定 kernel 文件的位置,還要指出 root(系統啟動後) 的位置,掛載方式 ro,這項很關鍵。加載後會啟動 init 進程。

  • initrd 在內核啟動過程中裝載根文件系統時有用
  • password [--md5|--encrypted ] STRING: 啟動選定的內核或操作系統時進行認證

  • 生成grub口令
    grub-md5-crypt
    grub-crypt    
[[email protected] ~]#grub-md5-crypt

Password:

Retype password:

$1$s7uSV/$ktCJ6EIbW6ykjEGbN54cH1

cat /proc/cmdline 內核參數
內核參數文檔:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt

grub的功能

提供啟動菜單、並提供交互式接口

  • a:內核參數
  • e: 編輯模式,用於編輯菜單
  • c: 命令模式,交互式接口

技術分享

e: 編輯模式,用於編輯菜單
技術分享

  • b:重新啟動
  • e:編輯參數
  • 使用命令行交互式
  • o:在後面插入新行
  • O:在之前插入新行
  • d:返回上級菜單

c: 命令模式,交互式接口
技術分享
在此模式下,我們可以交互式的修改內核參數
grub的命令行接口

help: 獲取幫助列表
help KEYWORD: 詳細幫助信息
find (hd#,#)/PATH/TO/SOMEFILE:
root (hd#,#)

我們可以手動在grub命令行接口啟動系統

grub> root (hd#,#)

grub> kernel /vmlinuz-VERSION-RELEASE roroot=/dev/DEVICE

grub> initrd/initramfs-VERSION-RELEASE.img

grub> boot

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

  • 允許傳遞參數給內核
  • 可隱藏啟動菜單
    其中的一個應用就是我們可以以此進入單用戶模式,修改root密碼。

為菜單提供了保護機制

[[email protected] ~]#grub-md5-crypt

Password:

Retype password:

$1$s7uSV/$ktCJ6EIbW6ykjEGbN54cH1

我們將產生的密碼加到grub.conf中去:
技術分享

然後重新啟動一下模式,我們看一下效果:
技術分享
加入 grub.conf 文件的位置不同,加密效果也不一樣。

  • 加入到 title 之前的話,會加密整個菜單。
  • 加入到 title 指內的話,會加密對應的操作系統的入口。

進入救援模式(光盤啟動),然後直接刪除root密碼(/etc/passwd下的),空口令直接登錄

安裝grub

grub-install命令

安裝grub stage1和stage1_5到/dev/DISK磁盤上,並復制GRUB相關文件到DIR/boot目錄下
grub-install --root-directory=DIR /dev/DISK
我們來一個簡單的實驗:
技術分享

第一步刪除/boot
技術分享
第二步安裝內核
rpm -ivh /mnt/cdrom/Packages/kernel-2.6.32-696.el6.x86_64.rpm --force
技術分享
第三步安裝grub
技術分享
第四步配置grub.conf

[[email protected] grub]#vim grub.conf

default=0

timeout=10

title centOS 6(duzhaoqi 6.9)

root (hd0,0)

kernel /vmlinuz-2.6.32-696.el6.x86_64 root=UUID=51be13b4-c669-480a-82bb-efb9337f9c38

initrd /initramfs-2.6.32-696.el6.x86_64.img

第五步重啟
技術分享

grub交互式

grub> root (hd#,#)
grub> setup (hd#)
技術分享

5.啟動 init 進程

init 進程是系統啟動的第一個進程。其他進程都是有此進程控制fork出來的,也就是說,init是其他進程的“祖先”,PID=1。當然,PID=0進程我們稱為空閑進程是屬於內核的。
init作用:

初始運行級別(RUN LEVEL)
系統初始化腳本
對應運行級別的腳本目錄
捕獲某個關鍵字順序
定義UPS電源終端/恢復腳本
在虛擬控制臺生成getty
在運行級別x初始化X

切換級別:init #
查看級別:runlevel; who -r

在centOS5 和centOS6上都有init程序,但是已經不是一個東西了,我們來查看一下:
技術分享

技術分享

技術分享

init進程啟動以後,接下來的工作是讀取配置和啟動服務
1. 讀取配置文件/etc/inittab /etc/init/*.conf
因為在centOS6中inittab文件中就留下了一行啟動級別,其他東西放到了/etc/init/*.conf,所以我們以centOS5的inittab為例講解內容都是一樣的。

#

# inittab This file describes how the INIT process should set up

# the system in a certain run-level.

#

# Author: Miquel van Smoorenburg, <[email protected]nl.mugnet.org>

# Modified for RHS Linux by Marc Ewing and Donnie Barnes

#

# Default runlevel. The runlevels used by RHS 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:

# System initialization.

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

# Trap CTRL-ALT-DELETE

ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes

# of power left. Schedule a shutdown for 2 minutes from now.

# This does, of course, assume you have powerd installed and your

# UPS connected and working correctly.

pf::powerfail:/sbin/shutdown -f -h +2"Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.

pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

# Run gettys in standard runlevels

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

# Run xdm in runlevel 5

x:5:respawn:/etc/X11/prefdm -nodaemon

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

id:runlevel:action:process
action:
    wait: 切換至此級別運行一次
    respawn:此process終止,就重新啟動之
    initdefault:設定默認運行級別;process省略
    sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit
si::sysinit:/etc/rc.d/rc.sysinit

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

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

前面的10就是一格標識,沒有啥作用,在上面一行中,我們有七種啟動級別,啟動不同的啟動級別,就會調用不同的腳本,這個就會調用/etc/rc0.d/中的腳本,啟動相對用的進程或服務

1:2345:respawn:/sbin/mingetty tty1

這就是我們的終端設置,我們可以看到,一共有六個終端,當然,我們也可以手動添加。

6.登錄

當配置文件讀取完成後,就會給我們顯示一個登錄窗口,我們就可以通過這個登錄窗口登陸上操作系統,進行我們所需要的操作。

centOS 6啟動流程