http://wiki.jikexueyuan.com/project/learn-linux-step-by-step/images/5.bmp" alt="" />
系統(tǒng)的啟動(dòng)過(guò)程大致可以分為如下幾個(gè)步驟:
名詞解釋
BIOS:開機(jī)的時(shí)候計(jì)算機(jī)系統(tǒng)會(huì)主動(dòng)執(zhí)行的程序,它會(huì)識(shí)別第一個(gè)可開機(jī)的設(shè)備
MBR:第一個(gè)可開機(jī)設(shè)備的第一個(gè)扇區(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)行根目錄掛載時(shí)使用
根據(jù)以上啟動(dòng)流程:我的理解上這樣的一個(gè)流程
設(shè)備通電開機(jī) èBIOS 執(zhí)行 è 認(rèn)識(shí)第一個(gè)開機(jī)設(shè)備 è 將 MBR 內(nèi)容載入內(nèi)存
èbootloader 執(zhí)行 è 載入內(nèi)核與 initrdè 根目錄掛載 èinitè 登陸系統(tǒng)
Bootloader 能夠識(shí)別操作系統(tǒng)文件格式,所以可以解壓縮內(nèi)核到內(nèi)存中執(zhí)行,內(nèi)核在執(zhí)行中進(jìn)行測(cè)試與驅(qū)動(dòng)各個(gè)設(shè)備,由于驅(qū)動(dòng)(內(nèi)核模塊)是掛載到/lib/modules 下,如要讀取必要先掛在根目錄,可掛載根目錄必須讀取驅(qū)動(dòng)。此處就產(chǎn)生的了矛盾,因此為了解決這個(gè)問(wèn)題引入了 initrd, BootLoader 將initrd 解壓縮到內(nèi)存并在內(nèi)存中形成一個(gè)仿真的根目錄,加載啟動(dòng)時(shí)是必需的驅(qū)動(dòng),如磁盤的驅(qū)動(dòng),并完成根目錄實(shí)際的掛載,以完成后續(xù)的操作
(此流程是針對(duì) centos,不同的 UNIX LIKE 流程不盡相同,但思路是一致的)
在內(nèi)核加載完驅(qū)動(dòng)后,硬件就已經(jīng)準(zhǔn)備完畢了,此時(shí)內(nèi)核會(huì)主動(dòng)調(diào)用第一個(gè)進(jìn)程,即,Init 進(jìn)程,init 進(jìn)程開始開始執(zhí)行軟件環(huán)境,如服務(wù)的開啟,網(wǎng)絡(luò)的設(shè)置等。Init 所以操作都會(huì)記錄在其配置文件中/etc/inittab
其大致流程如下
Initè 讀取 init 配置文件并執(zhí)行里面的命令 è 執(zhí)行 runlevelè 執(zhí)行相應(yīng)的服務(wù)和服務(wù)è登錄圖形頁(yè)面(runlevel 5)
d:5:initdefault: =>默認(rèn)啟動(dòng)級(jí)別是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 => 重新啟動(dòng)組合鍵
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 處理工作
Init 配置文件(/etc/inittab)最重要的就是這個(gè)運(yùn)行時(shí)啟動(dòng)級(jí)別,對(duì)于 XWindow 來(lái)說(shuō)將 run level 分為7個(gè)等級(jí),每個(gè)等級(jí)只是所啟動(dòng)的服務(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)行等級(jí)
N 5
[root@bogon ~]# init 3 =>執(zhí)行runlevel 3
http://wiki.jikexueyuan.com/project/learn-linux-step-by-step/images/6.bmp" alt="" />
/etc/rc.d/下包含不同等級(jí)的 run level 的啟動(dòng)內(nèi)容,前面提到過(guò)不同的 run level 差別在于啟動(dòng)的服務(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下面啟動(dòng)的服務(wù)
K【數(shù)字】:K 代表停止。后面的數(shù)字代表的停止的順序
S【數(shù)字】:S 代表開啟。后面的數(shù)字代表的開啟的順序
在服務(wù)里面提到過(guò)為解決服務(wù)的依賴性因此需要制定服務(wù)啟動(dòng)停止的順序
用戶自定義開機(jī)啟動(dòng)程序(rc.local)
從上面服務(wù) runlevel5啟動(dòng)內(nèi)容中有一項(xiàng)是
lrwxrwxrwx 1 root root 11 02-18 20:05S99local -> ../rc.local
這個(gè) script 可以添加自定義的命令,從整個(gè)啟動(dòng)流程來(lái)看,它處于用戶登錄之前進(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)對(duì)比
~/.bash_profile 文件
文件加載時(shí)機(jī):用戶登錄完畢 。
特點(diǎn):只針對(duì)單一登錄用戶的個(gè)人設(shè)置
~./bash_loyout:
文件加載時(shí)機(jī):用戶注銷時(shí)。
特點(diǎn):只針對(duì)單一登錄用戶的個(gè)人設(shè)置
/etc/rc.local
文件加載時(shí)機(jī):init 啟動(dòng)流程。在用戶為登錄之前
特點(diǎn):不區(qū)分用戶的命令
/etc/init.d/
文件加載時(shí)機(jī):以服務(wù)的形式加載
特點(diǎn):可以針對(duì)不同的 runlevel 設(shè)置是否開啟服務(wù)
(此處無(wú)時(shí)機(jī)項(xiàng)目經(jīng)驗(yàn),只是簡(jiǎn)單對(duì)比,對(duì)于安全性方面無(wú)考慮)
前面提到了 initrd 的作用,現(xiàn)在查看下這個(gè)里面究竟包含什么
[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
……….
=>這里包含里就是啟動(dòng)時(shí)必需的內(nèi)核模塊
創(chuàng)建 initrd
正常安裝 unix like 版本是 initrd 是不需要額外創(chuàng)建的,但是有時(shí)候我們可能需要將一些其他的內(nèi)核模塊加到 initrd 中,此時(shí)就需要?jiǎng)?chuàng)建一個(gè)新的initrd
語(yǔ)法:mkinitrd [-v] [--with=模塊名稱] initrd 文件名內(nèi)核版本