在講linux系統啟動流程之前,來講講linux的組成,這樣能能幫助我們深入了解系統的啟動流程,廢話不多說直接上系統啟動流程圖
linux組成
linux:kernel+rootfs
kenrel的作用:進程管理、內存管理、網絡管理、驅動程序、文件系統、安全管理等
rootfs:程序和glibc
庫:函數結合,function,調用接口(頭文件負責傳輸)
過程調用:procedure,無返回值
函數調用:function
程序:二進制執行文件
內核設計流派
單內核:把所有功能集成與一個程序
如:linux
微內核:每種功能使用一個單獨的子系統實現
如:windows,Solaris
內核
linux內核特點
支持模塊化:.ko(內核對象)
如:文件系統,硬件驅動,網絡協議等,支持內核模塊的動態加載和卸載
組成部分
核心文件/boot/vmlinuz-VERSION-release
ramdisk:輔助的偽根系統
CentOS5:/boot/initrf-VERSION-release.img
CentOS6.7:/boot/initramfs-VERSION-release.img
模塊文件:/lib/modules/VERSION-release
CentOS6的啟動流程
加載BIOS的硬件信息,獲取第一個啟動設備
讀取第一個啟動設備MBR的陰引導載程序grub的啟動信息
加載核心操作系統的黑信息,核心開始解壓縮,并嘗試驅動硬件設備
核心執行init程序并獲取運行信息
INIT執行/etc/rc.d/rc.sysinit文件
啟動核心的外掛模塊(/etc/modprobe.conf)
INIT執行各個批處理文件
INIt執行/etc/rc.d/rc.local
執行/bin/login程序,等待用戶登錄
登錄之后打開開始以shell控制主機
系統整體的啟動流程可以分為以下幾個過程
1、 加電自檢:power on system test(POST)
自檢主要檢測一下硬件設備是否存在并能正常運行,如:CPU,內存,硬盤是否存在并能正常運行;CPU風扇是否能夠正常運轉散熱;以及一些外圍的輸入輸出設備是否存在。有些設備存在與否都不影響系統地正常啟動,如鼠標,鍵盤等
這些自檢的功能是由一個軟件程序來實現的,這個軟件程序叫做:BIOS(Basic Inout Output System)它裝載與一個硬件芯片CMOS之上,加電過程是給CMOS通電,然后啟動其上的BIOS程序,BIOS根據CMOS上的信息讀取其他硬件信息并檢測是否存在并能正常運行,之后進行硬件設備的初始化
2、 選擇啟動 順序,加載MBR
硬件設備初始化之后,BIOS會列出一些可以啟動的裝置順序,讀取第一個啟動設備中操作系統的核心文件,而這個核心文件是由Boot Loader(引導加載器)的管理程序來管理的,Boot Loader主要去識別、加載操作系統中的核心文件,并提交到內存中運行,進而來啟動操作系統
3、 加載系統內核kernel,執行系統初始化信息
在Boot Loader開始讀取操作系統內核文件后,接下來就會將內核文件解壓縮后裝載到內存當中,內核文件通常存放在/boot目錄下有一個vmlinuz打頭的文件,但是此時內核程序還沒有加載到磁盤,是不能讀取系統上的內核文件的,linux中采用了一種叫虛擬文件系統,它跟內核文件放在同一個目錄下名為init打頭的文件,接下來Boot Loader程序將其加載到內存中,虛擬文件系統被解壓縮并且放入內存模擬一個根文件系統,它會提供一個程序,可以加載啟動過程中所需要的核心模塊,加載完成,會協助內核呼叫/sbin/init來執行后續的正常啟動。
4、 啟動用戶空間第一個執行程序/sbin/init
在內核、硬件及驅動信息加載完畢后,內核會呼叫用戶空間的第一個執行程序/sbin/init,init程序主要功能時準備軟件運行環境,包括系統的主機名,網絡配置,文件系統格式等其他服務的啟動管理,而這些所有的操作都是通過init的配置文件來定義。
init程序的類型
Sysv:init,Centos5之前
配置文件/etc/inittab
Upstart:init,CentOS6
配置文件:/etc/inittab, /etc/init/*.conf
Systemd:systemd,CentOS 7
配置文件:/usr/lib/system/system
/etc/system/system
ramdisk
內核中的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問
ramdisk–>ramfs提高速度
CentOS5:initrd,工具程序:mkinitrd
CentOS6:initramfs,工具程序:mkinitrd,dracut
系統初始化
POST–>BootSequence(BIOS)–>Bootloader(MBR)–>kenel(ramdisk)–>rootfs(只讀)–>init(systemd)
運行級別
為系統運行或維護等目的而設定 0-6,共7個級別
0:halt關機
1:single user mode 直接以管理員的身份切入
2:multi user mode,no NFS多用戶模式,啟動網絡功能,但不會啟動NFS,維護模式
3:multi user mod ,text mode,正常模式,文本界面
4:reserved 預留級別,同三級別一樣
5:multi user mode graphic mode,多用戶模式,正常模式,圖形界面
6:reboot 重啟
默認級別:3,5
切換級別:init #
查看級別:runlevel; who -r
init初始化
init讀取其初始化文件/etc/inittab
inittab完成如下任務
1、設定默認運行界別
2、運行系統初始化腳本
3、運行指定級別目錄下的腳本
4、ctrlaltdel組合件操作
5、定義UPS電源在電源故障/恢復時的操作
6、啟動虛擬終端(2345級別)
7、啟動圖形終端(5級別)
CentOS5的inittab文件
每一行定義一種action以及與之對應的process
#
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Author: Miquel van Smoorenburg, <miquels@drinkel.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:3: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發
id:runlevels:action:process 設定默認運行級別
id:標識
runlevel:在那個級別運行慈航
action在什么情況下執行慈航
process:要運行的程序
si::sysinit:/etc/rc.d/rc.sysinit 系統初始化腳本
action
initdefault:設定默認運行幾倍
sysinit:系統初始化
wait:等待級別奇幻至此級別時執行
respawn:一旦程序終止,會重新啟動
/etc/rc.d/rc.sysinit 系統初始化
該腳本完成如下工作
1. 激活udev和selinux
2. 根據/etc/sysctl.conf文件來設定內核參數
3. 設定始終
4. 裝載鍵盤映射
5. 啟用交換分區
6. 設置主機名
7. 根文件系統檢測,并以讀寫方重新掛載
8. 激活RAID和lvm設備
9. 啟用磁盤配額
10. 根據/etc/fstab檢查并掛載其他文件系統
11. 清理過期的鎖文件的pid文件
/etc/rc.d/rc
說明:rc N –>意味著讀取/etc/rc.d/rcN.d/
K*:K##*;##運行次序,數字越小,越先運行,數字越小的服務,依賴的服務先關閉,而后關閉被依賴的服務
S*:S##*;##運行次序;數字越小,越先運行,;數字越小的服務,被依賴的服務先啟動,而啟動依賴的服務后
for I in /etc/rc3.d/K*;do
$I stop
done
for I in /etc/rc3.d/S* ;do
$i start
done
關閉或啟動的優先次序,數據越小越優先被選定,先關閉以K開頭的服務然后啟動以S開頭的服務
服務類腳本/etc/rc.d/init.d /etc/init.d(鏈接文件內容跟/etc/rc.d/init.d內容太完全一樣)
SysV: /etc/rc.d/init.d
服務名 {start | stop | restart |status |reload |configtest }
chkconfig命令
chkconfig runlevels ss(啟動次序) kk(關閉次序)
當chkconfig命令來為此腳本在rc#.d目錄創建鏈接時,runlevel表示默認創建為S*開頭的鏈接,除此之外的級別默認創建為K*開頭的鏈接,S后面的啟動優先級為SS所表示的數字,K后面關閉次序KK所表示的數字,“—”表示設有默認為S*開頭的鏈接
description:用于說明此腳本的簡單功能:“\”續行
chkconfig –list:查看所有獨立守護服務的啟動設定
chkconfig –list service_name
chkconfig –add service_name
chkconfig –del service_name
chkconfig –35 service off
chkconfig –level service_name {on|off}
如果省略級別指定,默認為2345級別
/etc/rc.d/rc.local:系統最后啟動的一個服務,準確的說應該執行的一個腳本
守護進程的類別(像第三方的應用程序)
獨立守護進程
xinetd:超級獨立守護進程 (代理人)
瞬時守護進程:不需要關聯至運行級別,被xinetd進程所管理
進入的請求首先被xinetd代理
配置文件:/etc/xinetd.conf /etc/xinetd.d/serviername
與libwrap.so文件鏈接
用chkconfig控制的符
chkconfig tftp on
service命令:手動管理服務
service 服務 start | stop |restart
service –status-all 顯示所有服務的狀態
原創文章,作者:fszxxxks,如若轉載,請注明出處:http://www.www58058.com/45127