Linux系統的組成
內核+根文件系統 內核功能: 進程管理、內存管理、文件系統管理、網絡管理、安全功能、驅動程序 運行中的系統環境可分為兩層:內核空間、用戶空間 用戶空間:應用程序(進程或線程) 內核空間:內核代碼(系統調用) 內核設計流派: 單內核設計:把所有功能集成與同一個程序 Linux 微內核設計:每種功能使用一個單獨的子系統實現 Windows,Solaris Linux內核特定: 支持模塊化:.ko(Kernel Object) 支持模塊運行時動態裝載或卸載 組成部分: 核心文件:/boot/vmlinuz-VERSION-release ramdisk: CentOS 5:/boot/initrd-VERSION-release.img CentOS 6,7:/boot/initramfs-VERSION-release.img 模塊文件:/lib/modules/VERSION-release
CentOS系統啟動流程
整體來說系統啟動分為以下幾個過程:
1.加電自檢
步驟1:通過BIOS(Basic Input Output System)即基本輸入輸出系統來檢測硬件設備是否存在且運行正常,如:CPU、內存、硬盤,如果有異常情況,BIOS自檢階段會報錯,從而導致系統無法啟動 步驟2:去讀BIOS啟動順序當中的第一個可引導設備(例如硬盤)的第一個扇區(MBR 512字節),然后執行里面的代碼,實際上這里BIOS并不關心啟動設備第一個扇區中是什么內容,它只是負責讀取該扇區內容、并執行
2.Boot Loader
我們首先來了解一下MBR,它是Master Boot Record的縮寫。硬盤的0柱面、0磁頭、1扇區稱為主引導扇區。它由三個部分組成,主引導程序(Bootloader)、 硬盤分區表DPT(Disk Partition table)和硬盤有效標志(55AA) Boot loader:引導加載器 Windows:ntloader Linux:LILO、GRUB 我們以GRUB為例來分析整個過程: Boot loader的主要功能是功能豐富,提供菜單,允許用戶選擇要啟動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓、展開,并把系統控制權移交給內核。存放于MBR的前446bytes當中,但是446bytes容納這么多功能,顯然是很難得,因此,將Boot loader程序分為三個階段來運行: stage1:存放于MBR的前446bytes當中,負責引導stage2 stage1.5:在MBR之后的扇區中存放,讓stage1中的bootloader能識別stage2所在的分區上的文件系統 stage2:通過Bootloader加載所有配置文件及相關的環境參數信息,這些配置文件及相關的環境參數存放于磁盤分區上的/boot/grub目錄下
3.加載kernel
在Bootloader開始讀取操作系統內核文件后,接下來會將內核文件解壓縮后裝載到內存當中,然后根據內核提供的功能開始測試與加載各個設備(CPU、硬盤、網卡等)。 通過ramdisk來加載設備的驅動程序 ramdisk: 能夠通過bootloader程序將其加載到內存當中,然后這個文件會被加壓縮并且在內存中模擬一個根文件系統,這個根文件系統能夠提供一個可運行的程序,通過該程序加載在啟動過程當中所需要的核心模塊。 CentOS 5:initrd,工具程序:mkinitrd CentOS 6:initramfs,工具程序:mkinitrd,dracut mkinitrd initramfs-KERNEL-VERSION.img KERNEL-VERSION Boot loader可以加載kernel以initrd,然后在內存中讓initrd解壓縮成根目錄,然后內核可以在這個虛擬的根文件系統上加載和是的驅動程序,來加載硬盤等設備,之后釋放虛擬的根文件系統,并以只讀方式掛載磁盤上真實的根文件系統,之后啟動/sbin/init程序
內核空間啟動過程
POST --> BootSequence(BIOS) --> BootLoader(MBR) --> kernel(ramdisk) --> rootfs(readonly) --> /sbin/init
4.啟動用戶空間第一個執行程序/sbin/init
init程序 CentOS 5:采用Sys V,配置文件為/etc/inittab CentOS 6:采用Upstart方式,特點是守護進程間的通信依賴于D-Bus進行,因此,可基本實現類似并行啟動; 配置文件:/etc/inittab、/etc/init/*.conf CentOS 7:采用systemd方式,服務只有在第一次被訪問到時才會真正啟動起來,因此,啟動過程非常之快 配置文件:/usr/lib/systemd/system, /etc/systemd/system 運行級別:為了系統的運行或維護等目的而設定的機制 0:關機,shutdown 1:單用戶模式(single),root用戶,無須認證可直接登錄 2:多用戶模式,會啟用網絡功能,但不會啟用nfs,維護模式 3:正常模式,多用戶,全功能,文本界面,通常用于服務器 4:預留級別 5:正常模式,多用戶,全功能,圖形界面操作,一般用于個人 6:重啟,reboot 默認級別:3,5 級別切換:init # 級別查看:who -r或runlevel 在內核、硬件及驅動信息加載完畢后,內核會呼叫用戶空間中的第一個執行程序/sbin/init,是所有進程的父進程,init程序主要功能是對系統進行初始化: 1.首先會去讀取配置文件/etc/inittab、/etc/init/*.conf /etc/inittab文件格式 id:一個任務的標識符 runlevels:在哪些級別下運行此任務#,##,可以為空,表示所有級別 action:在什么條件下運行此任務 process:任務 action: wait:切換至此級別運行一次 respawn:此process終止,就重新啟動之 initdefault:默認運行級別;process省略 sysinit:設定系統初始方式,此處一般指為/etc/rc.d/rc.sysinit 2.根據以上配置文件當中所定義運行級別以及參數去執行/etc/rc.d/rc.sysinit進行系統的初始化,/etc/rc.d/rc.sysinit所做的事情主要以下幾點 (1)根據配置文件中的設定來配置主機名(去讀/etc/sysconfig/network文件中HOSTNAME進行) (2)打印文本歡迎信息 (3)掛載所有定義在/etc/fstab文件中的文件系統 (4)激活swap設備 (5)激活SELinux和udev (6)檢測根文件系統,并實現以讀寫方式重新掛載 (7)設置系統時鐘 (8)根據/etc/sysctl.conf文件設定內核參數的值 (9)激活LVM和RAID設備 (10)加載額外的設備驅動程序 (11)清理操作 3.根據默認運行級別執行/etc/rc.d/rc腳本 /etc/rc.d/rc腳本根據默認運行級別去啟動或關閉/etc/rc.d/rc#.d目錄下的所有腳本 K*:要停止的服務;k##*,優先級,數字越小,越是優先關閉;依賴的服務先關閉,而后關閉被依賴的 S*:要啟動的服務;S##*,優先級,數字越小,越是優先啟動,被依賴的服務先啟動,而依賴的服務后啟動 rc腳本:接受一個運行級別數字為參數 /etc/init.d/*(/etc/rc.d/init.d/*)腳本執行方式 # /etc/init.d/SRV_SCRIPT {start|stop|restart|status} # service SRV_SCRIPT {start|stop|restart|status} chkconfig命令:管控/etc/init.d目錄下每個腳本在各級別下的啟動或關閉狀態 查看:chkconfig --list [NAME] 添加:chkconfig --add SRV_NAME 能被添加至服務腳本定義格式之一: #!/bin/bash # # chkconfig: LLL NN NN # description: 刪除:chkconfig --del SRV_NAME 修改指定的連接類型: chkconfig [--level LEVELS] name <one|off|reset> --level LEVELS:指定要控制的運行級別,默認為2345 4.執行/etc/rc.d/rc.local腳本 正常級別下,最后啟動的一個服務S99local沒有連接至/etc/init.d/下的某腳本,而是鏈接至了/etc/rc.d/rc.local腳本;因此,不便或不需寫為服務腳本的程序期望能開機自動運行時,直接放置于此腳本文件中即可 5.在完成系統所有先關服務啟動之后,接下來Linux就會啟動終端或者是X Window來向用戶提供登錄界面 根據/etc/init/tty.conf文件中的配置啟動一個應用程序-----login 如果默認運行級別為5,會啟動一個圖形虛擬終端,附加X應用程序
用戶空間的啟動流程:/sbin/init
設置默認運行界別 --> 運行系統初始化腳本,完成系統初始化 --> 關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務 --> 設置登錄終端 --> login
系統啟動流程簡要總結
POST加電自檢 --> Boot Sequence(BIOS) --> Boot Loader(GRUB) --> kernel(ramfs) --> rootfs(readonly) --> switchroot --> /sbin/init --> (/etc/inittab, /etc/init/*.conf) --> 設定默認運行級別 --> 初始化系統腳本(/etc/rc.d/rc.sysinit) --> 關閉或啟動對應級別下的服務(/etc/rc.d/rc#.d/) --> 啟動終端程序
原創文章,作者:zhai796898,如若轉載,請注明出處:http://www.www58058.com/46531