概述
了解系統的啟動流程,有助于我們了解Linux系統上的一些工作原理,有助于我們深入的理解一個系統的運作方式,那么本篇就以CentOS6系統為例,介紹一下有關Linux系統啟動相關的內容,分為一下幾個部分:
1、Linux系統的一些基礎概念
2、CentOS6上的啟動流程概述
3、系統啟動相關故障恢復和系統服務腳本案例
第一章 Linux系統啟動相關的基本概念
1、Linux系統的組成部分:內核+根文件系統
內核的功能:進程管理、內存管理、網絡協議棧、文件系統、驅動程序、安全功能(加密解密的棧、SELINUX等)
2、運行中的系統環境可分為兩層:內核空間、用戶空間
用戶空間:一般執行的是應用程序(進程或線程)
內核空間:執行的是內核代碼,當用戶空間的程序需要用到特權指令,硬件調度等內核級別操作時,通過系統調用,向內核發起申請,由內核執行后,將結果返回給用戶空間的程序
3、內核設計流派:
單內核設計:把所有功能集成于同一個程序,linux是單內核
微內核設計:每種功能使用一個單獨的子系統實現,windows是微內核
4、Linux內核特點:
支持模塊化:雖然是單內核設計,把所有功能集成于同一個程序,但是linux支持模塊化的設計,將一些非關鍵性的功能等,做成模塊,一般內核模塊文件為XXX.ko (kernel object)
支持模塊運行時動態裝卸載:當一個模塊需要用到時,可以動態對其進行裝載,用不到時,可以動態進行卸載,這樣實際上就類似微內核的設計理念
5、Linux內核的組成部分:
核心文件:如:/boot/vmlinuz-2.6.32-642.el6.x86_64
ramdisk:因為系統啟動時,根文件系統的一定是在某個磁盤分區上,而內核如果沒有編譯該根文件系統的相關驅動,這樣就會導致無法正常啟動系統;并且內核需要加載的各種模塊文件,其都在/lib/modules/目錄下,此目錄必然在/根下,而根無法驅動,也會造成相關內核模塊無法正常運行,進而也不能啟動系統,此時,就需要借助ramdisk來完成對根文件系統的驅動。而ramdisk是在/boot目錄下,/boot目錄是由grub的1.5階段進行驅動的
centos5:/boot/initrd-VERSION-RELEASE.img
centos6、7:/boot/initramfs-VERSION-RELEASE.img
各種模塊文件:/lib/modules/內核版本號/*
如果安裝了多個內核版本,則對應的目錄下就有多個文件,或多個目錄
第二章 CentOS6上的啟動流程概述
1、CentOS6上的啟動流程概述
2、POST加電自檢
POST: Power-On-Self-Test,加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、 串并行接口、鍵盤、 CD-ROM光驅等硬件情況的檢測。
ROM: BIOS, Basic Input and Output System,保存著有關計算機系統最重要的基本輸入輸出程序,系統信息設置、 開機加電自檢程序和系統啟動自舉程序等。
RAM: CMOS互補金屬氧化物半導體,保存各項參數的設定
按次序查找引導設備,第一個有引導程序的設備為本次啟動設備
3、bootloader程序(Linux系統上為grub)
引導過程:根據BIOS中設定的次序查找各引導設備,第一個有引導程序的設備,即為本次啟動要用到的設備
引導程序:bootloader:引導加載器、程序
windows:叫ntloader
Linux:
LILO:linux loader 現在很多android用的就是此引導程序,對1024柱面后的分區不支持
GRUB:grand uniform bootloader
Centos6: GRUB 0.X 零點幾的版本
Centos7: GRUB 1.X 一點幾的版本
1.X與0.X有很大不同,故GRUB 0.X的版本被稱為grub legacy,而GRUB 1.X的版本被稱為Grub2
引導程序的功能:
提供一個菜單,允許用戶選擇要啟動的系統或不同的內核版本;并能夠把用戶選定的內核,裝載到內存中的特定空間中,對其進行解壓展開,而后把整個系統的控制權,移交給內核
MBR:Master Boot Record主分區不能超過4個
MBR:一共512個字節byte,前446個字節存儲bootloader,后64byte存儲了分區表(fat),最后2個字節是存儲著4個16進制數據,一般為55AA,表示該MBR是有效的,其他數字表示該MBR無效
英文字符中,1個字符就需要1個字節
GRUB:因為MBR中只有前446個字節存儲bootloader,GRUB是bootloader的一種實現方式,也就是說GRUB正常情況下,只能有446個英文字符,這樣對程序員來說,要求太高,故通常情況下,grub分成以下幾個階段:
第一階段:存儲在bootloader中
第1.5階段:文件系統驅動,稱為第1.5階段,通常存儲在MBR緊跟著的扇區中,用來驅動/boot分區
第二階段:放在硬盤的/boot分區的/boot/grub下
第三階段:加載內核
一般情況下,系統啟動時是加電自檢,然后bootloader進行加載內核,但是grub風格的bootloader是先加載grub的第二階段,就是加載磁盤中的/boot/grub,該程序就擺脫了446字節的限定,從而提供了豐富的啟動接口,然后由該程序加載內核
注意:UEFI、GPT并不適用以上理論
4、加載內核,內核進行自身初始化
自身初始化的步驟和功能
<1>進行自身初始化:
探測可識別到的所有硬件設備
<2>加載硬件驅動程序;(可能會借助于ramdisk加載驅動)
<3>以只讀方式掛載根文件系統;(之所以要以只讀方式掛載,是為了避免萬一內核有bug,造成的文件系統損壞)
<4>運行用戶空間的第一個應用程序:/sbin/init
5、ramdisk程序介紹
Linux內核的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問
ramdisk 是一種把內存當磁盤用的機制,用來啟動時加載相應的驅動等
早期centos5上用的是initrd(就是把內存當磁盤使用),后來centos6和7換成了initramfs(內存當文件系統使用),之所以換,是因為initrd是把內存當磁盤用,但是一旦涉及到磁盤,為了加速寫入和讀取的速率,就會有緩沖和緩存的出現,但是ramdisk機制本身就是在內存上實現,如果再進行緩沖和緩存,就會造成系統浪費,所以,后期就換成了initramfs
centos5上initrd的創建工具程序:mkinitrd
centos6、7上initramfs上的創建工具程序:dracut或mkinitrd
initrd 映像實際上是一個 RAM 磁盤,其中包含帶有基本配置文件、二進制文件、庫和驅動程序的小型文件系統。在這個小型文件系統中,有一個將在引導期間裝入到內存中的根文件系統,還有一個用于裝入系統設備驅動程序的初始化腳本;它將在加載完所有設備驅動程序后重新加載實際的根文件系統磁盤。
在內核引導過程中,初始 RAM 磁盤(initrd)是由grub階段 2 引導加載程序加載到內存中的,它會被復制到 RAM 中并掛載到系統上。這個 initrd 會作為 RAM 中的臨時根文件系統使用,并允許內核在沒有掛載任何物理磁盤的情況下完整地實現引導。由于與外圍設備進行交互所需要的模塊可能是 initrd 的一部分,因此內核可以非常小,但是仍然需要支持大量可能的硬件配置。在內核引導之后,就可以正式裝備根文件系統了(通過 pivot_root):此時會將 initrd 根文件系統卸載掉,并掛載真正的根文件系統。
6、系統第一個程序init
init程序的類型:
centos5:SysV init
其配置文件:/etc/inittab
centos6: Upstart
其配置文件:/etc/inittab和/etc/init/*.conf
centos7:Systemd
其配置文件:/usr/lib/systemd/system/、/etc/systemd/system/
init管理用戶空間的各個程序運行,除非有需要進行內核特權級別操作時,內核才會被用戶空間的各個系統調用,完成一些內核級別的操作
init初始化用戶空間的啟動流程為:/sbin/init程序主要是通過讀取/etc/inittab文件來完成一定的任務,完成的任務有:
定義默認運行級別–>運行系統初始化腳本(/etc/rc.d/rc.sysinit)完成系統初始化–>關閉指定運行級別下的各服務,啟動指定級別下需要開啟的各服務–>啟動tty虛擬終端,調用login程序,顯示登錄提示符,讓終端進行登錄
7、/etc/inittab配置文件詳解
配置文件/etc/inittab的格式及其功能:
(以centos5上的該文件為例介紹,有助于理解centos6、7上對應的文件的作用)
每行定義一種action,以及與之對應的process
每行的格式為id:runlevel:action:process
id:一個任務的唯一標識符
runlevel:在那些級別啟動此任務;可以是一個數字,也可以多個數字,也可以為空(表示所有級別),例如:3或35或空
action:在什么條件下啟動此任務
process:具體執行的任務
常見的action:
wait 等待切換至此任務所在的級別時,執行一次(剛切換時執行)
respawn:一旦此任務終止,就自動重新啟動之
initdefault:設定默認運行級別,此時,process省略,因為一旦有了initdefault,就表示是定義默認的運行級別,而不需要運行別的process
sysinit:設定系統初始化方式,該action對應的process一般為指定/etc/rc.d/rc.sysinit腳本,該腳本定義了整個系統初始化時的腳本(centos5、6有用到該腳本,但centos7沒有用到該腳本)
例如:
id:3:initdefault: 表示定義默認運行級別就是3
si::sysinit:/etc/rc.d/rc.sysinit 表示所有級別利用/etc/rc.d/rc.sysinit腳本完成系統初始化
tty1:2345:respawn:/usr/sbin/mingetty tty1 表示在2345運行級別啟動mingetty指令,給指令傳遞參數tty1,一旦該程序停止,要自動重啟。mingetty會調用login程序,打開虛擬終端的程序,除了minget ty之外,還有諸如getty等
l3:3:wait:/etc/rc.d/rc 3 表示當切換到3級別時運行/etc/rc.d/rc腳本,往腳本里傳遞參數為3,意味著去啟動或關閉/etc/rc.d/rc3.d/目錄下的服務腳本所控制的服務
8、Linux運行級別:為了系統的運行或維護等目的而設定的機制
0-6一共七個級別,各級別的意義:
0:關機,shutdown
1:單用戶級別(single user),root用戶,無需認證,維護模式
2:多用戶模式,帶網絡功能,但無nfs功能,維護模式
3:完全多用戶模式;文本界面
4:預留級別,目前無特別使用目的,但習慣以同3級別功能使用
5:完全多用戶模式,圖形化界面
6:重啟 reboot
默認級別:3、5
級別切換:init 數字
級別查看:who -r或runlevel
9、系統初始化腳本/etc/rc.d/rc.sysinit
系統初始化腳本文件:/etc/rc.d/rc.sysinit的功能:
<1>設置主機名
<2>設置歡迎信息
<3>激活udev和selinux(udev主要是用來創建設備文件)
<4>掛載/etc/fstab文件中定義的所有文件系統
<5>檢測根文件系統,并以讀寫方式重新掛載根文件系統
<6>設置系統時鐘
<7>根據/etc/sysctl.conf文件的設定,來設定內核參數
<8>激活lvm及軟raid設備
<9>激活swap設備
<10>加載額外設備的驅動程序
<11>清理操作
10、系統相關運行級別上的相關服務
init在利用/etc/inittab配置文件,進行用戶空間系統初始化時,會有關于默認運行級別的定義,當定義好默認運行級別,利于/etc/rc.d/rc.sysinit完成系統初始化后,就會按照運行級別,來關閉、打開相應級別下的服務
各種服務的控制腳本程序是存放在/etc/rc.d/init.d/目錄下,然后各個對應級別下要關閉或開的程序以軟連接的方式存放在/etc/rc.d/rc運行級別.d/目錄下
以K開頭的表示要關閉的服務,后面數字表示優先級,數字越小,越先關閉
以S開頭的表示要開啟的服務,后面數字表示優先級,數字越小,越先開啟
一般是先關閉相關服務后,再開啟相關服務
/etc/rc.d/rc.local 該腳本為正常行級別的最后一個腳本,可以將一些希望開機時自動啟動,但又不合適編輯成服務腳本的一些命令或程序,寫在該文件中,單獨成行,即可完成開機自動啟動
建議在生產環境里面,將ctrl+alt+del里面重啟的快捷鍵禁用
對應的文件在/etc/init/control-alt-delete.conf里,可通過/etc/inittab獲知其定義信息
/etc/rc.d/init.d/下的腳本的格式:
這類腳本都需要在開頭注釋段標明:一般要接受至少start、stop、restart、status四個參數
#!/bin/bash
# crond start/stop the cron daemon 標明腳本功能 ,此項可以不寫
# chkconfig:2345 11 88 標明該服務腳本初始狀態下的運行級別,啟動優先級,關閉優先級,必須要寫
# description: 描述
功能代碼段
…
chkconfig命令管理系統服務腳本
利用chkconfig命令自動在各級別目錄下創建對應的K或S的鏈接文件,且可以管理服務腳本的開機啟動或關閉等
要想利用chkconfig進行管理,腳本必須要滿足上述注釋段的要求,然后將腳本放到/etc/init.d/目錄下
然后利用"chkconfig –add 腳本名 –level 運行級別" 將腳本添加到chkconfig可管理的列表中,不指定–level則默認是從腳本中讀取運行界別的定義。
添加完成后,可利用"chkconfig 腳本名 on|off"來管理腳本的啟動或關閉
將腳本移除chkconfig的管理列表:chkconfig –del 腳本名
查看所有服務腳本的運行級別的開機運行狀態:chkconfig
查看指定腳本的開機運行狀態:chkconfig 腳本名
修改腳本的運行級別:chkconfig [–level LEVELS] 腳本名 on|off|reset 表示將腳本的指定的級別是on還是off還是reset
–level LEVELS如果不指定,默認為2345級別
xinetd管理的服務
service 命令:手動管理服務
service 服務 start|stop|restart
service –status-all
瞬態( Transient)服務被xinetd進程所管理,進入的請求首先被xinetd代理
配置文件: /etc/xinetd.conf、 /etc/xinetd.d/<service>(每個被xinetd管理的服務在xinetd.d下都有一個對應的控制腳本)
用chkconfig控制的服務: chkconfig SERVICE_NAME on
第三章 系統啟動相關故障恢復和系統服務腳本案例
1、刪除initramfs文件,造成系統無法啟動,并恢復
(刪除initramfs文件后,如果沒有重啟系統,只需cd到/boot目錄,然后執行mkinitrd initramfs-`uname -r`.img `uname -r`命令,重新生成initramfs文件即可)
步驟一、刪除initramfs文件,重啟系統
步驟二、插入系統光盤,利用光盤引導進入緊急救援模式
步驟三、進入緊急救援模式后,chroot進入真正的根文件系統,運行mkinitrd命令生成新的initramfs文件
(主要要切換到/boot目錄下執行mkinitrd命令)
且命令格式為:mkinitrd initramfs-`uname -r`.img `uname -r`
文件生成完成后,重啟系統即可完成系統的進入
2、破解root用戶密碼
步驟一:啟動系統,在啟動前,按任意鍵,進入引導菜單界面
步驟二:按a鍵,進入grub引導編輯菜單界面,在后面添加1或者S或s或single然后回車進入單用戶模式
步驟三、運行passwd命令修改密碼,然后運行reboot重啟系統即可完成對root密碼的修改
3、編寫服務腳本/root/bin/testsrv.sh,完成如下要求
(1) 腳本可接受參數: start, stop, restart, status
(2) 如果參數非此四者之一,提示使用格式后報錯退出
(3) 如是start:則創建/var/lock/subsys/SCRIPT_NAME, 并顯示“啟動成功”
考慮:如果事先已經啟動過一次,該如何處理?
(4) 如是stop:則刪除/var/lock/subsys/SCRIPT_NAME, 并顯示“停止完成”
考慮:如果事先已然停止過了,該如何處理?
(5) 如是restart,則先stop, 再start
考慮:如果本來沒有start,如何處理?
(6) 如是status, 則如果/var/lock/subsys/SCRIPT_NAME文件存在,則顯示
“ SCRIPT_NAME is running…”
如果/var/lock/subsys/SCRIPT_NAME文件不存在,則顯示“ SCRIPT_NAME is stopped…”
其中: SCRIPT_NAME為當前腳本名
(7)可用chkconfig 和 service命令管理
腳本代碼為:
!/bin/bash #chkconfig:35 88 10 #description:nwc test service FILE=/testdir/server_file function START() { if [ -f $FILE ];then echo "$0 has been start" else touch $FILE && echo "Start success" || echo "Start fail" fi } function STOP() { if [ -f $FILE ];then rm -rf $FILE && echo "Stop success" || echo "Stop fail" else echo "$0 has been stopped" fi } function RESTART() { STOP START } function STATUS() { [ -f $FILE ] && echo "$0 is running..." || echo "$0 is stopped..." } case $1 in start) START ;; stop) STOP ;; restart) RESTART ;; status) STATUS ;; *) echo "Usage: $0 start|stop|restart|status" ;; esac
將腳本拷貝到/etc/rc.d/init.d/目錄下,并給予執行權限,過程和效果如下
[root@localhost ~]# cd /etc/rc.d/init.d/ [root@localhost init.d]# ll nwcservice -rwxr-xr-x 1 root root 644 9月 8 17:35 nwcservice [root@localhost init.d]# chkconfig --add nwcservice [root@localhost init.d]# chkconfig | grep "nwcservice" nwcservice 0:關閉 1:關閉 2:關閉 3:啟用 4:關閉 5:啟用 6:關閉 [root@localhost init.d]# chkconfig nwcservice on [root@localhost init.d]# service nwcservice start /etc/init.d/nwcservice has been start [root@localhost init.d]# service nwcservice stop Stop success [root@localhost init.d]# service nwcservice restart /etc/init.d/nwcservice has been stopped Start success [root@localhost init.d]# service nwcservice status /etc/init.d/nwcservice is running... [root@localhost init.d]# service nwcservice dsjhkdsa Usage: /etc/init.d/nwcservice start|stop|restart|status [root@localhost init.d]#
原創文章,作者:M20-1倪文超,如若轉載,請注明出處:http://www.www58058.com/44783
一如既往的認真,認真踏實,理論部分透徹,實驗部分完整,贊一個。