鍍金池/ 教程/ Linux/ Linux 學(xué)習(xí)記錄--啟動流程
Linux 學(xué)習(xí)記錄--開機(jī)掛載錯誤
日志系統(tǒng)
數(shù)據(jù)流重定向
內(nèi)存交換空間的構(gòu)建
文件系統(tǒng)簡介
Linux 學(xué)習(xí)記錄--軟件安裝 RPM|SRPM|YUM
文件特殊權(quán)限
目錄配置 FHS
文件內(nèi)容查閱
Boot Loader
文件壓縮
Linux 學(xué)習(xí)記錄--文件權(quán)限
Linux 命令縮寫
命令與文件的查詢
文件|目錄的默認(rèn)權(quán)限與隱藏權(quán)限
shell script
服務(wù)
Linux 學(xué)習(xí)記錄--程序編譯與函數(shù)庫
正則表達(dá)式與其應(yīng)用
關(guān)機(jī)相關(guān)指令
shell
vim 與 vi 常用命令
系統(tǒng)調(diào)用:進(jìn)程控制
文件系統(tǒng)簡單操作
磁盤掛載與卸載
有名管道通訊
磁盤分區(qū),格式化與檢驗(yàn)
工作管理與進(jìn)程管理
匿名管道通訊
Linux 學(xué)習(xí)記錄--啟動流程
文件與目錄管理
管道命令
命名別名與歷史命令
文件備份|還原
shell變量
Linux 學(xué)習(xí)記錄--ACL 權(quán)限控制
內(nèi)核|內(nèi)核模塊編譯
文件管理相關(guān)系統(tǒng)編程

Linux 學(xué)習(xí)記錄--啟動流程

http://wiki.jikexueyuan.com/project/learn-linux-step-by-step/images/5.bmp" alt="" />

啟動流程

系統(tǒng)的啟動過程大致可以分為如下幾個步驟:

  1. 加載 BIOS 的硬件信息與進(jìn)行自我測試,并依據(jù)設(shè)置取得第一個可啟動的設(shè)備
  2. 讀取并執(zhí)行第一個啟動設(shè)備內(nèi) MBR 的 bootloader
  3. 依據(jù) boot loader 的設(shè)置加載 kernel,kernel 會開始檢測硬件與加載驅(qū)動程序
  4. 在硬件驅(qū)動成功后,Kernel 會主動調(diào)用 init 進(jìn)程,而 init 進(jìn)程回去的 run-level 信息
  5. Init 執(zhí)行/etc/rc.d/rc.sysinit 文件來準(zhǔn)備軟件執(zhí)行的操作系統(tǒng)(網(wǎng)絡(luò),時區(qū)等)
  6. Init 執(zhí)行 run-level 的各個服務(wù)的啟動
  7. Init 執(zhí)行/etc/rc.d/rc.local 文件
  8. Init 執(zhí)行終端機(jī)模擬程序 mingetty 來啟動 login 進(jìn)程,最后就等待用戶登錄

名詞解釋
BIOS:開機(jī)的時候計(jì)算機(jī)系統(tǒng)會主動執(zhí)行的程序,它會識別第一個可開機(jī)的設(shè)備
MBR:第一個可開機(jī)設(shè)備的第一個扇區(qū)內(nèi)的主引導(dǎo)分區(qū),內(nèi)包含 bootloader
Boot loader:可進(jìn)行內(nèi)核與虛擬文件系統(tǒng)加載的軟件
虛擬文件系統(tǒng)(initrd):內(nèi)存中仿真的根目錄,用于當(dāng) loader 不能進(jìn)行根目錄掛載時使用

根據(jù)以上啟動流程:我的理解上這樣的一個流程

設(shè)備通電開機(jī) èBIOS 執(zhí)行 è 認(rèn)識第一個開機(jī)設(shè)備 è 將 MBR 內(nèi)容載入內(nèi)存
èbootloader 執(zhí)行 è 載入內(nèi)核與 initrdè 根目錄掛載 èinitè 登陸系統(tǒng)

Bootloader 能夠識別操作系統(tǒng)文件格式,所以可以解壓縮內(nèi)核到內(nèi)存中執(zhí)行,內(nèi)核在執(zhí)行中進(jìn)行測試與驅(qū)動各個設(shè)備,由于驅(qū)動(內(nèi)核模塊)是掛載到/lib/modules 下,如要讀取必要先掛在根目錄,可掛載根目錄必須讀取驅(qū)動。此處就產(chǎn)生的了矛盾,因此為了解決這個問題引入了 initrd, BootLoader 將initrd 解壓縮到內(nèi)存并在內(nèi)存中形成一個仿真的根目錄,加載啟動時是必需的驅(qū)動,如磁盤的驅(qū)動,并完成根目錄實(shí)際的掛載,以完成后續(xù)的操作

Init 處理流程

(此流程是針對 centos,不同的 UNIX LIKE 流程不盡相同,但思路是一致的)
在內(nèi)核加載完驅(qū)動后,硬件就已經(jīng)準(zhǔn)備完畢了,此時內(nèi)核會主動調(diào)用第一個進(jìn)程,即,Init 進(jìn)程,init 進(jìn)程開始開始執(zhí)行軟件環(huán)境,如服務(wù)的開啟,網(wǎng)絡(luò)的設(shè)置等。Init 所以操作都會記錄在其配置文件中/etc/inittab

其大致流程如下
Initè 讀取 init 配置文件并執(zhí)行里面的命令 è 執(zhí)行 runlevelè 執(zhí)行相應(yīng)的服務(wù)和服務(wù)è登錄圖形頁面(runlevel 5)

init 配置文件

d:5:initdefault: =>默認(rèn)啟動級別是5

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit =>初始化操作

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6

# Trap CTRL-ALT-DELETE => 重新啟動組合鍵
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

# When our UPS tells us power has failed, assume we have a few minutes
# of power left.  Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.  
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm –nodaemon

init 處理工作

  1. 取得 runlevel 默認(rèn)級別。這里是5
  2. 執(zhí)行 script /etc/rc.d/rc.sysinit 進(jìn)行初始化
  3. 因?yàn)?run level 是5,所以執(zhí)行5:5:wait:/etc/rc.d/rc 5
  4. 設(shè)置重啟組合鍵[ctrl]+[alt]+[del]
  5. 設(shè)置不斷電系統(tǒng) pr 與 pf
  6. 啟動6個終端機(jī)
  7. 啟動圖形界面

runlevel 介紹

Init 配置文件(/etc/inittab)最重要的就是這個運(yùn)行時啟動級別,對于 XWindow 來說將 run level 分為7個等級,每個等級只是所啟動的服務(wù)不盡相同 0- halt:系統(tǒng)直接關(guān)機(jī)
1- single user mode:單用戶模式
2- multi user without NFS
3- full multi user mode: 命令行模式
4- unused
5- X11:圖形模式
6- rboot:重啟模式

舉例:

[root@bogon ~]# runlevel =>查看當(dāng)前運(yùn)行等級
N 5
[root@bogon ~]# init 3 =>執(zhí)行runlevel 3

http://wiki.jikexueyuan.com/project/learn-linux-step-by-step/images/6.bmp" alt="" />

runlevel 程序與服務(wù)

/etc/rc.d/下包含不同等級的 run level 的啟動內(nèi)容,前面提到過不同的 run level 差別在于啟動的服務(wù)不同

[root@bogon ~]# ll /etc/rc.d/rc5.d/
lrwxrwxrwx 1 root root 17 02-18 20:06 K01dnsmasq -> ../init.d/dnsmasq
lrwxrwxrwx 1 root root 19 02-18 20:14 K01rgmanager -> ../init.d/rgmanager
…..
lrwxrwxrwx 1 root root 16 02-18 20:07 S56xinetd -> ../init.d/xinetd
lrwxrwxrwx 1 root root 18 02-18 20:06 S80sendmail -> ../init.d/sendmail
…….
lrwxrwxrwx 1 root root 11 02-18 20:05 S99local -> ../rc.local
lrwxrwxrwx 1 root root 21 02-18 20:12 S99modclusterd -> ../init.d/modclusterd

上面可以看到的 runlevel 5下面啟動的服務(wù)
K【數(shù)字】:K 代表停止。后面的數(shù)字代表的停止的順序
S【數(shù)字】:S 代表開啟。后面的數(shù)字代表的開啟的順序
在服務(wù)里面提到過為解決服務(wù)的依賴性因此需要制定服務(wù)啟動停止的順序

用戶自定義開機(jī)啟動程序(rc.local)

從上面服務(wù) runlevel5啟動內(nèi)容中有一項(xiàng)是
lrwxrwxrwx 1 root root 11 02-18 20:05S99local -> ../rc.local
這個 script 可以添加自定義的命令,從整個啟動流程來看,它處于用戶登錄之前進(jìn)行的

#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

用戶執(zhí)行自定義命令位置點(diǎn)對比

~/.bash_profile 文件
文件加載時機(jī):用戶登錄完畢 。 特點(diǎn):只針對單一登錄用戶的個人設(shè)置

~./bash_loyout:
文件加載時機(jī):用戶注銷時。
特點(diǎn):只針對單一登錄用戶的個人設(shè)置

/etc/rc.local
文件加載時機(jī):init 啟動流程。在用戶為登錄之前
特點(diǎn):不區(qū)分用戶的命令

/etc/init.d/
文件加載時機(jī):以服務(wù)的形式加載
特點(diǎn):可以針對不同的 runlevel 設(shè)置是否開啟服務(wù)

(此處無時機(jī)項(xiàng)目經(jīng)驗(yàn),只是簡單對比,對于安全性方面無考慮)

虛擬文件系統(tǒng)(initrd)

前面提到了 initrd 的作用,現(xiàn)在查看下這個里面究竟包含什么

[root@localhost tmp]# mkdir /tmp/initrd
[root@localhost tmp]# cp /boot/initrd-2.6.18-371.el5.img /tmp/initrd/
[root@localhost tmp]# ll ./initrd/
-rw------- 1 root root 2748313 03-31 09:59 initrd-2.6.18-371.el5.img
[root@localhost tmp]# mv ./initrd/initrd-2.6.18-371.el5.img ./initrd/initrd-2.6.18-371.el5.gz
[root@localhost tmp]# ll ./initrd/
-rw------- 1 root root 2748313 03-31 09:59 initrd-2.6.18-371.el5.gz
[root@localhost tmp]# cd initrd/
[root@localhost initrd]# gzip -d ./initrd-2.6.18-371.el5.gz 
[root@localhost initrd]# ll

-rw------- 1 root root 6332928 03-31 09:59 initrd-2.6.18-371.el5
[root@localhost initrd]# file initrd-2.6.18-371.el5 
initrd-2.6.18-371.el5: ASCII cpio archive (SVR4 with no CRC)
[root@localhost initrd]# cpio -ivcdu <./initrd-2.6.18-371.el5 
…….
[root@localhost initrd]# ll
drwx------ 2 root root    4096 03-31 10:03 bin
drwx------ 3 root root    4096 03-31 10:03 dev
drwx------ 2 root root    4096 03-31 10:03 etc
-rwx------ 1 root root    2708 03-31 10:03 init
drwx------ 3 root root    4096 03-31 10:03 lib
drwx------ 2 root root    4096 03-31 10:03 proc
lrwxrwxrwx 1 root root       3 03-31 10:03 sbin -> bin
drwx------ 2 root root    4096 03-31 10:03 sys
drwx------ 2 root root    4096 03-31 10:03 sysroot
=>和根目錄結(jié)構(gòu)很像

 [root@localhost initrd]# cd ./lib/;ll
-rw------- 1 root root  31664 03-31 10:03 ata_piix.ko
-rw------- 1 root root  18060 03-31 10:03 dm-log.ko
……….
=>這里包含里就是啟動時必需的內(nèi)核模塊

創(chuàng)建 initrd

正常安裝 unix like 版本是 initrd 是不需要額外創(chuàng)建的,但是有時候我們可能需要將一些其他的內(nèi)核模塊加到 initrd 中,此時就需要創(chuàng)建一個新的initrd

語法:mkinitrd [-v] [--with=模塊名稱] initrd 文件名內(nèi)核版本