Linux的系統啟動流程,boot loader,init 系統啟動流程以debian6為例1 載入BIOS的硬體資訊與進行自我測試,並取得啟動裝置(如硬碟、光碟片、快閃記憶體)2 讀取並執行啟動裝置內MBR的boot loader(如grub等)3 依據boot loader的設定載入kernel,kernel開始偵測硬體並加在驅動程式4 硬體驅動成功後,kernel會主動呼叫init程式,而init會取得run-level資訊5 init執行/etc/init.d/rc指令碼來準備軟體執行的工作環境(如網路、時區等)6 init執行run-level的各個服務之啟動(scipt方式)7 init執行/etc/rc.d/rc.local檔案8 init執行終端機啟動login程式,等待使用者登入 boot loader1 每個硬碟的MBR只有一個2 每個檔案系統(filesystem,或者是partition)都會保留一塊開機磁區(boot sector)3 每個作業系統預設會安裝boot loader到他自己的檔案系統的boot sector中4 boot loader可以安裝在MBR中,boot loader也可以安裝在boot sector中5 boot loader可以將管理權轉交給其他的boot loader init初始程式及其設定檔/etc/inittab/sbin/init最主要的功能就是準備軟體執行的環境,包括系統主機名稱、網路設定、語系處理、檔案系統格式即其他服務的啟動/etc/inittab是/sbin/init的設定檔,此設定檔類似script,需要一步一步執行 init處理流程,也就是/etc/inittab執行步驟1 設定預設的runlevel id:2:initdefault:2 系統啟動初始化指令碼 si::sysinit:/etc/init.d/rcS3 運行runlevel為2的指令碼 l2:2:wait:/etc/init.d/rc 24 設定ctrl+alt+del組合進行重啟 ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now5 設定電源管理 pf::powerwait:/etc/init.d/powerfail start6 啟動終端tty1 1:2345:respawn:/sbin/getty 38400 tty1步驟詳細分析1 上表第2步調用rsS其實是調用/etc/init.d/rc S, 上表第3步也是同樣調用/etc/init.d/rc 22 查看/etc/init.d/rc指令碼,此指令碼根據參數runlevel調用相應runlevel的指令碼 相應runlevel的指令碼的路徑為/etc/rc$runlevel.d/3 /etc/rc$runlevel.d/路徑下指令碼被依次執行,啟動或關閉相應的服務 /etc/rc$runlevel.d/S* 需要開啟的服務 /etc/rc$runlevel.d/K* 需要關閉的服務4 /etc/init.d/rc.local指令碼在/etc/rc$runlevel.d/路徑下最後執行 /etc/init.d/rc.local指令碼為使用者自訂系統啟動指令碼 /etc/inittab主要文法/etc/inittab由:(冒號)來分隔成4部分1 id。最多4個字元,代表init的主要工作,只是簡單說明2 runlevel。代表該初始化動作在哪些runlevel下運行3 action。代表初始化的特別動作4 process。代表需要進行的命令,通常是一些script更詳細的可參考man inittab action初始化特別動作initdefault 代表預設的runlevel設定值sysinit 代表系統初始化的動作ctrlaltdel 代表按下這3個按鍵是否可以重啟wait 代表後面的process命令必須執行完畢才能繼續respawn 代表後面的process命令可以無限制的再生。例如getty啟動login,登出後,此動作還會啟動login runlevel執行等級runlevel作用就是規定系統使用不同的服務來啟動,根據目的設定相應的工作環境不同版本的linux還需要查看/etc/inittab0 halt 系統直接關機1 single-user 單人維護模式,用在系統出問題時的維護2 multi-user without NFS 多使用者文字模式,無NFS服務3 full multi-user 完整含有網路功能的多使用者純文字模式4 unused 系統保留5 X11 多使用者圖形介面,載入使用X Window6 reboot 重啟 相關檔案/boot/vmlinuz-$(uname -r) linux核心檔案/boot/initrd-$(uname -r) 啟動時虛擬檔案系統/boot/grub/* boot loader程式/etc/inittab init設定檔/etc/init.d/rc 初始化系統啟動指令碼 /etc/rc$runlevel.d/* 相應runlevel系統啟動指令碼/etc/init.d/rc.local 使用者自訂系統啟動指令碼