本節索引:
一、Linux系統啟動流程
二、制定自己的init開機自啟動服務
三、服務相關命令
Linux系統從按下電源鍵開始到系統啟動要求用戶輸入用戶名,中間究竟發生什么?了解Linux系統的啟動
流程,不僅有助于我們更加深入的理解linux底層設計理念,更能幫助我們再出現系統啟動故障時,迅速排
查出故障原因。
一、Linux系統啟動流程
以下是CentOS6版本系統啟動流程圖:
(注:下文中啟動流程主要適用于CentOS6之前的版本,7版本變動較大,暫不加入討論)
CentOS6啟動流程:
1.加載BIOS的硬件信息,進行POST加電自檢
2.讀取第一個啟動設備MBR的引導加載程序(grub)的啟動信息
3.加載核心操作系統的核心信息,核心開始解壓縮,并嘗試驅動所有的硬件設備
4.核心執行init程序,并獲取默認的運行信息
5.init程序執行/etc/rc.d/rc.sysinit文件
6.啟動核心的外掛模塊
7.init執行運行的各個批處理文件(scripts)
8.init執行/etc/rc.d/rc.local
9.執行/bin/login程序,等待用戶登錄
10.登錄之后開始以Shell控制主機
接下來我們對每一項流程詳細講解
1.POST:
Power-On-Self-Test,加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、內
存、硬盤子系統、顯示子系統、串并行接口、鍵盤、CD-ROM光驅等硬件情況檢測。
2.加載MBR:
MBR:Master Boot Record,主引導記錄
0磁道0扇區:512bytes
446bytes:boot loader
64bytes:分區表
16bytes:標識一個分區(最多4個分區)
2bytes:55AA(分區標識位)
bootloader:引導加載器,引導程序
主要功能有:
a)識別、加載操作系統中的核心文件,并提交到內存中運行,進而來啟動對應操作系統。
b)提供菜單信息,并將啟動管理功能轉交給其他加載程序。
Linux:GRUB,可引導多種操作系統
windows:ntloader,只能引導windows系統
因此建議:同一臺電腦裝多個操作系統,先裝windows,后裝Linux
3.GRUB:
grub0.97(老版本)
第一階段:MBR的前446字節
1.5階段:MBR后續的27個扇區,加載/boot分區文件系統驅動
第二階段:識別文件系統,加載/boot/grub目錄下的文件(備份gurb的文件)
注:grup 修復命令依賴于/boot/grub下的文件
grub-install修復命令不依賴,將自動生產gurb文件下文件,
一旦用grub命令修復后,grub-install也將依賴這些文件。
/boot/grub/grub.conf??? grub配置文件
default=0????????????????? 定義了默認啟動項
timeout=5??????????????? 定義了菜單超時時長
splashimage=(hd0,0)/grub/splash.xpm.gz??? 定義了菜單背景圖片
password –md5 口令?? 默認無此行,添加此行后需輸入正確口令才能以但用戶模式破解root口令
可用grub-md5-crypt生產md5口令
hiddenmenu???????????? 默認隱藏菜單
title?????????????????? 定義了啟動菜單,有幾個title就有幾個啟動菜單
root(hd0,0)
krenel?????????????? 定義了內核文件位置,掛載目錄
initrd???????????????? 定義了initramfs文件位置
4.加載內核Kernel:
探測可識別到的所有硬件設備
加載硬件驅動程序(借助于ramdisk加載驅動)
以只讀方式掛載根文件系統:
/boot/initramfs-VERSION-release.img文件加載根目錄文件系統驅動
? /boot/grup/grup.conf文件定義了根的位置
運行用戶空間的第一個應用程序:/sbin/init
內核的核心文件:
/boot/vmlinuz-VERSION-release
ramdisk:輔助的偽根系統,存放輔助性的驅動模塊
CentOS 5: /boot/initrd-VERSION-release.img????? ramdisk虛擬磁盤
CentOS 6,7: /boot/initramfs-VERSION-release.img? ramfs虛擬文件系統
mkinitrd /boot/initramfs-`uname -r`.img `uname -r` ? ? ? ?生成新的ramfs文件
5.啟動init進程:
CentOS5:
SycV:init,redhat開發
特點:啟動服務程序時,有依賴的服務將被串行啟動,因此centos5系統啟動很緩慢
配置文件:/etc/inittab
CentOS6:
Upstart:init,ubantu開發
特點:守護進程間通信依賴于D-Bus進行,因此可基本實現類似并行啟動
配置文件:/etc/inittab,/etc/init/*.conf
CentOS7:
Systemd:systemd–>init? redhat開發
特點:服務只有在第一次被訪問到才會啟動,因此centos7系統啟動過程非???/p>
配置文件:/usr/lib/systemd/system
???????? /etc/systemd/system
/sbin/init CentOS6版本之前
運行級別:為系統運行或維護等目的而設定;0-6:7個級別
0:關機
1:單用戶模式(root自動登錄), single, 維護模式
2: 多用戶模式,啟動網絡功能,但不會啟動NFS;維護模式
3:多用戶模式,正常模式;文本界面
4:預留級別;可同3級別
5:多用戶模式,正常模式;圖形界面
6:重啟
默認級別: 3, 5
切換級別:init #
查看級別:runlevel ; who -r
6.讀取/etc/inittab文件
CentOS5:?????
1.定義默認啟動運行級別為3
2.定義了使用/etc/rc.d/rc.sysinit進行系統初始化
3.定義了每個運行級別執行的rc#文件
4.定義Ctrl-Alt-Delete組合鍵重啟
5.配置不斷電系統pf、pr兩種機制
6.定義了終端數量,默認6個
7.如果是5級別,則會啟動圖形化界面
注意:可利用#加注釋方法減少5選項中的終端數量,也可復制增加可登陸終端數量
建議:生產中建議關閉6選項組合鍵重啟功能,防止誤操作
CentOS6:
僅定義了系統默認啟動運行級別,其他項分割為單個文件執行,原來與5版本一致。
/etc/init/control-alt-delete.conf
/etc/init/tty.conf
/etc/init/start-ttys.conf
/etc/init/rc.conf
/etc/init/prefdm.conf
7.讀取/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) 清理操作
/etc/init.d/
存放對應服務腳本
是rc.d文件軟連接的源文件
通過執行init.d腳本,確定運行級別開啟和關閉的服務
8.運行/etc/rc.d/ rc[0-6].d/對應級別目錄下服務
K##*:運行級別為N時,關閉K開頭的服務;##運行次序;數字越小,越先運行;數字越小的服務,通常
為依賴到別的服務
S##*:運行級別為S時,打開S開頭的服務;##運行次序;數字越小,越先運行;數字越小的服務,通常
為被依賴到的服務
/var/lock/subsys
存放已啟動的服務名稱
9.運行/etc/rc.d/rc.local文件
rc.local會在所有服務啟動后作為一個兜底的服務進行啟動
注意:(1)正常級別下,最后啟動一個服務S99local沒有鏈接至/etc/rc.d/init.d一個
服務腳本,而是指向了/etc/rc.d/rc.local腳本
(2)不便或不需寫為服務腳本放置于/etc/rc.d/init.d/目錄,且又想開機時自動運行
的命令,可直接放置于/etc/rc.d/rc.local文件中
(3)/etc/rc.d/rc.local在指定運行級別腳本后運行
(4)可以根據情況,進行自定義修改
10、執行/bin/login程序
此時,系統完成啟動,顯示請輸入用戶名、密碼
二、制定自己的init服務腳本:
方法1:
第一步:編寫服務腳本
#!/bin/bash
#chkconfig:???? 345/-???? 95???? 5???????????? 關鍵一行
生效模式:345或all? S編號? K編號
#description:test service
source /etc/init.d/functions??????????????????? 調用函數庫
case $1 in
start)
[ -f /var/lock/subsys/testsrv ] && action “testsrv is started ”
touch /var/lock/subsys/testsrv
action starting testsrv
;;
stop)
rm -f /var/lock/subsys/testsrv
action testsrv is stopped
;;
status)
[ -f /var/lock/subsys/testsrv ]&&echo testsrv is starting||echo testsrv is stopped
*)
echo “Usage:service testsrv start|stop|status”
esac
第二步:放入服務目錄
/etc/init.d/???????????????????????????????????????? 放入服務目錄
第三步:添加腳本至服務
chkconfig –add testsrv??????????????????????????? 將testsrv腳本添加至服務
方法2:
也可以將開機啟動服務代碼添加到:
/etc/rc.d/rc[0-6]/99Slocal中執行
三、服務相關命令
chkconfig???????? 服務狀態控制
查看服務狀態:
–list????????????????? 列出所有獨立服務
–list [name]???????????? 列出指定服務各運行模式狀態
添加腳本到服務:
–add? name?????????????????? 添加腳本到服務
注:SysV服務腳本要放置于/etc/rc.d/init.d(/etc/init.d)
#!/bin/bash
#LLLL 表示初始在哪個級別下啟動,-表示都不啟動
# chkconfig: LLLL nn nn
刪除服務:???
–del? name??????????? 刪除指定服務
修改服務狀態:?
–level 35 atd off|on?????? 將3,5模式atd服務默認開機關閉服務,不添加模式:默認2,3,4,5
ntsysv?????????????? 查看當前模式服務啟動狀態,*代表開機啟動
–level=3????????? 修改指定運行模式的啟動服務
service????????????? 手動管理服務
[name]? start|stop|restart ? ? 管理服務狀態
–status-all?????????????? 當前所有服務狀態
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/98057