Linux開機啟動流程分析

NO IMAGE

Linux開機啟動十步驟

收藏分享2012-2-6
11:15| 釋出者: 紅黑魂| 檢視數:
1366| 評論數: 0|來自: 位元網

摘要:   開機過程指的是從開啟計算機電源直到LINUX顯示使用者登入畫面的全過程。分析LINUX開機過程也是深入瞭解LINUX核心工作原理的一個很好的途徑。  啟動第一步–載入BIOS  當你開啟計算機電源,計算機會首先載入BIO

  開機過程指的是從開啟計算機電源直到Linux顯示使用者登入畫面的全過程。分析LINUX開機過程也是深入瞭解LINUX核心工作原理的一個很好的途徑。

  啟動第一步–載入BIOS

  當你開啟計算機電源,計算機會首先載入BIOS資訊,BIOS資訊是如此的重要,以至於計算機必須在最開始就找到它。這是因為BIOS中包含了CPU的相關資訊、裝置啟動順序資訊、硬碟資訊、記憶體資訊、時鐘資訊、PnP特性等等。在此之後,計算機心裡就有譜了,知道應該去讀取哪個硬體裝置了。在BIOS將系統的控制權交給硬碟第一個扇區之後,就開始由Linux來控制系統了。

  啟動第二步–讀取MBR

  硬碟上第0磁軌第一個扇區被稱為MBR,也就是Master Boot Record,即主開機記錄,它的大小是512位元組,可裡面卻存放了預啟動資訊、分割槽表資訊。可分為兩部分:第一部分為引導(PRE-BOOT)區,佔了446個位元組;第二部分為分割槽表(PARTITION
PABLE),共有66個位元組,記錄硬碟的分割槽資訊。預引導區的作用之一是找到標記為活動(ACTIVE)的分割槽,並將活動分割槽的引導區讀入記憶體。

  系統找到BIOS所指定的硬碟的MBR後,就會將其複製到0×7c00地址所在的實體記憶體中。其實被複制到實體記憶體的內容就是Boot Loader,而具體到你的電腦,那就是lilo或者grub了。

  啟動第三步–Boot Loader

  Boot Loader 就是在作業系統核心執行之前執行的一段小程式。通過這段小程式,我們可以初始化硬體裝置、建立記憶體空間的對映圖,從而將系統的軟硬體環境帶到一個合適的狀態,以便為最終呼叫作業系統核心做好一切準備。通常,BootL
oade:是嚴重地依賴於硬體而實現的,不同體系結構的系統存在著不同的Boot Loader。

  Linux的引導扇區內容是採用組合語言編寫的程式,其原始碼在arch/i386/boot中(不同體系的CPU有其各自的boot目錄),有4個程式檔案:

  ◎bootsect.S,引導扇區的主程式,彙編後的程式碼不超過512位元組,即一個扇區的 大 小

  ◎setup.S, 引導輔助程式

  ◎edd.S,輔助程式的一部分,用於支援BIOS增強磁碟裝置服務

  ◎video.S,輔助程式的另一部分,用於引導時的螢幕顯示

  Boot Loader有若干種,其中Grub、Lilo和spfdisk是常見的Loader,這裡以Grub為例來講解吧。

  系統讀取記憶體中的grub配置資訊(一般為menu.lst或grub.lst),並依照此配置資訊來啟動不同的作業系統。

  啟動第四步–載入核心

  根據grub設定的核心映像所在路徑,系統讀取記憶體映像,並進行解壓縮操作。此時,螢幕一般會輸出“Uncompressing Linux”的提示。當解壓縮核心完成後,螢幕輸出“OK, booting the kernel”。

  系統將解壓後的核心放置在記憶體之中,並呼叫start_kernel()函式來啟動一系列的初始化函式並初始化各種裝置,完成Linux核心環境的建立。至此,Linux核心已經建立起來了,基於Linux的程式應該可以正常執行了。

  start_kenrel()定義在init/main.c中,它就類似於一般可執行程式中的main()函式,系統在此之前所做的僅僅是一些能讓核心程式最低限度執行的初始化操作,真正的核心初始化過程是從這裡才開始。函式start_kerenl()將會呼叫一系列的初始化函式,用來完成核心本身的各方面設定,目的是最終建立起基本完整的Linux核心環境。

  start_kernel()中主要執行了以下操作:

  (1) 在螢幕上列印出當前的核心版本資訊。

  (2) 執行setup_arch(),對系統結構進行設定。

  (3)執行sched_init(),對系統的排程機制進行初始化。先是對每個可用CPU上的runqueque進行初始化;然後初始化0號程序(其task struct和系統空M堆疊在startup_32()中己經被分配)為系統idle程序,即系統空閒時佔據CPU的程序。

  (4)執行parse_early_param()和parsees_args()解析系統啟動引數。

  (5)執行trap_in itQ,先設定了系統中斷向量表。0-19號的陷阱門用於CPU異常處理;然後初始化系統呼叫向量;最後呼叫cpu_init()完善對CPU的初始化,用於支援程序排程機制,包括設定標誌位暫存器、任務暫存器、初始化程式除錯相關暫存器等等。

  (6)執行rcu_init(),初始化系統中的Read-Copy Update互斥機制。

  (7)執行init_IRQ()函式,初始化用於外設的中斷,完成對IDT的最終初始化過程。

  (8)執行init_timers(), softirq_init()和time_init()函式,分別初始系統的定時器機制,軟中斷機制以及系統日期和時間。

  (9)執行mem_init()函式,初始化實體記憶體頁面的page資料結構描述符,完成對實體記憶體管理機制的建立。

  (10)執行kmem_cache_init(),完成對通用slab緩衝區管理機制的初始化工作。

  (11)執行fork_init(),計算出當前系統的實體記憶體容量能夠允許建立的程序(執行緒)數量。

  (12)執行proc_caches_init() , bufer_init(), unnamed_dev_init() ,vfs_caches_init(), signals_init()等函式對各種管理機制建立起專用的slab緩衝區佇列。

  (13 )執行proc_root_init()Wl數,對虛擬檔案系統/proc進行初始化。

  在 start_kenrel()的結尾,核心通過kenrel_thread()建立出第一個系統核心執行緒(即1號程序),該執行緒執行的是核心中的init()函式,負責的是下一階段的啟動任務。最後呼叫cpues_idle()函式:進入了系統主迴圈體口預設將一直執行default_idle()函式中的指令,即CPU的halt指令,直到就緒佇列中存在其他程序需要被排程時才會轉向執行其他函式。此時,系統中唯一存在就緒狀態的程序就是由kerne_hread()建立的init程序(核心執行緒),所以核心並不進入default_idle()函式,而是轉向init()函式繼續啟動過程。

  啟動第五步–使用者層init依據inittab檔案來設定執行等級

  核心被載入後,第一個執行的程式便是/sbin/init,該檔案會讀取/etc/inittab檔案,並依據此檔案來進行初始化工作。

  其實/etc/inittab檔案最主要的作用就是設定Linux的執行等級,其設定形式是“:id:5:initdefault:”,這就表明Linux需要執行在等級5上。Linux的執行等級設定如下:

  0:關機

  1:單使用者模式

  2:無網路支援的多使用者模式

  3:有網路支援的多使用者模式

  4:保留,未使用

  5:有網路支援有X-Window支援的多使用者模式

  6:重新引導系統,即重啟

  啟動第六步–init程序執行rc.sysinit

  在設定了執行等級後,Linux系統執行的第一個使用者層檔案就是/etc/rc.d/rc.sysinit指令碼程式,它做的工作非常多,包括設定PATH、設定網路配置(/etc/sysconfig/network)、啟動swap分割槽、設定/proc等等。如果你有興趣,可以到/etc/rc.d中檢視一下rc.sysinit檔案。

  執行緒init的最終完成狀態是能夠使得一般的使用者程式可以正常地被執行,從而真正完成可供應用程式執行的系統環境。它主要進行的操作有:

  (1) 執行函式do_basic_setup(),它會對外部裝置進行全面地初始化。

  (2) 構建系統的虛擬檔案系統目錄樹,掛接系統中作為根目錄的裝置(其具體的文 件系統已經在上一步驟中註冊)。

  (3) 開啟裝置/dev/console,並通過函式sys_dup()開啟的連線複製兩次,使得檔案號0,1 ,2 全部指向控制檯。這三個檔案連線就是通常所說的“標準輸入”stdin,“標準輸出”stdout和“標準出錯資訊”stderr這三個標準I/O通道。

  (4) 準備好以上一切之後,系統開始進入使用者層的初始化階段。核心通過系統呼叫execve()載入執T子相應的使用者層初始化程式,依次嘗試載入程式”/sbin/initl”,” /etc/init”,” /bin/init’,和“/bin/sh。只要其中有一個程式載入獲得成功,那麼系統就將開始使用者層的初始化,而不會再回到init()函式段中。至此,init()函式結束,Linux核心的引導 部分也到此結束。

  啟動第七步–啟動核心模組

  具體是依據/etc/modules.conf檔案或/etc/modules.d目錄下的檔案來裝載核心模組

  啟動第八步–執行不同執行級別的指令碼程式

  根據執行級別的不同,系統會執行rc0.d到rc6.d中的相應的指令碼程式,來完成相應的初始化工作和啟動相應的服務。

  啟動第九步–執行/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的時候了,你已經可以用自己的帳號登入系統了。

  1: 啟動電源後,主機第一步先做的就是查詢BIOS(全稱:basic input/output system 基本輸入輸出系統)資訊。瞭解整個系統的硬體狀態,如CPU,記憶體,顯示卡,網絡卡等。嗯,這一步windows算和它是一家。不分彼此。

  2: 接下來,就是主機讀取MBR(硬碟的第一個扇區)裡的boot loader了。這個可是重點哦,據說troubleshooting裡就會考這點,給個壞了的loader,叫你修正。windows不支援linux的分割槽格式。所以,用windows的boot。ini是查不到linux的系統的。一般我裝系統都是先裝
windows再裝linux,然後用grub來做boot loader。兩個字:省心!因為linux不像windows那麼小氣。grub可是支援windows分割槽格式的哦。

  3: 接上一步,主機讀取boot loader後,會讀取裡面的資訊,知道誰跟誰是待在哪,假如主機想進入linux系統,讀取到linux核心是在/boot檔案目錄中後,將此核心載入到記憶體中。開始了接下來的分析啟動之旅。

  4: OK,第一個執行程式是誰?就是/sbin/init程式。不信,就用top程式看下,是不是PID為1的就是這個東東,它,可是萬物之祖啊,我簡稱它是女媧娘娘(不喜歡亞當夏娃)。

  · 5: init首先查詢啟動等級(run-level)。因為啟動等級不同,其執行指令碼(也就是服務)會不同。預設的等級有以下幾項:

  0 – halt (系統直接關機)

  1 – single user mode (單人模式,用於系統維護時使用)

  2 – Multi-user,
without NFS (類似3模式,不過少了NFS服務)

  3 – Full multi-user mode (完整模式,不過,是文字模式)

  4 – unused (系統保留功能)

  5 – X11 (與3模式類似,不過,是X終端顯示)

  6 – reboot (重新開機)

  (不要選擇0或4,6 否則,進步了系統的)

  · 6: OK。系統知道自己的啟動等級後,接下來,不是去啟動服務,而是,先設定好主機執行環境。讀取的檔案是/etc/rc。d/rc。sysinit檔案。那究竟要設定哪些環境呢?

  · 設定網路環境/etc/sysconfig/network,如主機名,閘道器,IP,DNS等。

  · 掛載/proc。此檔案是個特殊檔案,大小為0,因為它是在記憶體當中。裡面東東最好別刪。

  · 根據核心在開機時的結果/proc/sys/kernel/modprobe。開始進行周邊裝置的偵測。

  · 載入使用者自定義的模組/etc/sysconfig/modules/*。modules

  · 讀取/etc/sysctl。conf檔案對核心進行設定。

  · 設定時間,終端字型,硬碟LVM或RAID功能,以fsck進行磁碟檢測。

  · 將開機狀況記錄到/var/log/dmesg中。(可以用命令dmesg檢視結果)

  · 7: OK,接下來,就是啟動系統服務了,不同的run-level會有不同的服務啟動。到/etc/rc。d目錄中,不同的level會有不同的目錄。如啟動 3模式,會有個rc3。d目錄,裡面就儲存著服務。其中,S(start)開頭的表明開機啟動,K(kill)開頭的表明開機不啟動。數字表示啟動順序。數字越小,啟動越早。

  注意,他們都是連線到etc/rc。d/init。d/目錄中的相關檔案。所以,想手工啟動某一服務,可以用”/etc/rc。d/init。 d/某個服務 start”啟動哦。相反,我們也可以把某個服務ln(連結命令)到不同run-level的目錄中。記得打上S或者K 數字哦。

  · 8: 讀取服務後,主機會讀取/etc/rc。d/rc。local檔案。所以,如果需要什麼開機啟動的話,可以寫個指令碼或命令到這裡面來。就不用像上面那麼麻煩。以後刪除也方便。

  OK,經過一番長途跋涉後,系統終於可以安心的開啟shell了。

分類: linux菜鳥起航

每次系統開機的時候,都會根據不同的runlevel級別啟動不同的服務。

開機按[CTRL] [ALT] [F7]/[F8]可檢視系統啟動時正在啟動的服務!!!!

  眾所周知Linux給我們提供了7中不同的啟動級別0~6,那麼不同的啟動級別都會啟動那些服務哪。可以使用chkconfig ——list 檢視,可以使用chkconfig 服務名 ——level 3 {on|of}修改是否要再某個級別啟動或停止。

  1. 例如:要把sshd服務在第3種啟動級別中停止。

[[email protected] rc3.d]# chkconfig sshd --level 3 off 
中國網管聯盟www.bitscn.com

  2. 還可以手工修改,在/etc/rc.d/這個目錄裡有很多不同runlevel對應的目錄,裡面表明進入某個啟動級別時要啟動和停止那些服務。

  例如: 中國網管聯盟www、bitsCN、com

[[email protected] etc]# ls /etc/rc.d
init.d  rc0.d  rc2.d  rc4.d  rc6.d     rc.sysinit
rc      rc1.d  rc3.d  rc5.d  rc.local
我們用rc3.d這個目錄為例,這個目錄裡面記錄的是進入init 3時需要停止和啟動那些服務。
下面為rc3.d目錄的內容:
[[email protected] etc]# ls /etc/rc.d/rc3.d/
K02avahi-dnsconfd            K89pand             S25bluetooth
K02dhcdbd                    K89rdisc            S25netfs
K02NetworkManager            K91capi             S25pcscd
K02NetworkManagerDispatcher  K99readahead_later  S26apmd
K05conman                    S04readahead_early  S26hidd

  K開頭代表這個啟動級別需要停止的服務,編號是停止的時候執行的順序,再後面就是服務明瞭。

  S開頭則是要啟動那些服務。 網管網bitsCN_com

  注意:先執行K開頭的,後執行S開頭的。所以S開頭的服務會覆蓋K開頭的服務。

Linux設定程式的開機自啟動與Linux服務

這裡只說我所知道的,舉例如下
需求是我要用Windows下的VNC Viewer連線到Linux Server. 我在Linux下面輸入
#vncserver
設定好密碼,好現在我就可以在Windows下面使用VNC連線到Linux桌面了,這個時候如果我的Linux Server系統重啟了,那麼我還得再敲一次vncserver這個命令,所以我現在要讓Linux Server在開機時自動啟動vncserver
有哪些方法呢?
1. 我可以把vncserver設定成系統的服務,並啟動起來,使用如下命令檢視vncserver是否已經是系統的服務
#chkconfig –list|grep vnc
vncserver    0:off 1:off 2:off 3:off 4:off 5:off 6:off
現在我們要設定vncserver開機自啟動,使用如下命令
#chkconfig –level 5 vncserver on#chkconfig –list|grep vnc
vncserver    0:off 1:off 2:off 3:off 4:off 5:on 6:off
這個時候重啟系統,那麼vncserver就會以服務的方式自動起來,但是現在如果想立即使用vnc則直接敲命令 vncserver即可
2. 我們可以把vncserver這條命令寫在Linux開機要執行的指令碼里面,那些指令碼是Linux開機時要執行的呢?
我知道的有以下這些:
/etc/rc.local
/etc/rc.sysinit
/etc/inittab
/etc/profile
這裡記住Linux服務於Linux開機自啟動之間的區別和聯絡

linux開機啟動指令碼的順序
來源: ChinaUnix部落格  日期: 2008.07.16 13:37 (共有條評論) 我要評論
 
如果伺服器重啟之後需要手工開啟許多服務、工作及以後的維護相對比較繁瑣、特地總結了下linux下開機自動啟動指令碼所涉及的知識和方法、如下:
1、相關基礎知識點
   1)redhat的啟動方式和執行次序是: 
      載入核心 
      執行init程式 
      /etc/rc.d/rc.sysinit # 由init執行的第一個指令碼 
      /etc/rc.d/rc $RUNLEVEL # $RUNLEVEL為預設的執行模式 
      /etc/rc.d/rc.local     #相應級別服務啟動之後、在執行該檔案(其實也可以把需要執行的命令寫到該檔案中)
      /sbin/mingetty # 等待使用者登入 
      
      在Redhat中,/etc/rc.d/rc.sysinit主要做在各個執行模式中相同的初始化工作,包括: 
      調入keymap以及系統字型 
      啟動swapping 
      設定主機名 
      設定NIS域名 
      檢查(fsck)並mount檔案系統 
      開啟quota 
      裝載音效卡模組 
      設定系統時鐘 
      等等。 
      /etc/rc.d/rc則根據其引數指定的執行模式(執行級別,你在inittab檔案中可以設定)來執行相應目錄下的指令碼。凡是以Kxx開頭的 
      ,都以stop為引數來呼叫;凡是以Sxx開頭的,都以start為引數來呼叫。呼叫的順序按xx 
      從小到大來執行。(其中xx是數字、表示的是啟動順序)例如,假設預設的執行模式是3,/etc/rc.d/rc就會按上述方式呼叫 
      /etc/rc.d/rc3.d/下的指令碼。 
      值得一提的是,Redhat中的執行模式2、3、5都把/etc/rc.d/rc.local做為初始化指令碼中 
      的最後一個,所以使用者可以自己在這個檔案中新增一些需要在其他初始化工作之後,登入之前執行的命令。 
      
      init在等待/etc/rc.d/rc執行完畢之後(因為在/etc/inittab中/etc/rc.d/rc的 
      action是wait),將在指定的各個虛擬終端上執行/sbin/mingetty,等待使用者的登入。 
      至此,LINUX的啟動結束。
    2)init執行級別及指令
    一、什麼是INIT: 
  init是Linux系統操作中不可缺少的程式之一。 
  所謂的init程序,它是一個由核心啟動的使用者級程序。 
  核心自行啟動(已經被載入記憶體,開始執行,並已初始化所有的裝置驅動程式和資料結構等)之後,就通過啟動一個使用者級程式init的方式,完成引導程序。所以,init始終是第一個程序(其程序編號始終為1)。
  核心會在過去曾使用過init的幾個地方查詢它,它的正確位置(對Linux系統來說)是/sbin/init。如果核心找不到init,它就會試著執行/bin/sh,如果執行失敗,系統的啟動也會失敗。 
  二、執行級別 
  那麼,到底什麼是執行級呢? 
  簡單的說,執行級就是作業系統當前正在執行的功能級別。這個級別從1到6 ,具有不同的功能。 
  不同的執行級定義如下 
  # 0 – 停機(千萬不能把initdefault 設定為0 ) 
  # 1 – 單使用者模式                                     # s   init s = init 1
  # 2 – 多使用者,沒有 NFS 
  # 3 – 完全多使用者模式(標準的執行級) 
  # 4 – 沒有用到 
  # 5 – X11 多使用者圖形模式(xwindow) 
  # 6 – 重新啟動 (千萬不要把initdefault 設定為6 ) 
  這些級別在/etc/inittab 檔案裡指定。這個檔案是init 程式尋找的主要檔案,最先執行的服務是放在/etc/rc.d 目錄下的檔案。在大多數的Linux 發行版本中,啟動指令碼都是位於 /etc/rc.d/init.d中的。這些指令碼被用ln 命令連線到 /etc/rc.d/rcn.d 目錄。(這裡的n 就是執行級0-6) 
     3):chkconfig 命令(redhat 作業系統下)
     不像DOS 或者 Windows,Linux 可以有多種執行級。常見的就是多使用者的2,3,4,5 ,很多人知道 5 是執行 X-Windows 的級別,而 0 就      是關機了。執行級的改變可以通過 init 命令來切換。例如,假設你要維護系統進入單使用者狀態,那麼,可以使用 init 1 來切換。在       Linux 的執行級的切換過程中,系統會自動尋找對應執行級的目錄/etc/rc[0-6].d下的K 和 S 開頭的檔案,按後面的數字順序,執行這      些指令碼。對這些指令碼的維護,是很繁瑣的一件事情,Linux
提供了chkconfig 命令用來更新和查詢不同執行級上的系統服務。 
     語法為: 
     
     chkconfig –list [name] 
     chkconfig –add name 
     chkconfig –del name 
     chkconfig [–level levels] name 
     chkconfig [–level levels] name 
     
     chkconfig 有五項功能:新增服務,刪除服務,列表服務,改變啟動資訊以及檢查特定服務的啟動狀態。 
     
     chkconfig 沒有引數執行時,顯示用法。如果加上服務名,那麼就檢查這個服務是否在當前執行級啟動。如果是,返回 true,否則返回      false。 –level 選項可以指定要檢視的執行級而不一定是當前執行級。 
     
     如果在服務名後面指定了on,off 或者 reset,那麼 chkconfig 會改變指定服務的啟動資訊。on 和 off 分別指服務在改變執行級時的      啟動和停止。reset 指初始化服務資訊,無論有問題的初始化指令碼指定了什麼。 
     
     對於 on 和 off 開關,系統預設只對執行級 3,4, 5有效,但是 reset 可以對所有執行級有效。指定 –level 選項時,可以選擇特       定的執行級。 
     
     需要說明的是,對於每個執行級,只能有一個啟動指令碼或者停止指令碼。當切換執行級時,init 不會重新啟動已經啟動的服務,也不會再      次去停止已經停止的服務。 
     
     選項介紹: 
     
     –level levels 
     指定執行級,由數字 0 到 7 構成的字串,如: 
     
     –level 35 表示指定執行級3 和5。 
     要在執行級別3、4、5中停運 nfs 服務,使用下面的命令:chkconfig –level 345 nfs off
     
     –add name 
     這個選項增加一項新的服務,chkconfig 確保每個執行級有一項 啟動(S) 或者 殺死(K) 入口。如有缺少,則會從預設的init 指令碼自動      建立。 
     
     –del name 
     用來刪除服務,並把相關符號連線從 /etc/rc[0-6].d 刪除。 
     
     –list name 
     列表,如果指定了name 那麼只是顯示指定的服務名,否則,列出全部服務在不同執行級的狀態。 
     
     執行級檔案 
     
     每個被chkconfig 管理的服務需要在對應的init.d 下的指令碼加上兩行或者更多行的註釋。 
     第一行告訴 chkconfig 預設啟動的執行級以及啟動和停止的優先順序。如果某服務預設不在任何執行級啟動,那麼使用 – 代替執行級。 
     第二行對服務進行描述,可以用 跨行註釋。 
     
     例如,random.init 包含三行: 
     # chkconfig: 2345 20 80 
     # description: Saves and restores system entropy pool for 
     # higher quality random number generation. 
     表明 random 指令碼應該在執行級 2, 3, 4, 5 啟動,啟動優先權為20,停止優先權為 80。 
     
     好了,介紹就到這裡了,去看看自己目錄下的/etc/rc.d/init.d 下的指令碼吧。  
     
     設定自啟動服務:chkconfig –level 345 nfs on
     
2. 例項介紹:
   1、在linux下安裝了apache 服務(通過下載二進位制檔案經濟編譯安裝、而非rpm包)、apache 服務啟動命令:            /server/apache/bin/apachectl start    。讓apache服務執行在執行級別3下面。  命令如下:
   
   1)touch /etc/rc.d/init.d/apache
      vi /etc/rc.d/init.d/apache
      chown -R root /etc/rc.d/init.d/apache
      chmod 700 /etc/rc.d/init.d/apache
      ln -s /etc/rc.d/init.d/apache /etc/rc.d/rc3.d/S60apache   #S 是start的簡寫、代表啟動、K是kill的簡寫、代表關閉。60數字        代表啟動的順序。(對於iptv系統而言、許多服務都是建立在資料庫啟動的前提下才能夠正常啟動的、可以通過該數字就行調整指令碼的       啟動順序))
      
      apache的內容:
      #!/bin/bash
      #Start httpd service
      /server/apache/bin/apachectl start
      
      至此 apache服務就可以在執行級別3下 隨機自動啟動了。(可以結合chkconfig 對啟動服務進行相應的調整)。
由於相關變數定義不同, 所以以下啟動順序僅供參考
在Redhat Redflag centos fc linux系統裡面指令碼的啟動

先後:
第一步:通過/boot/vm進行啟動 vmlinuz
第二步:init /etc/inittab
第三步:啟動相應的指令碼,並且開啟終端
rc.sysinit
rc.d(裡面的指令碼)
rc.local
第四步:啟動login登入介面 login
第五步:在使用者登入的時候執行sh指令碼的順序:每次登入的時候都會完全執行的
/etc/profile.d/file
/etc/profile
/etc/bashrc
/root/.bashrc
/root/.bash_profile

分類: LINUX

經過對Linux系統有了一定了解和熟悉後,想對其更深層次的東西做進一步探究。這當中就包括系統的啟動流程、檔案系統的組成結構、基於動態庫和靜態庫的程式在執行時的異同、協議棧的架構和原理、驅動程式的機制等等。

       本人在綜合了現有網上大家智慧的基礎上,結合對2.6.32的核心程式碼的研讀,基於CentOS 6.0系統對Linux的啟動流程做了些分析。由於才疏學淺,知識所限,有些地方分析不妥之處還請各位高手不吝賜教。

        OK,我們言歸正傳。對於一臺安裝了Linux系統的主機來說,當使用者按下開機按鈕時,一共要經歷以下幾個過程,如圖:

        其中,每個過程都執行了自己該做的初始化部分的事情,有些過程又可分為好幾個子過程。接下來,我們就對每個階段做一個詳細分析和講解。

  • BIOS自檢

        稍有計算機基礎的人都應該聽過BIOS(Basic Input / Output System),又稱基本輸入輸出系統,可以視為是一個永久地記錄在ROM中的一個軟體,是作業系統輸入輸出管理系統的一部分。早期的BIOS晶片確實是”只讀”的,裡面的內容是用一種燒錄器寫入的,一旦寫入就不能更改,除非更換晶片。現在的主機板都使用一種叫Flash EPROM的晶片來儲存系統BIOS,裡面的內容可通過使用主機板廠商提供的擦寫程式擦除後重新寫入,這樣就給使用者升級BIOS提供了極大的方便。

        BIOS的功能由兩部分組成,分別是POST碼和Runtime服務。POST階段完成後它將從儲存器中被清除,而Runtime服務會被一直保留,用於目標作業系統的啟動。BIOS兩個階段所做的詳細工作如下:

         步驟1:上電自檢POST(Power-on self test),主要負責檢測系統外圍關鍵裝置(如:CPU、記憶體、顯示卡、I/O、鍵盤滑鼠等)是否正常。例如,最常見的是記憶體鬆動的情況,BIOS自檢階段會報錯,系統就無法啟動起來;

         步驟2:步驟1成功後,便會執行一段小程式用來列舉本地裝置並對其初始化。這一步主要是根據我們在BIOS中設定的系統啟動順序來搜尋用於啟動系統的驅動器,如硬碟、光碟、U盤、軟盤和網路等。我們以硬碟啟動為例,BIOS此時去讀取硬碟驅動器的第一個扇區(MBR,512位元組),然後執行裡面的程式碼。實際上這裡BIOS並不關心啟動裝置第一個扇區中是什麼內容,它只是負責讀取該扇區內容、並執行。

至此,BIOS的任務就完成了,此後將系統啟動的控制權移交到MBR部分的程式碼。

        PS: 在個人電腦中,Linux的啟動是從0xFFFF0地址開始的。

  • 系統引導

      我們首先來了解一下MBR,它是Master Boot Record的縮寫。硬碟的0柱面、0磁頭、1扇區稱為主引導扇區。它由三個部分組成,主載入程式(Bootloader)、 硬碟分割槽表DPT(Disk Partition table)和硬碟有效標誌(55AA),其結構圖如下所示:

        磁碟分割槽表包含以下三部分:

        1)、Partition ID  (5:延申  82:Swap   83:Linux   8e:LVM     fd:RAID)

        2)、Partition起始磁柱

        3)、Partition的磁柱數量

       通常情況下,諸如lilo、grub這些常見的載入程式都直接安裝在MBR中。我們以grub為例來分析這個引導過程。

       grub引導也分為兩個階段stage1階段和stage2階段(有些較新的grub又定義了stage1.5階段)。

        1)、stage1:stage1是直接被寫入到MBR中去的,這樣機器一啟動檢測完硬體後,就將控制權交給了GRUB的程式碼。也就是上圖所看到的前446個位元組空間中存放的是stage1的程式碼。BIOS將stage1載入記憶體中0x7c00處並跳轉執行。stage1(/stage1/start.S)的任務非常單純,僅僅是將硬碟0頭0道2扇區讀入記憶體。而0頭0道2扇區內容是原始碼中的/stage2/start.S,編譯後512位元組,它是stage2或者stage1_5的入口。而此時,stage1是沒有識別檔案系統的能力的。如果感覺腦子有些暈了,那麼下面的過程就直接跳過,去看stage2吧!

        【外傳】定位硬碟的0頭0道2扇區的過程:

         BIOS將stage1載入記憶體0x7c00處並執行,然後呼叫BIOS INIT13中斷,將硬碟0頭0道2扇區內容載入記憶體0x7000處,然後呼叫copy_buffer將其轉移到記憶體0x8000處。在定位0頭0道2扇區時通常有兩種定址方式:LBA和CHS。如果你是刨根問底兒型的愛好者,那麼此時去找谷哥打聽打聽這兩種方式的來龍去脈吧。

         2)、stage2:嚴格來說這裡還應該再區分個stage1.5的,就一併把stage1.5放在這裡一起介紹了,免得大家看得心裡亂哄哄的。好的,我們繼續說0頭0到2扇區的/stage2/start.S檔案,當它的內容被讀入到記憶體之後,它的主要作用就是負責將stage2或stage1.5從硬碟讀到記憶體中。如果是stage2,它將被載入到0x820處;如果是stage1.5,它將被載入到0x2200處。這裡的stage2或者stage1_5不是/boot分割槽/boot/grub目錄下的檔案,因為這個時候grub還沒有能力識別任何檔案系統。

        ?  如果start.S載入stage1.5:stage1.5它存放在硬碟0頭0道3扇區向後的位置,stage1_5作為stage1和stage2中間的橋樑,stage1_5有識別檔案系統的能力,此後grub才有能力去訪問/boot分割槽/boot/grub目錄下的 stage2檔案,將stage2載入記憶體並執行。

        ?  如果start.S載入stage2:同樣,這個stage2也不是/boot分割槽/boot/grub目錄下的stage2,這個時候start.S讀取的是存放在/boot分割槽Boot Sector的stage2。這種情況下就有一個限制:因為start.S通過BIOS中斷方式直接對硬碟定址(而非通過訪問具體的檔案系統),其定址範圍有限,限制在8GB以內。因此這種情況需要將/boot分割槽分在硬碟8GB定址空間之前。

        假如是情形2,我們將/boot/grub目錄下的內容清空,依然能成功啟動grub;假如是情形1,將/boot/grub目錄下stage2刪除後,則系統啟動過程中grub會啟動失敗。

  • 啟動核心

     當stage2被載入記憶體執行時,它首先會去解析grub的配置檔案/boot/grub/grub.conf,然後載入核心映象到記憶體中,並將控制權轉交給核心。而核心會立即初始化系統中各裝置並做相關的配置工作,其中包括CPU、I/O、儲存裝置等。

關於Linux的裝置驅動程式的載入,有一部分驅動程式直接被編譯進核心映象中,另一部分驅動程式則是以模組的形式放在initrd(ramdisk)中。

      Linux核心需要適應多種不同的硬體架構,但是將所有的硬體驅動編入核心又是不實際的,而且核心也不可能每新出一種硬體結構,就將該硬體的裝置驅動寫入核心。實際上Linux的核心映象僅是包含了基本的硬體驅動,在系統安裝過程中會檢測系統硬體資訊,根據安裝資訊和系統硬體資訊將一部分裝置驅動寫入 initrd 。這樣在以後啟動系統時,一部分裝置驅動就放在initrd中來載入。這裡有必要給大家再多介紹一下initrd這個東東:

       initrd 的英文含義是 bootloader initialized RAM disk,就是由 boot loader 初始化的記憶體盤。在 linu2.6核心啟動前,boot loader 會將儲存介質中的 initrd 檔案載入到記憶體,核心啟動時會在訪問真正的根檔案系統前先訪問該記憶體中的 initrd 檔案系統。在 boot loader 配置了 initrd 的情況下,核心啟動被分成了兩個階段,第一階段先執行
initrd 檔案系統中的init,完成載入驅動模組等任務,第二階段才會執行真正的根檔案系統中的 /sbin/init 程序。

      另外一個概念:initramfs

       initramfs 是在 kernel 2.5中引入的技術,實際上它的含義就是:在核心映象中附加一個cpio包,這個cpio包中包含了一個小型的檔案系統,當核心啟動時,核心將這個 cpio包解開,並且將其中包含的檔案系統釋放到rootfs中,核心中的一部分初始化程式碼會放到這個檔案系統中,作為使用者層程序來執行。這樣帶來的明顯的好處是精簡了核心的初始化程式碼,而且使得核心的初始化過程更容易定製。

疑惑的是:我的核心是2.6.32-71.el6.i686版本,但在我的/boot分割槽下面卻存在的是/boot/initramfs-2.6.32-71.el6.i686.img型別的檔案,沒搞明白,還望高人解惑。我只知道在2.6核心中支援兩種格式的initrd,一種是2.4核心的檔案系統映象image-initrd,一種是cpio格式。接下來我們就來探究一下initramfs-2.6.32-71.el6.i686.img裡到底放了那些東西。

    在tmp資料夾中解壓initrd.img裡的內容:

如果initrd.img檔案的格式顯示為“initrd.img:ISO 9660 CD-ROM filesystem data”,則可直接輸入命令“mount -o loop initrd.img /mnt/test”進行掛載。

         通過上的分析和我們的驗證,我們確實得到了這樣的結論:

         grub的stage2將initrd載入到記憶體裡,讓後將其中的內容釋放到內容中,核心便去執行initrd中的init指令碼,這時核心將控制權交給了init檔案處理。我們簡單瀏覽一下init指令碼的內容,發現它也主要是載入各種儲存介質相關的裝置驅動程式。當所需的驅動程式載入完後,會建立一個根裝置,然後將根檔案系統rootfs以只讀的方式掛載。這一步結束後,釋放未使用的記憶體,轉換到真正的根檔案系統上面去,同時執行/sbin/init程式,執行系統的1號程序。此後系統的控制權就全權交給/sbin/init程序了。

l  初始化系統

經過千辛萬苦的跋涉,我們終於接近黎明的曙光了。接下來就是最後一步了:初始化系統。/sbin/init程序是系統其他所有程序的父程序,當它接管了系統的控制權先之後,它首先會去讀取/etc/inittab檔案來執行相應的指令碼進行系統初始化,如設定鍵盤、字型,裝載模組,設定網路等。主要包括以下工作:

1)、執行系統初始化指令碼(/etc/rc.d/rc.sysinit),對系統進行基本的配置,以讀寫方式掛載根檔案系統及其它檔案系統,到此係統算是基本執行起來了,後面需要進行執行級別的確定及相應服務的啟動。rc.sysinit所做的事情(不同的Linux發行版,該檔案可能有些差異)如下:

(1)獲取網路環境與主機型別。首先會讀取網路環境設定檔案”/etc/sysconfig/network”,獲取主機名稱與預設閘道器等網路環境。

(2)測試與載入記憶體裝置/proc及usb裝置/sys。除了/proc外,系統會主動檢測是否有usb裝置,並主動載入usb驅動,嘗試載入usb檔案系統。

(3)決定是否啟動SELinux。

(4)介面裝置的檢測與即插即用(pnp)引數的測試。

(5)使用者自定義模組的載入。使用者可以再”/etc/sysconfig/modules/*.modules”加入自定義的模組,此時會載入到系統中。

(6)載入核心的相關設定。按”/etc/sysctl.conf”這個檔案的設定值配置功能。

(7)設定系統時間(clock)。

(8)設定終端的控制檯的字形。

(9)設定raid及LVM等硬碟功能。

(10)以方式檢視檢驗磁碟檔案系統。

(11)進行磁碟配額quota的轉換。

(12)重新以讀取模式載入系統磁碟。

(13)啟動quota功能。

(14)啟動系統隨機數裝置(產生隨機數功能)。

(15)清楚啟動過程中的臨時檔案。

(16)將啟動資訊載入到”/var/log/dmesg”檔案中。

 當/etc/rc.d/rc.sysinit執行完後,系統就可以順利工作了,只是還需要啟動系統所需要的各種服務,這樣主機才可以提供相關的網路和主機功能,因此便會執行下面的指令碼。

2)、執行/etc/rc.d/rc指令碼。該檔案定義了服務啟動的順序是先K後S,而具體的每個執行級別的服務狀態是放在/etc/rc.d/rc*.d(*=0~6)目錄下,所有的檔案均是指向/etc/init.d下相應檔案的符號連結。rc.sysinit通過分析/etc/inittab檔案來確定系統的啟動級別,然後才去執行/etc/rc.d/rc*.d下的檔案。

/etc/init.d-> /etc/rc.d/init.d

/etc/rc ->/etc/rc.d/rc

/etc/rc*.d ->/etc/rc.d/rc*.d

/etc/rc.local-> /etc/rc.d/rc.local

/etc/rc.sysinit-> /etc/rc.d/rc.sysinit

也就是說,/etc目錄下的init.d、rc、rc*.d、rc.local和rc.sysinit均是指向/etc/rc.d目錄下相應檔案和資料夾的符號連結。我們以啟動級別3為例來簡要說明一下。

/etc/rc.d/rc3.d目錄,該目錄下的內容全部都是以 S 或 K 開頭的連結檔案,都連結到”/etc/rc.d/init.d”目錄下的各種shell指令碼。S表示的是啟動時需要start的服務內容,K表示關機時需要關閉的服務內容。/etc/rc.d/rc*.d中的系統服務會在系統後臺啟動,如果要對某個執行級別中的服務進行更具體的定製,通過chkconfig命令來操作,或者通過setup、ntsys、system-config-services來進行定製。如果我們需要自己增加啟動的內容,可以在init.d目錄中增加相關的shell指令碼,然後在rc*.d目錄中建立連結檔案指向該shell指令碼。這些shell指令碼的啟動或結束順序是由S或K字母后面的數字決定,數字越小的指令碼越先執行。例如,/etc/rc.d/rc3.d
/S01sysstat就比/etc/rc.d/rc3.d /S99local先執行。

3)、執行使用者自定義載入程式/etc/rc.d/rc.local。其實當執行/etc/rc.d/rc3.d/S99local時,它就是在執行/etc/rc.d/rc.local。S99local是指向rc.local的符號連結。就是一般來說,自定義的程式不需要執行上面所說的繁瑣的建立shell增加連結檔案的步驟,只需要將命令放在rc.local裡面就可以了,這個shell指令碼就是保留給使用者自定義啟動內容的。

4)、完成了系統所有的啟動任務後,linux會啟動終端或X-Window來等待使用者登入。tty1,tty2,tty3…這表示在執行等級1,2,3,4的時候,都會執行”/sbin/mingetty”,而且執行了6個,所以linux會有6個純文字終端,mingetty就是啟動終端的命令。

除了這6個之外還會執行”/etc/X11/prefdm-nodaemon”這個主要啟動X-Window

至此,系統就啟動完畢了。以上分析不到的地方還請各位大蝦不吝指正。

關於Linux的其他分析內容下次再繼續寫。

最後附上一張非常完整的系統啟動流程圖,適合各個水平階段的讀者。

參考文獻:

http://www.cnblogs.com/scnutiger/archive/2009/09/30/1576795.html

http://www.it.com.cn/f/edu/0411/24/51090.htm

http://bbs.chinaunix.net/thread-2046548-1-1.html

http://space.itpub.net/8111049/viewspace-680043

http://dongdiy.blog.51cto.com/1908223/366909

http://icarusli.iteye.com/blog/625755

http://www.54sa.net/?p=549

http://roclinux.cn/?p=1301

 

Linux 下 Login 和 Logout 詳解

2013-10-17 08:46 3075人閱讀 評論(1) 收藏 舉報
 分類:

目錄(?)[ ]

Login程序

             Login 是你用Linux系統工作時面對的第一個程序,這對於使用終端以及通過網路使用Linux都是正確的。但是login程序本身並不是你在終端上見到的,你見到的其實是getty (get TeleTYpe terminal ,早期電腦上的意思是獲取紙帶終端,現在可以直接理解成開啟終端),它是由init(通過/etc/inittab)在啟動login程序時新增而啟動的。
            所以完整的啟動鏈是:init -> getty -> login -> passwd -> shell -> applications 。這是從技術上來講的在真正實現時還是有點不同的,比如有時候login和passwd是在一個程式裡面,但是上面這個鏈是UNIX中很典型的。

        那麼為什麼我們要這麼做?為什麼不能寫一個程式來處理所有的工作。讓一個getty程式同時處理login和passwd不好麼?
       讓一個程式只做一件簡單的事然後連結許多簡單的工作創造了這個複雜的執行環境,這是保證UNIX穩定的關鍵,而且當你創造你的系統時這也是一個很關鍵的設計準則。(參見KISS準則,UNIX中的經典)

         Debian6上預設提供六個終端(Ctrl Alt F1~F6,因為F7,F8用來開啟圖形介面而不是用作終端),但是實際上核心預設是64個終端,那麼其他的終端哪去了?假如你在Linux虛擬機器上,你可以訪問tty10甚至tty12(使用Ctrl Alt F*),但是你沒有更多的功能鍵,以後我們在討論如何訪問其他的終端。

Logout 程序

         logout程序很簡單,他需要終止login程序開啟的任務或者shell。注意,它要關閉的不只是一個shell,而是所有的東西。
假如我使用long作為使用者登入我會得到一個shell,假如我使用 ls,我會得到ls的結果然後我logout。所以logout的shell會傳送一個訊號到父程序用來通知它shell被終止了。但是shell的父程序是 login 而且此時 login 已經停止執行了(logout會終端login和shell),那麼誰來獲取shell的返回值呢? 是 init 來接受 logout 的返回值,在關閉getty、login、logout等所有後,init 重新開啟一個getty來等待輸入。
下面我們看個好玩的東東:
                          -rwxr-xr-x 1 root root 975488 Dec 29  2012 /bin/bash
                          -rwxr-xr-x 1 root root  49008 May 25  2012 /bin/login
                          -rwxr-xr-x 2 root root  32040 Dec 11  2012 /sbin/getty
                          -rwsr-xr-x 1 root root  51096 May 25  2012 /usr/bin/passwd
我們都可以看到,除了passwd其他都有著rwxr-xr-x許可權,所有他們可以被任何使用者執行,而passwd是-rwsr-xr-x許可權,這個s是setuid的標誌,該位是讓普通使用者可以以root使用者的角色執行只有root帳號才能執行的程式或命令,所以passwd是執行在root許可權下(即使是一個普通使用者使用)。有了這個,我們可以降低安全風險。

Login配置

你使用login登入,你不但開啟了一個shell而且還配置了你的執行時環境(runtime env),這個配置如果在/etc下是系統級別的配置,如果在你的個人home目錄下則是個人配置。
大概劃分是這樣的: 
                             /etc/profile – 面向所有的使用者和所有的shell
                             /etc/bash.bashrc – 面向所有使用者的bash配置
                             ~/.bashrc – 你個人的bash配置
所以在實際使用時我們需要根據需求的不同將配置放在不同的配置檔案中。比如說,一個配置對所有使用這個系統的使用者都有用,我們就需要放在/etc/profile下。

su

        提到使用者登入,這裡說下root許可權,使用su命令(su -)你不但切換了使用者許可權而且你建立了一個新的login會話,所以你得到的不只是一個root,而且是一個全新的執行時環境,這對於安全問題來說是很敏感的,所以使用root許可權是一定要注意。當然,你也可以使用sudo來讓自己的使用者臨時獲得root許可權,這對於桌面使用者來說還是個不錯的方法,但是對於比較大的系統,給使用者sudo許可權一定要注意,最好不給!

Exit vs logout

         使用login登陸系統,那麼退出系統我們可以選擇exit或者logout,那麼這兩者之間有區別麼?大部分系統來說這兩者之間是沒有區別的,但是他們兩者還是有一點點的區別的:logout退出時會執行~/.bash_logout(如果有的話),而exit只會作退出工作而不執行~/.bash_logout。除此之外別無其他區別。

===========================
本文部分是我和大牛討論而寫出的,如果有異議歡迎指出並討論

 Linux啟動過程詳解 2012-02-06
13:55:05

分類: LINUX

啟動第一步--載入BIOS
當你開啟計算機電源,計算機會首先載入BIOS資訊,BIOS資訊是如此的重要,以至於計算機必須在最開始就找到它。這是因為BIOS中包含了CPU的相關資訊、裝置啟動順序資訊、硬碟資訊、記憶體資訊、時鐘資訊、PnP特性等等。在此之後,計算機心裡就有譜了,知道應該去讀取哪個硬體裝置了。

啟動第二步--讀取MBR
眾所周知,硬碟上第0磁軌第一個扇區被稱為MBR,也就是Master Boot Record,即主開機記錄,它的大小是512位元組,別看地方不大,可裡面卻存放了預啟動資訊、分割槽表資訊。
系統找到BIOS所指定的硬碟的MBR後,就會將其複製到0×7c00地址所在的實體記憶體中。其實被複制到實體記憶體的內容就是Boot Loader,而具體到你的電腦,那就是lilo或者grub了。

啟動第三步--Boot Loader
Boot Loader 就是在作業系統核心執行之前執行的一段小程式。通過這段小程式,我們可以初始化硬體裝置、建立記憶體空間的對映圖,從而將系統的軟硬體環境帶到一個合適的狀態,以便為最終呼叫作業系統核心做好一切準備。
Boot Loader有若干種,其中Grub、Lilo和spfdisk是常見的Loader。
我們以Grub為例來講解吧,畢竟用lilo和spfdisk的人並不多。
系統讀取記憶體中的grub配置資訊(一般為menu.lst或grub.lst),並依照此配置資訊來啟動不同的作業系統。

啟動第四步--載入核心
根據grub設定的核心映像所在路徑,系統讀取記憶體映像,並進行解壓縮操作。此時,螢幕一般會輸出“Uncompressing Linux”的提示。當解壓縮核心完成後,螢幕輸出“OK, booting the kernel”。
系統將解壓後的核心放置在記憶體之中,並呼叫start_kernel()函式來啟動一系列的初始化函式並初始化各種裝置,完成Linux核心環境的建立。至此,Linux核心已經建立起來了,基於Linux的程式應該可以正常執行了。

啟動第五步--使用者層init依據inittab檔案來設定執行等級
核心被載入後,第一個執行的程式便是/sbin/init,該檔案會讀取/etc/inittab檔案,並依據此檔案來進行初始化工作。
其實/etc/inittab檔案最主要的作用就是設定Linux的執行等級,其設定形式是“:id:5:initdefault:”,這就表明Linux需要執行在等級5上。Linux的執行等級設定如下:
0:關機
1:單使用者模式
2:無網路支援的多使用者模式
3:有網路支援的多使用者模式
4:保留,未使用
5:有網路支援有X-Window支援的多使用者模式
6:重新引導系統,即重啟
關於/etc/inittab檔案的學問,其實還有很多

啟動第六步--init程序執行rc.sysinit
在設定了執行等級後,Linux系統執行的第一個使用者層檔案就是/etc/rc.d/rc.sysinit指令碼程式,它做的工作非常多,包括設定PATH、設定網路配置(/etc/sysconfig/network)、啟動swap分割槽、設定/proc等等。如果你有興趣,可以到/etc/rc.d中檢視一下rc.sysinit檔案,裡面的指令碼夠你看幾天的

啟動第七步--啟動核心模組
具體是依據/etc/modules.conf檔案或/etc/modules.d目錄下的檔案來裝載核心模組。

啟動第八步--執行不同執行級別的指令碼程式
根據執行級別的不同,系統會執行rc0.d到rc6.d中的相應的指令碼程式,來完成相應的初始化工作和啟動相應的服務。

啟動第九步--執行/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的時候了,你已經可以用自己的帳號登入系統了。:)
===
漫長的啟動過程結束了,一切都清靜了…
其實在這背後,還有著更加複雜的底層函式呼叫,等待著你去研究…本文就算拋磚引玉了:)
本文參考瞭如下文章,精煉薈萃而成:
http://bbs.chinaunix.net/thread-835918-1-1.html
http://hi.baidu.com/fembed/blog/item/b9f0881f51145866f624e4be.html
http://baike.baidu.com/view/9485.htm