CentOS 5和6的啟動流程
CentOS 5和6的啟動流程:
Linux:kernel + rootfs
kernel:進程管理,內存管理,網絡管理,驅動程序,文件系統,安全功能
rootfs:glibc(gun c 標準庫)
庫:
函數集合,function,調用接口(功能名)
過程調用:procedure,無返回值
函數調用:function,有返回值
程序:
內核設計流派:
單內核設計:Linux,把所有功能集成同一個程序
微內核設計:Windows,Solaris,每種功能使用一個單獨子系統實現
liunx內核特點:
支持模塊化:.ko(被內核調用) .so(用戶空間庫名)
支持模塊的動態裝載和卸載
組成部分:
核心文件:/boot/vmlinuz-VERSION-release
模塊文件:/lib/modules/VERSION-release
ramdisk:基于內存的磁盤,輔助內核驅動磁盤
CentOS 5:/boot/initrd_VERSION-release.img (模擬成硬盤)
CentOS 6:/boot/initramfs-VERSION-release.img (模擬成文件系統)
CentOS系統啟動流程:
POST:加電自檢:
ROM:CMOS
BIOS:Basic Input and Output System
ROM + RAM
BOOT Sequence:
按次序查找各引導設備,第一個有引導程序的設備即為本次啟動用到的設備
bootloader:引導加載器,程序
windows:ntloader
Linux:
LILO:LInux LOader
GRUB:GRand Uniform Bootloader
GRUB 0.x:GRUB legacy (CentOS 5,6)
GRUB 1.x:GRUB2 (CentOS 7)
引導加載器:找到操作系統所在的磁盤分區,把內核加載至內存中,并將控制權正常轉交給內核的程序,以硬盤為例,引導加載器放在其MBR中
(提供一個菜單,允許用戶選擇要啟動的系統或不同的內核版本,把用戶選定的內核裝載到內存中的特定空間中,解壓展開并把系統控制權移交給內核)
MBR:
446:bootloader
64:fat 文件分配表
2:55AA
GRUB:
bootloader:1st stage (找到硬盤中的第二階段)
disk:2nd stage
kernel:
自身初始化:
探測可識別到的所有硬件設備
加載硬件驅動程序:(有可能會借助于ramdisk加載驅動)
以只讀方式掛載根文件系統
運行用戶空間的第一個應用程序:/sbin/init
init程序的類型:
SysV:init,CentOS 5 配置文件 /etc/inittab
upstart:init,CentOS 6 配置文件 /etc/inittab,/etc/init/*.conf
systemd:systemd,CentOS 7 配置文件 /usr/lib/systemd/system, /etc/systemd/system
ramdisk:
內核中的特性之一:使用緩沖和緩存來加速對磁盤上文件的訪問:
啟動時內核加載根文件系統,但根文件系統所在設備,
內核可能無法驅動,因為驅動程序在根文件系統上,
所以借助于ramdisk協助完成對于所需要和依賴的驅動程序的加載,
加載完成后,切換到真正的根
ramdisk -> ramfs
由于ramdisk模擬成硬盤,所以有可能被緩沖兩次,內核認為任何磁盤都比較慢,
所以會把ramdisk緩存到內存中,但ramdisk本身就在內存中,
等于存了兩次,所以CentOS 6采用ramfs
ramdisk在CentOS 5:initrd,利用mkinitrd生成
ramfs在CentOS 6:initramfs 工具程序:mkinitrd(不怎么用),dracut(一般使用此工具)
系統初始化:
POST--Bootsequence(BIOS)--Bootloader(MBR)--kernel(ramdisk)--rootfs(以只讀方式加載根文件系統)--init
/sbin/init
CentOS 5:
運行級別:為了系統的運行或維護等應用目的而設定
0-6:7個級別
0:關機
1:單用戶模式,single,維護模式,root,無須登陸
2:多用戶模式,會啟動網路功能,但不會啟動NFS,維護模式
3:多用戶模式,正常模式,文本界面
4:預留級別,可同3級別
5:多用戶模式,正常模式,圖形界面
6:重啟
默認級別:3,5
切換級別:init #(級別數字)
查看級別:runlevel;who -r
配置文件:/etc/inittab
每一行定義一種action以及與之對應的process
id:runlevel:action:process (id可以使用任意名稱,保證每行不一樣就成)
例:id:3:initdefault:
action:
wait:切換至此級別運行一次
respawn:此process終止,就重新啟動之
initdefault:設定默認運行級別:process省略
sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit
# si::sysinit:/etc/rc.d/rc.sysinit 運行級別為空,表示所有級別
# l0:0:wait:/etc/rc.d/rc 0
# l1:1:wait:/etc/rc.d/rc 1
.
.
.
# l6:6:wait:/etc/rc.d/rc 6
說明:rc 0 -- 意味著讀取/etc/rc.d/rc0.d
K*:K##* K開頭意味著此級別關閉 K后數字越小,越先運行,數字越小的服務,為越依賴別的服務的服務
S*:S##* S開頭意味著此級別開啟 S后數字越小,越先運行,數字越小的服務,為越被依賴的服務
在/etc/rc.d/init.d中有對應的腳本,在每個級別的rc.d文件中都有選擇開啟和關閉的腳本
chkconfig命令:
查看服務在所有級別下的啟動或關閉設定情形:
chkconfig [--list] [name]
添加:
sysV的服務腳本放置于/etc/rc.d/init.d(/etc/init.d)
chkconfig --add name
#!/bin/bash
#
# chkconfig: L mm nn
L:0-6 寫那個數那個級別為S,如果為"-"表示所有級別都不為S
mm:為S后數字
nn:為K后數字
刪除:
chkconfig --del name ?腳本還在只是在各運行級別中刪除
修改指定的鏈接類型:
chkconfig [--level levels] name <on|off|reset>
--level L:指定要設置的級別,默認為2345
注意:想在開機時運行但不方便寫成腳本放在/etc/rc.d/init.d中的使用chkconfig控制,但又想開機運行的命令,
可以寫在/etc/rc.local或/etc/rc.d/rc.local
注意:正常級別下,最后啟動的一個服務S99local沒有鏈接至/etc/rc.d/init.d中的一個服務腳本,
而是指向了/etc/rc.d/rc.local腳本;因此,不便或不需寫為服務腳本放置于/etc/rc.d/init.d目錄中,
且又想開機自動運行的命令,可以寫入/etc/rc.d/rc.local文件中
啟動虛擬終端:
tty1:2345:respawn:/usr/sbin/mingetty ?tty1
tty2:2345:respawn:/usr/sbin/mingetty ?tty2
.
.
.
tty6:2345:respawn:/usr/sbin/mingetty ?tty6
mingetty會調用login程序
/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)清理操作
總結:/sbin/init -- (/etc/inittab)-- 設置默認運行級別 -- 運行系統初始腳本,完成系統初始化 -- 關閉對應級別下需要關閉
的服務,啟動需要啟動的服務 -- 設置登陸終端
CentOS 6:
init程序為:
upstart
配置文件:
/etc/inittab,/etc/init/*.conf
注意:
/etc/init/*.conf 文件語法遵循upstart配置文件語法格式