centOS 6啟動流程
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段引導,第一段存放在MB
R中,第二段存放於內核文件系統中,第一段引導完成後可以找到第二段。 但是,第二段是存放於內核文件系統中的,此時還沒有格式化文件系統,如何可以訪問到第二段的 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啟動流程