CenOS/Fedora系統啟動的整個流程——符合多數linux系統
本文主要講述CenOS系統啟動的整個流程,同系列系統也基本相符,不同系列Linux也差不多。
對於CentOS系統來說,整個啟動過程可分為4個階段,分別是:
加點自檢;
加載MBR;
加載內核並執行初始化信息;
初始化用戶空間。
下面就具體來描述每個過程都做了什麽。
加電自檢(power on system test,POST)
任何一種操作系統的啟動,第一步必定是加電自檢, 主要功能是裝載在硬件芯片CMOS之上的BIOS(Basic Input Output System)來實現,這個程序CMOS會根據CMOS上的配置信息去檢測當前計算機是否具有啟動系統的基本硬件能力,比如CPU,內存是否正常等等。
選擇啟動順序,加載MBR(Master Boot Record,MBR)
完成BIOS初始化之後,BIOS會列出一些可以 啟動的裝置順序,然後根據這個順序去找對應的內核文件。但是由於不同系統的文件系統系統可能會不同,所以就有了一個叫做啟動管理程序,來處理文件系統不同 這些問題,而這個程序就叫做Booot Loader,它位於可以啟動的第一塊硬盤的MBR(Master Boot Record)中。MBR則是位於可以啟動的硬盤的第一個扇區之內,Boot Loader還要完成操作系統的識別,加載核心文件的功能,當用戶安裝多個系統以後,還會提供一個讓用戶選擇要啟動的操作系統的菜單。因此當MBR被破壞 以後,Boot Loader也會收到影響,進而就會導致無法啟動系統。
加載內核Kernel,並執行系統初始化信息
當Boot Loader讀取操作系統內核文件後,接下來就會將內核文件解壓後裝載到內存之中,並依據內核所提供的功能去測試設備。此時,內核程序還沒加載到磁盤,也就是說此時系統還沒有磁盤的驅動能力,那又如何加載位於磁盤上的內核文件呢?
Linux采用了一種叫做虛擬文件系統 (Initial RAM DISK)來解決這個問題,它的主要功能是:通過Boot Loader程序加載到內存中,然後這個文件就會被解壓展開到模擬的根文件系統中,這個根文件系統能提供一個可運行的程序,通過這個程序加載核心的模塊, 完成之後,釋放虛擬的文件系統,並掛載真實的根文件系統,完成根切換,之後就能執行正常的啟動過程。
啟動用戶空間的第一個程序,初始化用戶空間
1.完成以上三步之後,內核會呼叫用戶空間的第一個程序:/sbin/init,這個程序會完成一系列的初始化操作,包括主機名設定,網絡配置等操作,所有的這些操作都是在init的配置文件中定義的。因此init配置文件就至關重要。
對於CentOS5:其采用的是SysV init方式,通過腳本啟動服務,有依賴關系的服務就會被串行啟動,配置文件為/etc/inittab
對於CentOS6:采用Upstart方式進行,進程間的通信通過D-Bus進行,可以基本實現類似並行啟動,配置文件為/etc/inittab,/etc/init/*.conf
對於CentOS7:采用了全新的Systemd方式,其特點是只有在服務第一次被啟動才會真正啟動,其配置文件為/usr/lib/systemd/*
2.init配置文件
在init配置文件中,尤為重要的一項是設置系統的默認運行級別,而在Linux之上,運行級別0-6七種級別,分別是:
0:關閉所有服務,然後關機
1:維護模式,也叫單用戶模式,允許root用戶可以不用密碼直接登錄系統
2:維護模式,也叫多用戶模式,需要認證,會啟動網絡
3:正常級別,完全多用戶模式,提供文本界面
4:預留級別,暫未使用
5:正常級別:完全多用戶級別,提供圖形節界面
6:關閉所有服務,重新啟動
常看運行級別的方法:runlevel 或者 who -r
切換運行級別的方法:init run_level
在CentOS6中,/etc/inittab文件內容是:
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. 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)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
id
:3:initdefault:
因此init的整個處理流程為:
1.通過讀取/etc/inittab文件來設定運行級別
2.使用/etc/rc.d/rc.sysinit來初始化系統
3.執行3級別下所設定的操作,並忽略其他級別設定的配置
從上面可以看到,初始化系統是根據/etc/rc.d/rc.sysinit進行的,這個腳本的主要的任務是:
1.根據/etc/sysconfig/network文件來設定主機名
2.打印文本歡迎信息
3.激活SELinux和udev
4.掛載/etc/fatab中定義的文件系統
5.激活swap設備
6.檢測根文件系統
7.設置系統時鐘
8.根據/etc/sysctl.conf文件來設定內核參數
9.激活LVM和RAID
10.加載驅動程序
11.清理操作
當內核設定運行級別以後,就要去完成對應級別下的操作,而這些級別對應下的任務是/etc/rc.$runlevle.d
/下的操作,不同級別下這些腳本被成為服務腳本,這些腳本決定如何開啟或關閉服務,而具體的方式則是系統通過傳遞S參數來啟動服務,傳遞K來關閉服務;這些服務腳本的定義規範為:
(1)至少接受四個參數:
start:啟動服務
restart:重啟服務
stop:停止服務
status:查看服務運行狀態
(2)腳本的開頭
#chkconfig :start_level start_prio stop_prio
#description:description information
這些腳本可以通過/etc/init.d/script_name {start|stop|status|restart}調用,也可以通過service script_name {start|stop|status|restart}調用
GRUB(GRand Unified Bootloader)
1.在系統啟動過程中,Boot Loader至關重要,然而Boot Loader處於MBR當中,MBR的大小是512bytes,只有其中的446bytes是用來存放Boot Loader的,為了解決存放Boot Loader的位置空間的大小問題,Linux將Boot Loader的程序分成三個階段來運行,在Linux上,grub是使用最廣泛的啟動加載器:
stage1:
執行Boot Loader主程序,這必須安裝在MBR中,而且沒有安放Boot Loader相關的配置文件
stage1_5:
在MBR隨後的分區存放,主要用於與stage2所在的文件系統進行交互
stage2:
通過Boot Loader加載所有配置文件及其相關的參數信息,而這些信息全都存放於/boot目錄之下,這些配置文件主要包括:
device.map:定義grub的安裝位置
e2fs_stage1_5:ext2文件系統定義
fat_stage1_5:fat文件系統定義
ffs_stage1_5:文件系統定義
grub.conf:grub的配置文件
iso9660_stage1_5:光驅的定義
jfs_stage1_5:jfs文件系統發的定義
menu.lst:鏈接文件
minix_stage1_5:文件系統的定義
reiserfs_stage1_5:reiser文件系統的定義
splash.xpm.gz:背景圖片
stage1:stage1相關的信息
stage2:stage2相關的信息
ufs2_stage1_5:ufs文件系統的定義
vstafs_stage1_5:vfs文件系統的定義
xfs_stage1_5:xfs文件系統的定義
2.Linux一切皆文件,對grub的配置也不例外,其配置文件為/etc/grub.conf
(1)設置grub的方法一,直接修改其配置文件
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/sda3
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0 #設定默認要啟動的內核
timeout=5 #設定可供用戶選擇的超時時長
splashimage=(hd0,0)/grub/splash.xpm.gz #定義背景圖片
hiddenmenu #隱藏選擇菜單
title CentOS (2.6.32-431.el6.x86_64) #設定操作系統的名稱
root (hd0,0) #設定要啟動的內核所在的位置
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=908a3c89-4592-4dc4-8dc2-b5261f7c0e83 rd_NO_LUKS rd_NO_LVM.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-431.el6.x86_64.img #設定輔助內核引導的ramdisk文件的位置
(2)通過命令行接口
進入grub命令行,可以在啟動時根據提示的信息進入,在對應的title輸入c就能進入,
常用的grub命令有:
help:獲取幫助信息
find:查找文件
root:設定要啟動的內核所在的位置
kernel:設置內核文件路徑
initrd:設定ramdisk的位置
Grub應用實例
為運行於虛擬機上的CentOS 6添加一塊新硬件,提供兩個主分區;
(1) 為硬盤新建兩個主分區;並為其安裝grub;
(2) 為硬盤的第一個主分區提供內核和ramdisk文件; 為第二個分區提供rootfs;
(3) 為rootfs提供bash、ls、cat程序及所依賴的庫文件;
(4) 為grub提供配置文件;
(5) 將新的硬盤設置為第一啟動項並能夠正常啟動目標主機;
具體過程為:
(1)創建分區,結果為
(2)格式化分區:
(3)創建目錄
(4)掛載
(5使用grub-install安裝grub
(6)提供內核文件和ramdisk文件
(7)為rootfs提供bash,ls,cat程序
復制庫文件:
(8)為grub提供配置文件
至此,制作完成。
CenOS/Fedora系統啟動的整個流程——符合多數linux系統