概述
了解系統的啟動流程,有助于我們了解Linux系統上的一些工作原理,有助于我們深入的理解一個系統的運作方式,那么本篇就以CentOS6系統為例,介紹一下有關Linux系統啟動相關的內容,分為一下幾個部分
1、Linux系統的一些基礎概念
2、CentOS6上的啟動流程概述
第一章 Linux系統的一些基礎概念
Linux系統的組成部分:內核(kernel)+根文件系統(rootfs)
rootfs:程序和glibc(GNU發布的libc庫)
庫:
函數集合,function,調用接口(頭文件負責描述)
過程調用:procedure,無返回值
函數調用:function
程序:二進制執行程序
內核:進程管理、內存管理、網絡協議棧、文件系統、驅動程序、安全功能
進程的通信
IPC:Inter Process Communication
消息隊列、semerphor、shm(共享內存):本地的通信機制
socket:跨主機的通信機制
運行中的系統環境可分為兩層:內核空間、用戶空間
用戶空間:應用程序(進程或線程)
內核空間:內核代碼(系統調用)
內核設計流派:
單內核設計:把所有的功能集成與同一個程序;
Linux
微內核設計:每種功能使用一個單獨的子系統實現;
Windows、Solaris
Linux內核特點:
支持模塊化: .ko(kernel object)
如:文件系統,硬件驅動,網絡協議等
支持模塊運行時動態裝載或卸載;
啟動分區:/boot
rootfs:遵循FHS目錄結構
如:/bin ,/sbin./lib,/etc,/etc,/proc,/sys,/dev,/boot
組成部分:
核心文件:/boot/vmlinuz-VERSION-release
在www.kernel.org的官方站點有各種內核版本
mainline:開發版本
stable:穩定版本
longterm:長期維護版本
ramdisk(輔助的偽根系統):系統在啟動時,根文件系統一定是在某個磁盤分區上,而內核如果沒有編譯該文件系統的相關驅動,就會導致系統無法正常啟動;并且內核需要夾在的各種模塊文件,其都在/lib/modules/目錄下,此目錄也必然是在根目錄下,而根無法驅動,也會造成模塊無法正常運行,進而不能進入系統.此時ramdisk的作用就體現出來,因為ramdisk是在/boot目錄下,/boot目錄是有grub的1.5階段進行驅動的,它的作用就是一個偽根系統,內核在啟動之后會驅動他到內存中,來對系統中的相關驅動和模塊進行啟動和運行,等待所有任務執行之后就會切換給真正磁盤根目錄.
Centos5:/boot/initrd-VERSION-release.img
Centos 6,7:/boot/initramfs-VERSION-release.img
模塊文件:/lib/modules/VERSION-release
如果安裝了多個內核版本,則對應的目錄下就有多個文件,或多個目錄
第二章 Centos系統的啟動流程
POST(Power On Self Test):加電自檢;
自檢主要是檢測一下硬件設備是否存在并且正常運行;這些自檢的功能是有一個軟件程序來實現的,這個軟件程序就是BIOS;
ROM:CMOS
BIOS:Basic Input and Output System
BIOS即基本輸入輸出系統,他是裝載與一個硬件芯片CMOS之上.
ROM+RAM
Boot Sequence(MBR):
按次序查找各引導設備,第一個有引導程序的設備即為本次啟動要用到的設備;
bootloader:引導加載器,程序;
linux:
LILO:LInux LOader
GRUB:Grand Uniform Bootloader
GRUB 0.X:Grub legacy
GRUB 1.X:Grub2
功能:提供一個菜單,允許用戶選擇要啟動的系統或不通的內核版本;把用戶選定的內核裝載到RAM中的特定空間中,解壓,展開,而后把系統控制權移交給內核;
MBR:Master Boot Record
512bytes:
446bytes:bootloader
64bytes:fat
2bytes:55AA
GRUB:
bootloader(MBR): 1st stage
Partltion:filesystem driver;1.5 stage
Partltion:/boot/grub;2nd stage
注意:UEFI,GPT
Kernel:
自身初始化:
探測可識別到的所有硬件設備;
加載硬件驅動程序;(有可能會借助于ramdisk加載驅動)
以只讀方式掛載跟文件系統;
運行用戶空間的第一個應用程序:/sbin/init
init程序的類型:
Centos 5-:SysV init
配置文件:/etc/inittab
每行定義一種action以及與之對應的process
id:runlevels:action:process
id:一個任務的標識符;
runlevels:在哪些級別下啟動此任務;(#,###,也可以為空,表示所有級別)
action:在什么條件下啟動此任務;
walt:等待切換至此任務所在的級別時執行一次;
respawn:一旦此任務終止,則自動重新啟動之;
initdefault:設定默認運行級別;此時,process省略;
sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit腳本;
例如:
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:walt:/etc/rc.d/rc 3
l1:1:walt:/etc/rc.d/rc 1
..........
l6:6:walt:/etc/rc.d/rc 6
意味著去啟動或者關閉/etc/rc3.d/目錄下的服務腳本所控制的服務;
K*:要停止的服務;K##*:優先級,數字越小,越是優先關閉;依賴的服務先關閉;而后關閉被依賴的;
S*:要啟動的服務;S##*:優先級,數字越小,越是優先開啟;被依賴的服務先啟動;而依賴的服務后啟動;
rc腳本:接受一個運行級別數字為參數;
腳本框架:
for srv in /etc/rc.d/rc#.d/K*;do
$srv stop
done
for srv in /etc/rc.d/rc#.d/S*;do
$srv start
done
/etc/init.d/* (/etc/rc.d/init.d/*)腳本執行方式:
# /etc/init.d/SRV_SCRIPT {start|stop|restart|status}
# service SRV_SCRIPT {start|stop|restart|status}
process:任務;
Centos 6-: Upstart
配置文件:/etc/inittab
Centos 7-:systemd
配置文件:/usr/lib/systemd/system/,/etc/systemd/system/
ramdisk:
Linux內核的特性之一:使用緩沖和緩存來加速對磁盤上的文件訪問;
ramdisk-->ramfs
Centos 5:initrd
工具程序:mkinitrd
Centos 6,7:initramfs
工具程序:dracut,mkinitrd
系統初始化流程(內核級別):
POST-->BootSequence(BIOS)-->BootLoader(MBR)-->kernel(ramdisk)-->rootfs(readonly)-->/sbin/init()
/sbin/init:
Centos 5: SysV init
運行級別:為了系統的運行或維護等目的設定的機制;
0-6:7個級別
0:關機,shutdown
1:單用戶模式(single user),root用戶,無須認證,維護模式;
2:多用戶模式(multi user),會啟動網絡功能,但不會啟動NFS;維護模式
3:多用戶模式(multi user),完全功能模式;文本界面;
4:預留級別:目前無特別使用目的,但習慣以同3級別功能使用;
5:多用戶模式(multi user),完全功能模式;圖形界面
6:重啟,reboot
默認級別:3,5
對于服務器一般為3,個人使用為5;
級別切換: init #
級別查看:
who -r
runlevel
N表示上一次級別
chkconfig命令:管控/etc/init.d/每個服務腳本在各級別下的啟動或關閉狀態;
查看: chkconfig --list [name]
添加: chkconfig --add name
能添加的服務的腳本定義格式之一:
#!/bin/bash
#
#chkconfig LLL KK SS
#description:
LLL:運行在哪些級別之上
KK:停止的優先級
SS:啟動的優先級
能添加的服務的腳本定義格式之二
### BEGIN INIT INFO
# Provides: foo
# Required-Start: bar
# Defalt-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: Foo init script
### END INIT INFO
刪除:chkconfig --del name
修改指定的鏈接類型:
chkconfig [--level LEVELS] name <on|off|reset>
--level LEVELS:指定要控制的級別;默認為2345
注意:正常級別下,最后啟動的一個服務S99local沒有鏈接至/etc/init.d下的某腳本,而是鏈接至了/etc/rc.d/rc.local腳本;為服務腳本的程序期望能開機自動運行時,直接放置于此腳本文件中即可
tty1:2345:respawn:/usr/sbin/mingetty tty1
....
tty6:2345:respawn:/usr/sbin/mingetty tty6
(1)mingetty會調用login程序;
(2)打開虛擬終端的程序除了mingetty之外,還有諸如getty等;
總結(用戶空間的啟動流程):/sbin/init(/etc/inittab)
設置默認運行級別-->運行系統初始化腳本,完成系統初始化-->關閉對應級別下需要停止的服務,啟動對應級別下需要開啟的服務-->設置登錄終端[-->啟動圖形終端]
系統初始化腳本:/etc/rc.d/rc.sysinit
(1)設置主機名;
(2)設置歡迎信息;
(3)激活udev和selinux;
(4)掛載/etc/fstab文件中定義的所有文件系統;
(5)檢測跟文件系統,并以讀寫方式重新掛載根文件系統;
(6)設置系統時鐘;
(7)根據/etc/sysctl.conf文件的設置,來設定內核參數;
(8)激活lvm及軟raid設備;
(9)激活swap設備;
(10)加載額外設備的驅動程序;
(11)清理操作;
Centos 6:
init程序:upstat,但依然為/sbin/init,其配置文件:
/etc/init/*.conf,/etc/inittab(僅用于定義默認運行級別)
注意:*.conf為upstat風格的配置文件;
rc.conf
rcS.conf
start-tty.conf
Centos 7:
init程序:systemd,配置文件:/usr/lib/systemd/system/*,/etc/systemd/system/*
完全兼容SysV腳本機制,因此,service命令依然可用;不過,建議使用systemct命令來控制服務;
#systemctl {start|stop|restart|status} name[.service]
原創文章,作者:Kartik,如若轉載,請注明出處:http://www.www58058.com/49685