標籤:linux開機載入過程
目錄
1 開機載入簡介
2 常規載入流程
2.1 載入BIOS
2.2 讀取MBR
2.3 boot loader
2.4 載入核心
2.5 init依據inittab檔案來設定運行等級
2.6 init進程執行rc.sysinit
2.7 啟動核心模組
2.8 執行不同運行層級的指令碼程式
2.9 執行/etc/rc.d/rc.local
2.10 執行/bin/login程式,進入登入狀態
3 環境變數載入
3.1 載入順序說明
開機載入簡介
開機過程指的是從開啟電腦電源直到LINUX顯示使用者登入畫面的全過程。分析LINUX開機過程也是深入瞭解LINUX核心工作原理的一個很好的途徑。
常規載入流程
1、載入BIOS
開啟電腦電源,首先載入BIOS資訊,BIOS資訊是如此的重要,以至於電腦必須在最開始就找到它。BIOS中包含了CPU的相關資訊、裝置啟動順序資訊、硬碟資訊、記憶體資訊、時鐘資訊等等。
之後,電腦就知道應該去讀取哪個硬體裝置了。在BIOS將系統的控制權交給硬碟第一個扇區之後,就開始由Linux來控制系統了
2、讀取MBR
硬碟上第0磁軌第一個扇區被稱為MBR,也就是Master Boot Record,即主引導記錄,大小是512位元組,可裡面卻存放了開機前資訊、分區表資訊。
可分為兩部分:第一部分為引導(PRE- BOOT)區,佔了446個位元組;第二部分為分區表(PARTITION PABLE),共有66個位元組,記錄硬碟的分區資訊。預引導區的作用之一是找到標記為活動(ACTIVE)的分區,並將使用中的磁碟分割的引導區讀入記憶體。
系統找到BIOS所指定的硬碟的MBR後,就會將其複製到0×7c00地址所在的實體記憶體中。被複製到實體記憶體的內容就是Boot Loader,到電腦系統層面那就是lilo或者grub了。
3、boot loader
Boot Loader 就是在作業系統核心運行之前啟動並執行一段小程式。通過這段小程式,我們可以初始化硬體裝置、建立記憶體空間的映射圖,從而將系統的軟硬體環境帶到一個合適的狀態,以便為最終叫用作業系統核心做好準備。
grub做為引導系統的最常用的程式之一,我們有必要去瞭解一下,下面是我們AX3 SP3的grub引導檔案
# grub.conf generated by anaconda
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/hda2
# initrd /initrd-version.img
#boot=/dev/hda
default=0 #此項為預設以啟動第一個title
timeout=5 #等待五秒
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Asianux Server 3 (Quartet SP4) (2.6.18-194.13.AXS3)
root (hd0,0) #指定系統的根在hd0,0 即(第一塊裝置的第一個分區)
kernel /vmlinuz-2.6.18-194.13.AXS3 ro root=LABEL=/ #指定kernel檔案
initrd /initrd-2.6.18-194.13.AXS3.img #指定initrd檔案
4、載入核心
init依據inittab檔案來設定運行等級
核心載入之後,由核心執行的第一個程式就是 /sbin/init,而這個程式第一個目標當然就是確定主機是要以怎樣的情況登入!這個就必須要以 /sbin/init 來載入 /etc/inittab 的資訊!
/etc/inittab有下面一段內容,說明了各個終端的作用,以及預設進入的終端方式
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault:
根據上面的資訊我們瞭解到:
0:關機
1:單使用者登陸模式
2:多使用者登陸,跟3相仿,但是沒有網路
3,多使用者登陸字元模式
4,暫不被使用
5,進入X11 圖形介面
6,重啟系統
"id:3:initdefault:" 此項設定為系統預設進入的終端模式,不要設定0和6模式,否則系統將不能啟動或者一直重啟
init進程執行rc.sysinit
在設定了運行等級後,Linux系統執行的第一個使用者層檔案就是/etc/rc.d/rc.sysinit指令碼程式,設定PATH、設定網路設定(/etc/sysconfig/network)、啟動swap分區、設定/proc等等。
/etc/rc.d/rc.sysinit大致做了以下內容:
1. 設定預設路徑:( PATH )
2. 設定網路狀態:系統會讀取 /etc/sysconfig/network
3. 啟動swap交換分區
4. 檢查檔案系統:系統會去檢查一些可能會存在的目錄,例如 /fsckoptions 與 /forcfsck 及 /fastboot
等等的目錄,當系統有不順利關機的現象時(例如突然的斷電等等),那麼 Linux 將會自動的強制
去檢查 root 的檔案系統 ( checking root filesystems )。
5. 清除 /etc/mtab ;
6. mount root 及 /proc 檔案系統
7.檢查檔案系統 :與前面相同的,當前面的 /fastboot 檢查的,就會以 fsck 檢查你的其它扇區 ( 使用 fsck )
8.掛上其它檔案系統
9.設定 console 字型
10.開啟 quota
11.清除不必要的檔案, 如 lock, pid
12.設定 clock
13.serial port 初始化
14.將開機訊息經由 dmesg 放入 /var/log/dmesg 中
5、啟動核心模組
執行不同運行層級的指令碼程式
當系統執行完/etc/rc.d/rc.sysinit之後,/etc/inittab會指引系統去運行rc0.d到rc6.d中的相應的指令碼程式
進入/etc/rc.d/rc3.d/目錄下,我們會發現很多K或者S開頭的連結到../init.d/的指令檔,實際我們執行的是/etc/rc.d/init.d裡的指令檔
執行 ls -l輸出結果為:
lrwxrwxrwx 1 root root 15 2011-11-02 S05kudzu -> ../init.d/kudzu
需要注意的是:S為開機需要載入執行的指令檔,K為開機不需要載入執行的指令檔,數字為優先順序,優先順序越小,越先執行.
我們可以用chkconfig來管理它的運行狀態.
執行/etc/rc.d/rc.local
你如果開啟了此檔案,裡面有一句話,讀過之後,你就會對此命令的作用一目瞭然:
# 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.
rc.local就是在一切初始化工作後,Linux留給使用者進行個人化的地方。你可以把你想設定和啟動的東西放到這裡。
執行/bin/login程式,進入登入狀態
此時,系統已經進入到了等待使用者輸入username和password的時候了,你已經可以用自己的帳號登入系統了。
6、環境變數載入
載入順序說明
在剛登入Linux時,首先啟動 /etc/profile 檔案,然後再啟動使用者目錄下的 ~/.bash_profile 如果 ~/.bash_profile檔案存在的話,因為在 ~/.bash_profile檔案中一般會有下面的代碼:
if [ -f ~/.bashrc ] ; then
. ./bashrc
fi
所以會執行 ~/.bashrc檔案。 並且~/.bashrc中,一般還會有以下代碼:
if [ -f /etc/bashrc ] ; then
. /bashrc
fi
所以,~/.bashrc會調用 /etc/bashrc檔案。最後,在退出shell時,還會執行 ~/.bash_logout檔案。
執行順序為:/etc/profile -> ~/.bash_profile -> ~/.bashrc -> /etc/bashrc -> ~/.bash_logout
關於各個檔案的範圍,在網上找到了以下說明:
(1)/etc/profile: 此檔案為系統的每個使用者佈建環境資訊,當使用者第一次登入時,該檔案被執行. 並從/etc/profile.d目錄的設定檔中搜集shell的設定。
(2)/etc/bashrc: 為每一個運行bash shell的使用者執行此檔案.當bash shell被開啟時,該檔案被讀取。
(3)~/.bash_profile: 每個使用者都可使用該檔案輸入專用於自己使用的shell資訊,當使用者登入時,該檔案僅僅執行一次!預設情況下,他設定一些環境變數,執行使用者的.bashrc檔案。
(4)~/.bashrc: 該檔案包含專用於你的bash shell的bash資訊,當登入時以及每次開啟新的shell時,該該檔案被讀取。
(5)~/.bash_logout:當每次退出系統(退出bash shell)時,執行該檔案. 另外,/etc/profile中設定的變數(全域)的可以作用於任何使用者,而~/.bashrc等中設定的變數(局部)只能繼承 /etc/profile中的變數,他們是"父子"關係。
(6)~/.bash_profile 是互動式、login 方式進入 bash 啟動並執行~/.bashrc 是互動式 non-login 方式進入 bash 啟動並執行通常二者設定大致相同,所以通常前者會調用後者
本文出自 “gentoo” 部落格,請務必保留此出處http://linuxgentoo.blog.51cto.com/7678232/1599564
Linux開機載入過程