1. 程式人生 > >CenOS/Fedora系統啟動的整個流程——符合多數linux系統

CenOS/Fedora系統啟動的整個流程——符合多數linux系統

管理程序 計算機 system 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系統