系統啟動和內核管理(一)
(以CentOS5/6為例)
一、Linux的組成:
1、Linux:kernel+rootfs
kernel:進程管理、內存管理、網絡管理、驅動程序、文件系統、安全功能。
rootfs:程序和glibc
庫:函數集合,function,調用接口(頭文件負責描述);
過程調用,procedure,無返回值;
函數調用,function;
程序,二進制執行文件
2、內核設計流派:單內核,把所有的功能集成于同一個程序;微內核,每種功能使用一個單獨子系統實現。
3、Linux的內核:
(1)內核特點:支持模塊化(.ko,內核對象);支持內核模塊的動態裝載和卸載
(2)組成部分:核心文件,/boot/vmlinuz-3.10.0-327.el7.x86_64 (CentOS7)
ramdisk:輔助的偽根系統
CentOS 5: /boot/initrd-VERSION-release.img
CentOS6,7: /boot/initramfs-VERSION-release.img
(3)模塊文件:/lib/modules/3.10.0-327.el7.x86_64/ (CentOS6)
二、Linux的啟動流程及功能模塊講解:
1、CentOS6的啟動流程:
MBR:446: bootloader,64: 分區表, 2: 55AA (破壞其中的一個字節都啟動不了,命令#dd if=/dev/zero of=/dev/sda bs=1 count=1,請謹慎操作該命令)
GRUB:primary boot loader :1st stage,1.5 stage;secondary boot loader :2nd stage,分區文件
kernel:自身初始化;探測可識別到的所有硬件設備;加載硬件驅動程序(可能借助于ramdisk加載驅動);以只讀方式掛載根文件系統;運行用戶空間的第一個應用程序:/sbin/init
由下圖中的紅色框標示的程序解決加載啟動時跟文件系統的格式模塊問題:
將initramfs-2.6.32-642.el6.x86_64.img重命名成initramfs-2.6.32-642.el6.x86_64.img.gz后,使用gunzip命令解壓,得到還是initramfs-2.6.32-642.el6.x86_64.img,使用命令file可以看出該文件是cpio壓縮文件,使用命令cpio -id 解壓可以得到
如下圖的解壓文件,相當于一個根(虛擬根)結構文件:
啟動流程步驟說明:(1)加載BIOS的硬件信息,獲取第一個啟動設備。
(2)讀取第一個啟動設備MBR的引導加載程序(grub)的啟動信息
(3)加載核心操作系統的核心信息,核心開始解壓縮,并嘗試驅動所有的硬件設備。
(4)核型執行init程序并獲取運行信息。
(5)Init執行/etc/rc.d/rc.sysinit文件。
(6)啟動核心的外掛模塊(/etc/modprobe.conf)。
(7)Init執行運行的各個批處理文件(scripts).
(8)Init執行/etc/rc.d/rc.local.
(9)執行/bin/login程序,等待用戶登錄。
(10)登錄之后開始以Shell控制主機。
2、POST:加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、串并行接口、鍵盤、CD-ROM光驅等硬件情況的檢測。
ROM:BIOS,Basic Input and Output System,保存著有關計算機系統最重要的基本輸入輸出程序,系統信息設置、開機加電自檢程序和系統啟動自舉程序等。
RAM:CMOS互補金屬氧化物半導體,保存各項參數的設定
按次序查找引導設備,第一個有引導程序的設備為本次啟動設備
3、bootloader:引導加載器,引導程序
Windows:ntloader,僅是啟動OS
Linux:功能豐富,提供菜單,允許用戶選擇要啟動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓、展開,并把系統控制權移交給內核
4、init程序的類型:
SysV:init, CentOS 5之前;配置文件:/etc/inittab
Upstart:init,CentOS6;配置文件:/etc/inittab, /etc/init/*.conf
Systemd:systemd, CentOS 7;配置文件:/usr/lib/systemd/system,/etc/systemd/system
5、ramdisk:
內核中的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問
ramdisk–> ramfs提高速度
CentOS 5: initrd, 工具程序:mkinitrd(修復工具)
CentOS 6: initramfs,工具程序:mkinitrd, dracut
注:修復initramfs-2.6.32-642.el6.x86_64.img,先掛載光盤,進入救援模式;執行命令#mkinitrd /boot/initramfs-`uname -r`.img `uname -r` 即可(CentOS5,將initramfs改成initrd)
6、運行級別:(/sbin/init CentOS6之前)
運行級別:為系統運行或維護等目的而設定;0-6:7個級別
0:關機
1:單用戶模式(root自動登錄), single, 維護模式
2: 多用戶模式,啟動網絡功能,但不會啟動NFS;維護模式
3:多用戶模式,正常模式;文本界面
4:預留級別;可同3級別
5:多用戶模式,正常模式;圖形界面
6:重啟
默認級別:3, 5
切換級別:init #
查看級別:runlevel; who -r
7、init初始化:
init讀取其初始化文件:/etc/inittab
初始運行級別(RUN LEVEL)
系統初始化腳本
對應運行級別的腳本目錄
捕獲某個關鍵字順序
定義UPS電源終端/恢復腳本
在虛擬控制臺生成getty
在運行級別5初始化X
8、CentOS5的inittab文件
(1)配置文件:/etc/inittab,每一行定義一種action以及與之對應的process
(2)格式:id:runlevel:action:process
級別格式定義如下:
id:3:initdefault: 默認級別模式為3,字符界面
si::sysinit:/etc/rc.d/rc.sysinit 無論是任何級別模式,系統都需要讀取初始化文件
l0:0:wait:/etc/rc.d/rc0
l1:1:wait:/etc/rc.d/rc1…
……………………
l6:6:wait:/etc/rc.d/rc6
(3)action選項:wait: 切換至此級別運行一次
respawn:此process終止,就重新啟動之
initdefault:設定默認運行級別;process省略
(4)sysinit:設定系統初始化方式(腳本),此處一般為指定/etc/rc.d/rc.sysinit
A、 設置主機名;B、設置歡迎信息;C、激活udev和selinux
D、掛載/etc/fstab文件中定義的文件系統
E、檢測根文件系統,并以讀寫方式重新掛載根文件系統
F、設置系統時鐘;G、激活swap設備;H、根據/etc/sysctl.conf文件設置內核參數
I、激活lvm及software raid設備;K、加載額外設備的驅動程序;L、清理操作
(5)快捷鍵關機(Ctrl+Alt+Delete):ca::ctrlaltdel:/sbin/shutdown -t3 -r now (建議注銷掉該項)
9、CentOS6 /etc/inittab和相關文件
/etc/inittab:設置系統默認的運行級別
id:3:initdefault:
/etc/init/control-alt-delete.conf
/etc/init/tty.conf
/etc/init/start-ttys.conf
/etc/init/rc.conf
/etc/init/prefdm.conf
三、服務啟動流程:
1、當系統默認啟動的級別是3的時候,會讀取/etc/rc.d/rc3.d;該目錄下存放的都是服務程序。
無論是任何的一種啟動模式,其對應目錄下的服務都是軟鏈接指向:
(K開頭的服務的關閉的;S開頭的是開啟運行的)
K*: K##*:##運行次序;數字越小,越先運行;數字越小的服務,通常為依賴到別的服務
S*: S##*:##運行次序;數字越小,越先運行;數字越小的服務,通常為被依賴到的服務
# cat /etc/rc.d/rc
2、chkconfig命令:
(1)查看服務在所有級別的啟動或關閉設定情形:chkconfig [–list] [name]
(2)添加/刪除服務命令:chkconfig –add name;chkconfig –del name(移除服務后,原文件不會被刪除,需要到/etc/init.d目錄下手動刪除相應的文件)
(3)服務腳本的頂頭格式設置:
#!/bin/bash
#
#chkconfig:– 91 35
#description:服務名稱 script
#LLLL 表示初始在哪個級別下啟動,–表示都不啟動。(eg:# chkconfig: LLLL nn mm,nn表示的是以S開頭的數字,mm表示的是以K開頭的數字)
(4)ntsysv命令:字符界面修改當前模式下的服務啟動與停止;命令修改當前模式下指定的服務啟動與停止,命令#chkconfig[–level levels] name <on|off|reset>;字符界面指定修改那個模式下的服務,命令#ntsysv –level=#
四、xinetd管理的服務:
#chkconfig telnet on 其實修改的是下圖的文件:
1、service 命令:手動管理服務
service 服務start|stop|restart
service –status-all
2、瞬態(Transient)服務被xinetd進程所管理
進入的請求首先被xinetd代理
配置文件:/etc/xinetd.conf、/etc/xinetd.d/<service>
與libwrap.so文件鏈接
用chkconfig控制的服務:chkconfig tftp on
注意:
正常級別下,最后啟動一個服務S99local沒有鏈接至/etc/rc.d/init.d這個服務腳本,而是指向了/etc/rc.d/rc.local腳本
不便或不需寫為服務腳本放置于/etc/rc.d/init.d/目錄,且又想開機時自動運行的命令,可直接放置于/etc/rc.d/rc.local文件中
/etc/rc.d/rc.local在指定運行級別腳本后運行
可以根據情況,進行自定義修改
五、tty終端設置:
1:2345:respawn:/usr/sbin/mingettytty1
2:2345:respawn:/usr/sbin/mingettytty2
…
6:2345:respawn:/usr/sbin/mingettytty6
mingetty會自動調用login程序
x:5:respawn:/etc/X11/prefdm –nodaemon (圖形界面)
總結:/sbin/init–> (/etc/inittab) –> 設置默認運行級別–> 運行系統初始腳本、完成系統初始化–> (關閉對應下需要關閉的服務)啟動需要啟動服務–> 設置登錄終端
CentOS 6 init程序為: upstart, 其配置文件:
/etc/inittab, /etc/init/*.conf,配置文件的語法遵循upstart配置文件語法格式,和CentOS5不同
破解root密碼:將機器重啟(前提是在機器面前),啟動界面開始時按任意鍵,輸入“a”,然后再輸入1(選擇1模式)或者s或者S或者single
演示服務添加與刪除:
(1)在/etc/init.d目錄下新建個腳本testscript,并賦予執行權限
(2)添加腳本到服務中:
(3)測試添加的服務:
(4)刪除添加的服務:
原創文章,作者:Aaron_wang,如若轉載,請注明出處:http://www.www58058.com/44677
總結的很好,但對于一些關鍵詞,希望能通過一些通俗易懂的話描述出來,這會讓文章更具有可讀性。