前言:
了解系統內核基本知識
-
內核功能:進程管理、內存管理、網絡協議棧、文件系統、驅動程序、安全功能等
-
用戶空間:應用程序其中有進程或者線程
-
運行中的系統可分為兩層:
內核空間
、用戶空間
-
內核設計流派:
-
單內核設計:把每種功能集成于一個程序中;例如:
linux
-
微內核設計:每種功能使用一個單獨的子系統實現;例如:
Windows
,Solaris
linux內核的特點:
支持模塊化:.ko
(kernel object)
支持模塊運行時動態裝載和卸載;其中linux內核的組成部分:
核心文件:/boot/vmlinuz-VERSION-release
ramdisk:
centos5:/boot/initrd-VERSION-release.img
centos6和7:/boot/initramfs-VERSION-release.img
模塊文件:/lib/modules/VERSION-release
系統啟動流程
-
簡單描述:
系統初始化流程:
內核級別: POST–>Bootsequence(BIOS)
–>Bootloader(MBR)–>kernel(ramdisk)
–>rootfs(readonly)
–>/sbin/init(/etc/inittab)
用戶級別: 設置默認運行級別–>運行系統初始化腳本,完成系統初始化rc.sysinit
–>關閉對應級別下面要停止的服務,啟動對應級別下面要開啟的服務–>設置登錄終端–>[]啟動圖像終端] -
詳細介紹:
POST:開機自檢<加電自檢>完成對硬件的檢測;是BIOS功能的一個主要部分,負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、串并行接口、鍵盤、CD-ROM光驅等硬件情況的檢測;如某些硬件出現錯誤無法通過檢測就導致系統無法啟動,POST完成之后將被清出內存;
Bootsequence(BIOS):按次序查找引導設備,第一個有引導程序的設備就是本次啟動用到的設備。進行設備的枚舉和初始化,按CMOS的設置所有處于活動狀態并且可引導的設備
(floppy、CD-ROM、USB、DISK、NFS)
,加載主引導記錄(MBR)
到內存中,然后BIOS將控制權給下一步BOOTLOADER
;BOOTLOADER(MBR):引導加載器,程序;MBR
前446bytes;
功能:提供一個菜單,允許用戶選擇要啟動系統或不同的內核版本;把用戶選定的內核裝載到內存中的特定空間中,解壓、展開;而后把系統控制權移交給內核;kernel 內核自身初始化
啟動
init
進程init 以守護進程方式存在,是所有其他進程的祖先(PID=1),init 進程非常獨特,能夠完成其他進程無法完成的任務。
程序類型:CentOS5-
:sysv init
配置文件:/etc/inittab
CentOS6
:upstart(并發啟動)
配置文件:/etc/inittab
、/etc/init/*.conf
CentOS7
:systemd
配置文件:/usr/lib/systemd/system/
/etc/systemd/system/*
-
系統進入
runlevel
-
運行系統初始化腳本
/etc/rc.d/rc.sysinit
-
運行指定運行級別對應的目錄下的腳本,
/etc/rc.d/rc#.d/
目錄下的服務腳本 -
捕獲組合鍵的定義
-
定義電源
fail/restore
腳本 -
啟動 getty 和虛擬控制臺
-
用戶級別:
init
通過讀取/etc/inittab
文件來完成系統初始化過程: -
探測可識別到的所有硬件設備;
-
加載設備驅動程序(有可能會借助ramdisk加載驅動);
-
以只讀方式掛載根文件系統;
-
運行用戶空間的第一個應用程序:/sbin/init
-
LILO
:LInux LOader (無法支持大硬盤分區) -
GRUB 0.X
:[centos5,6] grub legacy (經典),各種安卓手機使用 ; -
GRUB 1.X
:[centos7] grub2 -
Windows:
ntloader
,僅是啟動OS -
Linux:
-
linux內核特征之一:使用緩沖和緩存來加速對磁盤上的文件進行訪問;
-
ramdisk
-(磁盤)轉換成ramfs
(文件系統),提高速度; -
centos5
:initrd
,工具程序:mkinitrd
-
centos6,7
:initramfs
,工具程序:dracut
,mkinitrd
工作原理介紹:
MBR(master boot record)主引導記錄
MBR
共有512bytes
,其中446bytes
為主引導記錄bootloader
,另外的64bytes
為分區表fat
,其中包含4
個分區表記錄,以16bytes
為一個分區劃分記錄,最后2bytes
為MBR
的有效性檢測55AA
;
GRUB(bootloader)
grub:
Grub unified bootloader
,grub
向用戶提供了更好的開機體驗,加入了開機的菜單、開機圖片等更多的功能,而這種功能bootloader
不能提供,grub
分為三個階段(grub legacy):
一階段:
primary boot loader
:1st stage
分區引導加載
功能:此階段在bootloader
中,bootloader
不在直接加載內核,而是加載grub
的第二階段;bootloader
備份在了/boot/grub/stage1
中二階段:
parition
:filesystem driver
:1.5stage
文件系統接口。功用:提供文件系統驅動,方便虛擬系統的生成,讓stage1
中的bootloader
能識別stage2
所在分區上的文件系統;三階段:
partition /boot/grub
:2nd stage
,分區文件,不支持復雜邏輯軟raid等,僅支持基本分區(內核文件只能放在基本磁盤分區上),通過讀取/etc/grub.conf
文件,顯示出內核列表,指定了內核鏡像和initrd
所在的分區為root
,設定內核參數,并加載vmlinuz
和initramfs
這兩個文件到內存中。在這一階段可以編輯啟動項目。如指定根分區root
,內核kernel
,initrd
鏡像等;也可以進入grub command line
手動寫啟動信息。
功用:1、提供菜單、并提供交互式接口;[e
:編輯模式,用于編輯菜單;c
:命令接口];2、加載用戶選擇的內核或操作系統允許傳遞參數給內核,可隱藏此菜單;3、為菜單提供保護機制,為編輯菜單進行認證,為啟動內核或操作系統進行認證;
GRUB
管理開機啟動的過程分成了三個階段.。tage1
主要負責BIOS
和GRUB
之間的交接。這部分才是真正放在MBR
中的bootloader
。而后stage1.5
是連接stage1
和stage2
之間的通道,起著過渡的作用。最后才是GRUB
中真正核心的部分stage2
,它可以讓用戶以選項的方式將操作系統加載、修改選項和內核參數。
kernel工作方式:
工作原理:當內核映像被加載到內存中,并且stage2 的引導加載程序釋放控制權之后,內核階段就開始了,內核在完成自身的初始化之后進行探測可識別的所有硬件設備,由于內核中只包含了少量的硬件驅動,此時會借助內存中的
initrd
根文件系統加載相關驅動程序。當內核具備訪問根文件系統功能時(rootfs
),initrd
根文件系統將被卸載,并掛載真正的根文件系統。這就是內核的初始化過程,系統已經脫離了/boot
分區,獨立存活在內存中。
vmlinuz-xxx
內核鏡像是一個zImage
(壓縮映像,小于512KB
)或一個bzImage
(較大的壓縮映像,大于512KB
),它是使用zlib
進行壓縮過的內核文件。
initramfs-xxx.img
是由stage2
引導加載程序加載到內存中的,它會被復制到RAM
中并掛載到系統上。這個initrd
會作為RAM
中的臨時根文件系統使用,并允許內核在沒有掛載任何物理磁盤的情況下完整地實現引導。initrd
文件包括可加載模塊的驅動程序,為內核提供可訪問磁盤和磁盤上的文件系統的接口,并為其他硬件提供了驅動程序。由于根文件系統是磁盤上的一個文件系統,因此內核通過initrd
取得根分區的訪問,并掛載真正的根文件系統。這是一個解包的initramfs
鏡像文件。
用戶級別啟動
-
首先系統通過讀取
/etc/inittab
文件來完成系統的初始化過程; -
inittab文件
inittab
文件表示的為系統init
初始化程序用到的配置文件。這個文件負責設置init
初始化程序初始化腳本在哪里;每個運行級初始化時運行的命令; 開機、關機、重啟對應的命令;各運行級登陸時所運行的命令。inittab
文件中,每一行定義一種action
以及與之對應的process
.
基本格式:
id
:runlevels
:action
:process
ID:一個任務的標識符;
runlevels:在哪些級別啟動此任務;#,###,也可以為空,表示所有級別;
action:在什么條件下啟動此任務;
process:執行的任務;
runlevel
:Sysvinit
讀取/etc/inittab
文件中是否含有initdefault’
項,有則init
將啟動默認運行的模式。如果沒有默認的運行模式,將進入系統控制臺,手動決定進入何種運行模式。
一共有7個(0-6)運行級別:
0
:關機,shutdown
;1
:單用戶模式(singler user
),root
用戶無須認證,此為維護模式;2
:多用戶模式(multi user
),會啟動網絡功能,但不會啟動NFS
,維護模式;3
:多用戶模式(Full multiuser mode
),完全功能模式,文本界面;4
:預留級別:目前無特別適合目的,但習慣以同3級別功能使用;5
:多用戶模式(multi user
),完全功能,圖形界面;6
:重啟,reboot
;
其中默認級別:3
和5
級別切換:init
命令
級別查看:who -r
、runlevel
其中
ACTION
常見的有4中動作:
1、wait:
等待切換至此任務所在的級別時執行一次;
2、respawn:
一旦此任務終止,就自動重新啟動之;
3、initdefault:
設定默認運行級別;
4、sysinit:
設定系統初始化方式,此處一般指定/etc/rc.d/rc.sysinit
系統初始化腳本:/etc/rc.d/rc.sysinit
此文件初始化過程中主要功用:
-
設置主機名
-
設置歡迎信息
-
激活
UDEV
和SELINUX
-
掛載
/etc/fstab
文件中定義的所有文件系統 -
檢測根文件系統,并以讀寫方式重新掛載根文件系統
-
設置系統時鐘
-
根據
/etc/sysctl.conf
文件的設置,來設置內核參數 -
激活
lvm
及軟raid
設備 -
激活
swap
設備(此操作在fstab
中以執行) -
加載額外設備的驅動文件
-
清理操作(過去的
lock
和pid
文件)
/etc/rc.d/rc 和/etc/rc.d/rc#.d/ 介紹
rc
是個腳本,后面接參數。如:l5:5:wait:/etc/rc.d/rc 5
wait
意味著init
系統將等待rc
啟動服務腳本i0:0:wait:/etc/rc.d/rc3
意味著去啟動或關閉/etc/rc.d/rc3.d/
目錄下的服務腳本所控制服務
rc
根據runlevel
執行rc#.d
目錄下啟動腳本。每個runlevel
都有一個對應的rc#.d
目錄;
其中在這些目錄下存放著很多不同的腳本,文件名以S
開頭的腳本表示在當前runlevel
中啟動,K開頭的腳本表示不在當前runlevel中啟動;
K*:要啟動的服務;K##*
,優先級,數字越小,越先關閉;依賴的服務先關閉,而后關閉被依賴的;
S*:要啟動的服務;S##*
,優先級,數字越小,越是優先啟動;被依賴的服務先啟動,而依賴的服務后啟動;
在
/etc/rc.d/rc#.d
目錄下的腳本其實都是一些軟鏈接文件,真實的腳本文件存放在/etc/init.d
目錄下,也就是說在/etc/init.d
目錄下的文件會自動以S##script
或K##script
的軟鏈接存在于各 runlevel 的目錄下
/etc/rc.d/rc.local
正常級別下,最后啟動的一個服務S99local
沒有鏈接至/etc/init.d
下的某腳本,而是鏈接至了/etc/rc.d/rc.local
(/etc/rc.local
)腳本;因此,不便或不需為服務腳本的程序期望能開機自動運行時,直接放置此腳本文件中即可;
init在等待/etc/rc.d/rc執行完畢之后,將在指定的各個虛擬終端上運行/sbin/mingetty,等待用戶的登錄。 至此,Linux的啟動完成
-
tty1:2345:respawn:/usr/sbin/mingetty tty1
…tty6:2345:respawn:/usr/sbin/mingetty tty6
注意:
1、mingetty
調用login
程序;
2、打開虛擬終端的程序出了mingetty
之外,還有諸多getty
等;
命令行中的操作:
gurb的命令行接口操作
help
:獲取幫助列表help KEYWORD
:獲取詳細幫助信息find (hd#,#) /path/to/somefile
root (hd#,#)
kernel /path/to/kernel_file
:設定本次啟動時用到的內核文件;額外還可以添加許多內核支持使用的cmdline參數
例如:init=/path/toinit
,selinux=0
initrd:/path/to/initramfs_file
:設定為選定的內核提供額外文件的ramdisk
;boot
:引導啟動選定的內核;
-
如何識別設備:
(hd#,#)
hd#
:磁盤編號,用數字標示:從0
開始編號#
:分區編號,用數字標示;從0
開始編號
手動在grub命令行接口啟動系統:
grub> root(hd#,#)
grub> kernel /vmlinuxz-VERSION-RELEASE ro root/dev/DEVICE
grub> initrd /initramfs-VERSION-release.img
grub> boot
在配置文件中操作:
配置文件:/boot/grub/grub.conf
配置項:default=#:
設定默認啟動的菜單項:菜單項(title
)編號從0
開始timeout=#
:指定菜單項等待選項選擇的時長;splashimage
=(hd#,#)/PATH/TO/XPAM_PIX_FILE
:指明菜單背景圖片文件路徑;hiddenmenu
:隱藏菜單;password [--md5] STRING
:菜單編輯認證;title TITLE
:定義菜單項”標題”,可出現多次;root(hd#,#)
:grub查找stage2
及kernel
文件所在設備分區;為grub
的”根
”kernel /PATH/TOVMLINUZ_FILE [PARAMETERS]
:啟動的內核initrd /PATH/TO/INITRAMFS_FILE
:內核匹配的ramfs
文件;password [--md5] STRING
:啟動選定的內核或操作系統時進行認證;(grub-md5-crypt)
進入單用戶模式:
-
編輯
grub
菜單(選定要編輯的title
,而后使用e
命令); -
在選定的
kernel
后附加 -
s
,S
或single
都可以 -
在
kernel
所在行,鍵入b
命令
安裝grub
:
-
在系統中安裝:
grub-install
grub-install --root-directory=ROOT /dev/DISK
-
在grub表中安裝:
grub
grub> root (hd#,#)
grub> setup (hd#)
原創文章,作者:N22-白蟻,如若轉載,請注明出處:http://www.www58058.com/47130