天天看點

Linux-Android系統啟動之INIT程序和system v init

Linux系統啟動之INIT程序和system v init

一. Linux系統啟動之INIT程序和system v init

1. 首先介紹一下INIT程序

   init程序在Start_kernel執行完畢之後,也就是Kernel初始化完畢之後啟動,是系統所有程序的起點,核心在完成核内引導以後,即在本線程(程序)空間内加載init程式,它的程序号是1。

 如果是使用system v init啟動的話,實際上system v init就是一個INIT程序. 

2. 接下來介紹一下/etc/inittab檔案

 init程式需要讀取/etc/inittab檔案作為其行為指針,inittab是以行為機關的描述性(非執行性)文本,每一個指令行都具有以下格式: id:runlevel:action:process其中id為入口辨別符,runlevel為運作級别,action為動作代号,process為具體的執行程式。

 id一般要求4個字元以内,對于getty或其他login程式項,要求id與tty的編号相同,否則getty程式将不能正常工作。

 runlevel 是init所處于的運作級别的辨別,一般使用0-6以及S或s。0、1、6運作級别被系統保留,0作為shutdown動作,1作為重新開機至單使用者模式,6 為重新開機;S和s意義相同,表示單使用者模式,且無需inittab檔案,是以也不在inittab中出現,實際上,進入單使用者模式時,init直接在控制台(/dev/console)上運作/sbin/sulogin。

 在一般的系統實作中,都使用了2、3、4、5幾個級别,在Redhat系統中,2表示無NFS支援的多使用者模式,3表示完全多使用者模式(也是最常用的級别),4保留給使用者自定義,5表示XDM圖形登入方式。7-9級别也是可以使用的,傳統的unix系統沒有定義這幾個級别。runlevel可以是并列的多個值,以比對多個運作級别,對大多數action來說,僅當runlevel與目前運作級别比對成功才會執行。

  initdefault 是一個特殊的action值,用于辨別預設的啟動級别;當init由核心激活以後,它将讀取inittab中的initdefault項,取得其中的 runlevel,并作為目前的運作級别。如果沒有inittab檔案,或者其中沒有initdefault項,init将在控制台上請求輸入.

3. 分析一下system v init的流程   

>> 首先會執行/etc/rc.d/rc.sysinit,它主要完成啟動交換分區/檢查磁盤/配置主機名/檢查并挂載檔案系統/加載并初始化硬體子產品等功能;

>> 然後執行預設的運作級别模式(例如通過id:5:initdefault指定預設的運作級别為5的話,則會到etc/rc.d/rc5.d目錄下尋找并執行所有的配置檔案,實際上該目錄下的所有配置檔案都是連結到/etc/rc.d/init.d目錄下的檔案,可以通過ls -l指令來檢視具體的連結關系);

>> 接下來去執行/etc/rc.d/rc.local腳本檔案(這是INIT執行的最後一個腳本檔案,是以使用者可以在這個檔案中添加一些需要在登陸之前執行的指令,作用上和PC電腦windows或者dos系統中c盤根目錄下的autoexec.bat作用完全一樣);

>> 最後去執行/bin/login程式

 如果上述的初始化過程都能夠正常結束的話,将為使用者進行初始化環境操作,并将控制權交給shell.

二. 由Linux系統啟動之INIT程序和system v init想到的系統開機啟動應用程式的調用

 通過上面的講述可以看到,系統的啟動過程中init程序會去etc/rc.d/rc*.d目錄下尋找并執行預設運作級别的配置檔案,顯然在這個過程中可以通過添加配置檔案來啟動我們自己的應用程式.同時,我們也注意到system v init執行流程的第三步中會去檢查并執行/etc/rc.d/rc.local腳本檔案,可以通過該腳本檔案來啟動我們自己的應用程式.

 是以,我們得到如下的結論:

1. 在啟動/etc/init.d下添加啟動腳本,建立/etc/rc.d/.../目錄下的連結

 實際上系統中絕大部分的應用程式都是通過這種方式來進行啟動的。

 有關腳本的文法和寫法不是這裡描述的重點,網上資料一大把,去問BAIDU&GOOGLE吧.

2. 直接在/etc/rc.d/rc.local中添加指令,該腳本在啟動過程中調用

 比如我機器F10上rc.local的内容如下:

#!/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

 相應的在後面天加上自己要啟動的應用程式就可以了,例如有些example中使用如下的方式啟動nfs:/etc/rc.d/init.d/nfs restart (注釋以下,restart為調用腳本時候的參數)

 通過查詢資料,突然想起來可以通過u-boot或者類似的boot程式給kernel傳遞參數,通過參數來指定啟動的應用程式名字及其路徑,例如init=/passion's program(注釋:這隻是參數的一部分,完整的參數還有其它的内容,可以參照boot代碼或者kernel參數的相關介紹).隻不過,這個時候啟動應用程式的時間和上面的兩種方法不太一樣,這個是在kernel初始化剛結束的時候啟動的,就是在system v init還沒有啟動的時候調用的.當然了,上面的兩種方法啟動的應用程式的也不是在同一時刻進行調用.

 好了,收工.

繼續閱讀