開機啟過程 POST—>BOOT SEQUENCE—> BOOTLOADER—>KERNEL + INITRAMFS(INITRD)—>ROOTFS—>/sbin/init POST:加電自檢 當開機按下電源按鈕後,電腦開始加電,主板上的BIOS或UEFI基本輸入輸出程式開始對硬體進行檢查,檢查內 ...
開機啟過程
POST—>BOOT SEQUENCE—> BOOTLOADER—>KERNEL + INITRAMFS(INITRD)—>ROOTFS—>/sbin/init
POST:加電自檢
當開機按下電源按鈕後,電腦開始加電,主板上的BIOS或UEFI基本輸入輸出程式開始對硬體進行檢查,檢查記憶體,CPU等等吧,當檢測到錯誤的時候機器會中斷或者啟動不了,這個做過電腦維護的人都知道,記憶體氧化可導至開不了機,還有的機器如果沒插滑鼠鍵盤自檢也不會通過卡在那裡了,不會繼續往下走。
Boot sequence:選擇引導順序
當自檢通過後,接著就要選擇引導介質或方式,是通過光碟啟動,硬碟啟動,網路啟動,還是U盤啟動,這些也是在BIOS中設定的,所以設定的第一啟動項是哪個就從那個開始引導,這個裝過WINDOWS的都很熟悉了。
Bootloader:引導載入器
確定引導介質後便開始從介質中裝載引導程式如grub2,這個是一個微小程式,我們知道MBR引導記錄大小為512位元組,其中前446個位元組就是Bootloader,主要用來引導用戶選擇要啟動的系統或不同的內核版本,把用戶選定的內核裝載到RAM中的特定空間中,解壓,展開,而後把系統控制權移交給內核。
grub2就是Linux中Bootloader程式,由於MBR記錄限制,所以grub2分為兩個部分:
1.在MBR引導記錄中,大小為446位元組,主要功能是引導啟動介質的grub主體文件
2.partition,/boot/grub[2],此為grub的主體。
KERNEL + INITRAMFS(INITRD)—>ROOTFS :載入內核
這時候kernel開始初始化,探測可識別的硬體設備,載入硬體啟動程式。以只讀方式載入根文件系統
kernel在記憶體中載入時,為了模擬系統環境,會生成一個ramdisk文件,來進行下一步操作,等到載入到真正的根文件系統時,就會退出ramdisk,切換到真正的根文件系統中去。
ramdisk:記憶體上臨時虛擬的系統
ramdisk(虛擬磁碟,雙緩衝,雙緩存)----> ramfs(虛擬文件系統)
centos5:initrd
工具程式:mkinitrd
centos6,7:initramfs
工具程式:dracut,mkinitrd
/sbin/init:運行用戶空間的第一個應用程式
init:
Centos 5: SysV init 配置文件:/etc/inittab
Centos 6: Upstart 配置文件:/etc/inittab;/etc/init/*.conf(主要)
Centos 7: systemd 配置文件:/etc/systemd/system;/usr/lib/systemd/system
至此,內核空間就已經啟動完畢,內核啟動完成接著開始啟動用戶態啟動過程。systemd是個守護進程,pid號為1,後面所有啟動的服務或進程都是systemd的子進程及子進程的子進程。
那麼用戶態的啟動順序又是什麼樣的呢?
設置預設允許級別—>初始化腳本,完成系統初始化--->關閉及啟動對應級別下的服務----->設置登錄終端----->[啟動圖形終端]
Systemd新特性:
系統引導時實現服務並行啟動,沒有順序之分
按需激活進程
支持系統狀態快照
基於依賴關係定義服務控制邏輯
關鍵特性:
基於socket的激活機制:socket與服務程式分離;按需激活程式或服務,可並行啟動
基於bus的激活機制:
基於device的激活機制:當某個硬體設備變得可用時就可激活某設備
基於path的激活機制
系統快照:保存各unit的當前狀態信息於持久存儲設備中
向後相容sysv init腳本
不相容:
systemctl命令固定不變,非由systemd啟動的服務,systemctl無法與之通信
核心概念:unit
配置文件進行標識和配置,文件中主要包含了系統服務,監聽socket,保存的系統快照以及其它與init相關的信息,保存至:
/usr/lib/systemd/system
/run/systemd/system
/etc/systemd/system
unit的類型
Service unit:文件擴展名為.service 無需執行許可權,用於定義系統服務
Target unit:文件擴展名為.target,用於模擬實現“運行級別”
Device unit:文件擴展名為.device,用於定義內核識別的設備
Mount unit:文件擴展名為.mount,定義文件系統掛載點
Socket unit:文件擴展名為.socket,用於標識進程間通信用的socket文件
Snapshot unit:文件擴展名為.snapshot,管理系統快照
Swap unit:文件擴展名為.swap,用於標識swap設備
Automount unit:文件擴展名為.automount,文件系統的自動掛載點
Path unit:文件擴展名為.path,用於定義文件系統中的一個文件或目錄
管理系統服務
啟動:systemctl start name.service
停止:systemctl stop name .service
重啟:systemctl restart name.service
重載:systemctl reload name.service
條件式重啟:systemctl try-restart name.service
查看某服務當前是否運行:systemctl is-active name.service
查看所有已經激活的服務:systemctl list-units –type service systemctl list-units –type service –-all
開機自啟動:systemctl enable name.service
開機不啟動:systemctl disable name.service
查看所有服務開機自啟動狀態:systemctl list-unit-files –-type service
查看服務是否開機自啟:systemctl is-enabled name.service
查看服務的依賴關係:systemctl list-dependencies name.service
禁止設定為開機自啟:systemctl mask name.service
取消禁止設定為開機自啟:systemctl unmask name.service
Target units:(模擬運行級別)
unit配置文件,以.target後輟名結尾
關機:runlevel0.target,poweroff.target
救援:runlevel1.target,rescue.target
多用戶:multi-user.target
圖形:graphical.target
重啟:reboot.target
級別切換:systemctl isolate name.target
查看級別:systemctl list-units –-type target systemctl get-default
設置級別:systemctl set-default name.target
切換至緊急救援模式:systemctl rescue
切換至emergency模式:systemctl emergency(服務不載入不啟動,驅動不載入,更徹底)
其它常用命令
關機:systemctl halt,systemctl poweroff
重啟:systemctl reboot
掛起:systemctl suspend
快照:systemctl hibernate
快照並掛起:systemctl hybrid-sleep