CentOS 系統啟動流程
一、Linux系統的組成部分:內核+根文件系統
1.內核:
-
進程管理:進程之間的通信為:IPC(Inter Process Communication)機制,有消息隊列、semerphor、shm、socket(跨主機之間的通信)
-
內存管理;
-
網絡管理;
-
文件系統;
-
驅動程序;
-
安全功能;
2.運行中的系統環境可分為兩層:內核空間、用戶空間
-
用戶空間:應用程序(表現為進程或線程)
-
內核空間 :內核代碼(系統調用)
3.內核設計流派:
-
單內核設計:把所有功能集成與同一程序;
Linux
-
微內核設計:每種功能使用一個單獨的子系統實現;
Windows,Solaris
4.Linux內核特點:
-
內核模塊化:.ko(kernel object)如:文件系統,硬件驅動,網絡協議等
-
支持模塊運行時動態裝載或卸載;
5.Linux內核組成部分:
1)核心文件:/boot/vmlinuz-VERSION-release
2)ramdisk:輔助的偽根文件系統 ;作用:加載驅動(非必要的)
CentOS 5: /boot/initrd-VERSION-release.img
CentOS6,7: /boot/initramfs-VERSION-release.img
3)模塊文件:/lib/modules/VERSION-release
CentOS 系統的啟動流程
(注:以下講解僅適用于PC架構的主機和MBR類型的架構)
Linux系統啟動過程大致按照如下步驟進行(簡述):
1)加電自檢,BIOS啟動引導階段;
在該過程中實現硬件的初始化以及查找啟動介質;
從MBR中裝載啟動引導管理器(GRUB)并運行該啟動引導管理;
2)GRUB啟動引導階段;
裝載stage1
裝載stage1.5
裝載stage2
讀取/boot/grub.conf文件并顯示啟動菜單;
裝載所選的kernel和initrd文件到內存中
3)內核階段:
運行內核啟動參數;
解壓initrd文件并掛載initd文件系統,裝載必須的驅動;
掛載根文件系統
4)init用戶空間初始化階段:
啟動/sbin/init程序;
運行rc.sysinit腳本,設置系統環境,啟動swap分區,檢查和掛載文件系統;
讀取/etc/inittab文件,運行在/et/rc.d/rc<#>.d中定義的不同運行級別的服務初始化腳本;
打開字符終端1-6號控制臺/打開圖形顯示管理,設置登錄
一、內核空間詳細過程如下:
1.POST:(power on system test)加電自檢
-
負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、串并行接口、鍵盤、CD-ROM光驅等硬件情況的檢測。
-
ROM:BIOS(Basic Input and Output System),即基本輸入輸出系統,它是裝載ZA在一個硬件芯片CMOS之上,加電過程就是給CMOS通電,然后啟動其上的BIOS程序,BIOS程序會根據CMOS上面的一些配置信息去讀取其他硬件設備信息并檢測其是否存在并能正常運行,之后進行硬件設備的初始化。
-
CMOS:互補金屬氧化物半導體,保存各項參數的設定;
-
ROM+RAM
2.Boot Sequnence
按次序查找引導設備,第一個有引導程序的設備為本次啟動設備,即:bootloader;
1)bootloader: 引導加載器,引導程序
-
windows: ntloader,僅是啟動OS;
-
Linux:
LILO:LInux LOader
GRUB: GRand Unified Bootloader
GRUB 0.X: Grub Legacy,
GRUB 1.X: Grub2
-
grub功能:功能豐富,提供一個菜單,允許用戶選擇要啟動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間RAM中,解壓、展開,并把系統控制權移交給內核;
2)bootloader裝在MBR中:Master Boot Record(主引導記錄)
512bytes :
446bytes: bootloader,
64bytes: 分區表
2bytes: 55AA(有效標識)
3)GRUB(2各階段)
bootloader : 1st stage
Partitioon :1.5 stage filesystem driver
Partitioon :2nd stage 分區文件在/boot/grub上
3.Kernel:加載系統內核,執行系統初始化信息
1)自身初始化:
·探測可識別到的所有硬件設備
·加載硬件驅動程序(可能借助于ramdisk加載驅動)
·以只讀方式掛載根文件系統
·運行用戶空間的第一個應用程序:/sbin/init
2)ramdisk:
內核中的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問
·ramdisk–> ramfs 提高速度(完成對真正根文件系統的驅動加載)
CentOS 5: initrd, 工具程序:mkinitrd
CentOS 6: initramfs,工具程序:mkinitrd,dracut
一旦啟動了init,內核就不管了,所有的后續操作都是由init去加載運行用戶空間的應用程序來完成各種各樣的工作,只有當這些應用程序完成系統調用或者系統發生中斷時需要特權操作時,內核才會參與;剩余的其他過程都不在參與,而是由用戶空間的程序來完成。
4.啟動用戶空間的第一個執行程序/sbin/init,完成系統初始化
在內核、硬件及驅動信息加載完畢后,內核會呼叫用戶空間中的第一個執行程序/sbin/init,init程序主要功能是準備軟件運行環境,包括系統的主機名稱、網絡配置、文件系統各式等其他服務的啟動管理。而這些所有的操作都是通過init的配置文件來定義。
1)init功能:
-
設定默認運行級別;
-
指定系統運行的初始化腳本;
-
啟動指定級別下要啟動的服務,并關系需要停止的服務;
-
定義[ctrl][alt][del]組合鍵的功能;
-
初始化字符(mingetty6)終端;
-
啟動圖形終端
2)init程序的類型:
-
SysV: init, CentOS 5之前
配置文件:/etc/inittab
-
Upstart: init,CentOS6
配置文件:/etc/inittab, /etc/init/*.conf
-
Systemd:systemd, CentOS 7
配置文件:/usr/lib/systemd/system,/etc/systemd/system
3)詳見用戶空間啟動流程
總結:系統初始化流程(內核級別):
POST –> BootSequence(BIOS) –> Bootloader(MBR) –> kernel(ramdisk) –> rootfs(只讀) –> /sbin/init(systemd)
二、用戶空間啟動流程
第一執行程序:/sbin/init
1.init配置文件類別:
-
CentOS 5:
由于centos5采用的是SysV init方式,其特點是啟動用戶空間的服務程序,通常通過腳本進行,有依賴關系的服務將被串行啟動;這也就導致了centos5的系統啟動過程非常緩慢。其配置文件為:/etc/inittab;
-
CentOS 6:
采用Upstart的方式,其特點是守護進程間的通信依賴于D-Bus進行,因此,可基本實現類似并行啟動;配置文件:?etc/inittab,/etc/init/*.conf
-
CentOS 7:
采用Systemd方式,其特點是服務只有在第一次被訪問時才會真正啟動起來;因此centos 7系統的啟動過程會非常之快;其配置文件為:/usr/lib/systemd/*.
2.運行級別:為系統運行或維護等目的而設定;0-6:7個級別
0:關機,shutdown
1:單用戶模式(single user),root用戶,無需認證,維護模式;
2: 多用戶模式(multi user),會啟動網絡功能,但不會啟動NFS,維護模式;
3:多用戶模式(multi user),完全功能模式;文本界面;
4:預留級別;目前無特別使用目的,但習慣以同3級別功能使用;
5:多用戶模式(multi user),完全功能模式;圖形界面
6:重啟,reboot
默認級別:3, 5
切換級別:init #
查看級別:runlevel; who -r
[root@centos7 ~]# runlevel 3 5 [root@centos7 ~]# init 3 PolicyKit daemon disconnected from the bus. We are no longer a registered authentication agent. [root@centos7 ~]# runlevel 5 3 [root@centos7 ~]# who -r run-level 3 2016-09-12 19:59 last=5
3.init 的處理流程
1)init讀取其初始化文件:/etc/inittab
2)初始運行級別(RUN LEVEL),默認的級別為3;
3)使用/etc/rc.d/rc.sysinit進行系統初始化;
4)對應運行級別的腳本目錄,由于采用的是3級別,因此只進行 l3:wite:/etc/rc.d/rc.3
5)配置好[ctrl][alt][del]組合的功能;
6)配置不斷電系統pf、pr兩種機制;
7)啟動mingetty 6個終端
8)如果是5級別,則會以/etc/Xll/啟動圖形化界面
4./etc/rc.d/rc.sysinit: 系統初始化腳本
(1) 設置主機名;
(2) 設置歡迎信息;
(3) 激活udev和selinux;
(4) 掛載/etc/fstab文件中定義的文件系統;
(5) 檢測根文件系統,并以讀寫方式重新掛載根文件系統;
(6) 設置系統時鐘;
(7) 激活swap設備;
(8) 根據/etc/sysctl.conf文件設置內核參數;
(9) 激活lvm及軟raid設備;
(10) 加載額外設備的驅動程序;
(11) 清理操作。
5.CentOS 5 的配置文件/etc/inittab
1)每一行定義一種action以及與之對應的process
id:runlevel:action:process
id:一個任務的標識符;
runlevels:在哪些級別啟動此任務;#,###,也可以為空,表示所有級別
action:在什么條件下啟動此任務;
process:任務;
action:
wait: 等待切換至此級別時運行一次;
respawn:一但此任務終止,就重新啟動之
initdefault:設定默認運行級別;process省略
sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
2)示例啟動如下:
id:3:initdefault:
默認的運行級別為3
si::sysinit:/etc/rc.d/rc.sysinit
無論運行哪個級別都會運行此腳本,系統初始化
l0:0:wait:/etc/rc.d/rc 0
...
l6:0:wait:/etc/rc.d/rc 6
6.啟動或關閉所對應的服務
意味著去啟動或關閉/etc/rc.d/rc3.d/目錄下的服務腳本所控制的服務;
K*:要停止的服務;K##,優先級,數字越小越優先關閉,依賴的服務先關閉 ,而后關閉被依賴的
S*要啟動的服務; S##,優先級,數字越小越是優先啟動,被依賴的服務先啟動,而依賴的服務后啟動
rc腳本:接受一個運行級別數字為參數,如下:
[root@CentOS6 ~]# ls /etc/rc.d/ init.d rc rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.local rc.sysinit [root@CentOS6 ~]# ls /etc/rc.d/rc3.d/ K01smartd K30spice-vdagentd K73winbind K84ospfd K89rdisc S08iptables S13rpcbind S25netfs S55sshd S99local K05wdaemon K50dnsmasq K74ntpd K84ripd K92pppoe-server S10network S15mdmonitor S26acpid S80postfix K10psacct K50snmpd K75ntpdate K84ripngd K95rdma S11auditd S22messagebus S26haldaemon S82abrt-ccpp K10saslauthd K50snmptrapd K75quota_nld K84wpa_supplicant K99rngd S11portreserve S24nfslock S26udev-post S82abrtd K15htcacheclean K60nfs K84bgpd K85zebra S01sysstat S12rsyslog S24rpcgssd S28autofs S90crond K15httpd K61nfs-rdma K84NetworkManager K87restorecond S02lvm2-monitor S13cpuspeed S25blk-availability S50bluetooth S95atd K15svnserve K69rpcsvcgssd K84ospf6d K89netconsole S08ip6tables S13irqbalance S25cups S50kdump S99firstboot
腳本框架:
for srv in /etc/rc.d/rc#.d/K*;do
$srv stop
done
for srv in /etc/rc.d/rc#.d/S*;do
$srv start
done
/etc/init.d/*(/etc/rc.d/init.d/*)服務腳本執行方式:
# /etc/init.d/SRV_SCRIPT {start|stop|restart|status}
# service SRV_SCRIPT {start|stop|restart|status}
注意:
正常級別下,最后啟動一個服務S99local沒有鏈接至/etc/init.d下某腳本,而是指向了/etc/rc.d/rc.local(/etc/rc.local)腳本;因此,不便或不需寫為服務腳本,且又想開機時自動運行的命令,可直接放置于/etc/rc.d/rc.local文件中。
7.啟動6個終端及調用login程序
1:2345:respawn:/usr/sbin/mingettytty1
2:2345:respawn:/usr/sbin/mingettytty2
...
6:2345:respawn:/usr/sbin/mingettytty6
mingetty會自動調用login程序
x:5:respawn:/etc/X11/prefdm -nodaemon
=======================================================================================
chkconfig 命令:
SysV的服務腳本放置于/etc/rc.d/init.d(/etc/init.d)
管控/etc/init.d/每個服務腳本在各級別下的啟動或關閉狀態:
查看:
chkconfig [--list] [name]
添加:
chkconfig --add name
能被添加的腳本定義格式:
#!/bin/bash
#LLLL 表示初始在哪個級別下啟動,-表示都不啟動
# chkconfig: LLLL nnnn
刪除:
chkconfig --del name
修改指定的鏈接類型
chkconfig [--level levels] name <on|off|reset>
--level LLLL: 指定要設置的級別;省略時表示2345
[root@CentOS6 ~]# chkconfig --list NetworkManager 0:off 1:off 2:off 3:off 4:off 5:off 6:off abrt-ccpp 0:off 1:off 2:off 3:on 4:off 5:on 6:off abrtd 0:off 1:off 2:off 3:on 4:off 5:on 6:off acpid 0:off 1:off 2:on 3:on 4:on 5:on 6:off atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off auditd 0:off 1:off 2:on 3:on 4:on 5:on 6:off autofs 0:off 1:off 2:off 3:on 4:on 5:on 6:off bgpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off blk-availability 0:off 1:on 2:on 3:on 4:on 5:on 6:off
[root@CentOS6 ~]# chkconfig --list NetworkManager NetworkManager 0:off 1:off 2:off 3:off 4:off 5:off 6:off [root@CentOS6 ~]# chkconfig --level 35 NetworkManager on [root@CentOS6 ~]# chkconfig --list NetworkManager NetworkManager 0:off 1:off 2:off 3:on 4:off 5:on 6:off [root@CentOS6 ~]# chkconfig --level 35 NetworkManager off [root@CentOS6 ~]# chkconfig NetworkManager on [root@CentOS6 ~]# chkconfig --list NetworkManager NetworkManager 0:off 1:off 2:on 3:on 4:on 5:on 6:off
總結:CentOS 5用戶空間的啟動流程:/sbin/init(/etc/inittab)
/sbin/init–> (/etc/inittab) –> 設置默認運行級別–> 運行系統初始腳本、完成系統初始化–> (關閉對應下需要關閉的服務)啟動需要啟動服務–> 設置登錄終端
CentOS 6
-
init程序為: upstart, 但依然為/sbin/init;
-
其配置文件:/etc/inittab(僅用于定義默認級別), /etc/init/*.conf;
-
配置文件的語法遵循upstart配置文件語法格式,和CentOS5不同
文件如下:
/etc/init/*.conf rcS.conf,rc.conf,tty.conf
[root@CentOS6 ~]# cd /etc/init [root@CentOS6 init]# ls ck-log-system-restart.conf init-system-dbus.conf quit-plymouth.conf rcS-sulogin.conf serial.conf ck-log-system-start.conf kexec-disable.conf rc.conf readahead-collector.conf splash-manager.conf ck-log-system-stop.conf plymouth-shutdown.conf rcS.conf readahead.conf start-ttys.conf control-alt-delete.conf prefdm.conf rcS-emergency.conf readahead-disable-services.conf tty.conf
CentOS 6啟動流程
POST –> Boot Sequence(BIOS) –> Boot Loader –> Kernel(ramdisk) –> rootfs–> switchroot–> /sbin/init–>(/etc/inittab, /etc/init/*.conf) –> 設定默認運行級別–> 系統初始化腳本rc.sysinit–> 關閉或啟動對應級別的服務–> 啟動終端
CentOS 7
-
init程序:systemd
-
配置文件:/usr/lib/systemd/system/*,/etc/systemd/system/*
-
完全兼容SysV腳本機制;因此,service命令依然可用;不過,建議使用systemctl來控制服務
-
# systemctl {start|stop|status|resport} name.[service]
文件如下:
[root@centos7 ~]# ls /usr/lib/systemd/system abrt-ccpp.service gdm.service ntpdate.service sys-fs-fuse-connections.mount abrtd.service geoclue.service oddjobd.service sysinit.target abrt-oops.service getty@.service paths.target sysinit.target.wants abrt-pstoreoops.service getty.target plymouth-halt.service sys-kernel-config.mount abrt-vmcore.service graphical.target plymouth-kexec.service sys-kernel-debug.mount abrt-xorg.service graphical.target.wants plymouth-poweroff.service syslog.socket accounts-daemon.service gssproxy.service plymouth-quit.service syslog.target.wants alsa-restore.service halt-local.service plymouth-quit-wait.service sysstat.service alsa-state.service halt.target plymouth-read-write.service systemd-ask-password-console.path alsa-store.service halt.target.wants plymouth-reboot.service systemd-ask-password-console.service anaconda-direct.service hibernate.target plymouth-start.service systemd-ask-password-plymouth.path anaconda-nm-config.service htcacheclean.service plymouth-switch-root.service systemd-ask-password-plymouth.service anaconda-noshell.service httpd.service polkit.service systemd-ask-password-wall.path
如上:
CentOS系統的啟動流程包括:內核空間的啟動流程和用戶空間的啟動流程
如下圖所示:
原創文章,作者:zhumengxiaotao,如若轉載,請注明出處:http://www.www58058.com/46334