天天看點

busybox的init初始化程序

busybox的init

   除了基本的指令之外,BusyBox還支援init功能,如同其它的init一樣,busybox的init也是完成系統的初始化工作,關機前的工作等等,我們知道在Linux的核心被載入之後,機器就把控制權轉交給核心,linux的核心啟動之後,做了一些工作,然後找到根檔案系統裡面的init程式,并執行它,BusyBox的init程序會依次進行以下工作:(參考> p201)

1.       為init設定信号處理過程

2.       初始化控制台

3.       剖析/etc/inittab檔案

4.       執行系統初始化指令行,預設情況下會使用/etc/init.d/rcS

5.       執行所有導緻init暫停的inittab指令(動作類型:wait)

6.       執行所有僅執行一次的inittab(動作類型:once)

一旦完成以上工作,init程序便會循環執行以下程序:

       1.  執行所有終止時必須重新啟動的inittab指令(動作類型:once)

       2.  執行所有終止時必須重新啟動但啟動前必須詢問使用者的inittab指令(動作類型:askfirst)

       初始化控制台之後,BusyBox會檢查/etc/inittab檔案是否存在,如果此檔案不存在,BusyBox會使用預設的inittab配置,它主要為系統重引導,系統挂起以及init重新開機動設定預設的動作,此外它還會為四個虛拟控制台(tty1到tty4)設定啟動shell的動作。如果未建立這些裝置檔案,BusyBox會報錯。

       inittab檔案中每一行的格式如下所示:(busybox的根目錄下的example檔案夾下有詳盡的inittab檔案範例)      

       id:runlevel:action:process

盡管此格式與傳統的Sytem V init類似,但是,id在BusyBox的init中具有不同的意義。對BusyBox而言,id用來指定啟動程序的控制tty。如果所啟動的程序并不是可以互動的shell,例如BusyBox的sh(ash),應該會有個控制tty,如果控制tty不存在,Busybox的sh會報錯。BusyBox将會完全忽略runlevel字段,是以空着它就行了,你也許會問既然沒用保留着它幹嗎,我想大概是為了和傳統的Sytem V init保持一緻的格式吧。process字段用來指定所執行程式的路徑,包括指令行選項。action字段用來指定下面表中8個可應用到process的動作之一。

動作

結果

sysinit

為init提供初始化指令行的路徑

respawn

每當相應的程序終止執行便會重新啟動

askfirst

類似respawn,不過它的主要用途是減少系統上執行的終端應用程式的數量。它将會促使init在控制台上顯示“Please press Enter to active this console”的資訊,并在重新啟動之前等待使用者按下enter鍵

wait

告訴init必須等到相應的程序完成之後才能繼續執行

once

僅執行相應的程序一次,而且不會等待它完成

ctratldel

當按下Ctrl+Alt+Delete組合鍵時,執行相應的程序

shutdown

當系統關機時,執行相應的程序

restart

當init重新啟動時,執行相應的程序,通常此處所執行的程序就是init本身

以下是我的usblinux的inittab檔案

::sysinit:/etc/init.d/rcS 

::respawn:/sbin/getty  38400  tty1 

tty2::askfirst:-/bin/sh 

tty3::askfirst:-/bin/sh 

::restart:/sbin/init 

::ctrlaltdel:/bin/umount -a -r 

這個inittab執行下列動作

1.       将/etc/init.d/rcS設定成系統的初始化檔案

2.       在38400 bps的虛拟終端tty1上啟動一個登陸會話 (注意getty的用法)

3.       在虛拟終端tty2和tty3上啟動askfirst動作的shell

4.       如果init重新啟動,将/sbin/init設定成它會執行的程式

5.       告訴init,在系統關機的時候執行umount指令解除安裝所有檔案系統,并且在解除安裝失敗時用隻讀模式重新安裝以保護檔案系統。

5.6  系統的配置檔案

5.6.1. /etc/init.d/rcS檔案

配置檔案一般放在/etc/目錄下,5.5.3節說了init初始化指令行的檔案是/etc/init.d/rcS,下面是我的rcS檔案

       #!/bin/sh 

    /bin/mount -n -t proc  /proc  /proc 

    /bin/mount -n -o  remount,rw  / 

    /bin/mount -av 

    /bin/hostname usblinux 

    /etc/init.d/rc.nic 

    /etc/init.d/rc.network 

    /etc/init.d/rc.usb 

    /etc/init.d/rc.local 

1.       安裝proc檔案系統,但是不寫入/etc/mtab檔案(mtab檔案是df指令讀取的檔案)

2.       以讀寫模式重新挂載根檔案系統(需要/etc/fstab檔案)

3.       mount -av 挂載所有在/etc/fstab裡面列出的檔案系統

4.       主機名命名為usblinux

5.       依次執行rc.nic(自動檢測網卡),rc.network(配置網絡),rc.usb(加載usb子產品),rc.local(執行本地的一些服務)

5.6.2. /etc/fstab

上面使用mount指令的時候已經涉及到了fstab檔案,下面是我的fstab檔案

/dev/ram0       /       ext2    defaults    0   0 

proc            /proc   proc    defaults    0   0 

關于fstab配置檔案的文法可以man fstab

其實rcS裡面的mount -av沒有必要加上去。

5.6.3. /etc/mtab

這個檔案裡面的内容是動态變化的,當mount一個檔案系統的時候,如果mount 沒有加上-n參數,那麼安裝資訊就會寫入mtab檔案,df指令讀取的就是這個檔案。

5.6.4. /etc/profile

這個檔案是sh用的,當使用者獲得一個shell後,sh就會根據這個檔案配置使用者的登陸環境,下面是我的profile檔案。

PATH=/bin:/sbin:/usr/bin:/usr/sbin 

PS1='[\[email protected]\h \W]\$ ' 

HOSTNAME='/bin/hostname' 

export PATH HOSTNAME PS1 

alias l.='ls -d .[a-zA-Z]* --color=tty' 

alias rm='rm -i' 

alias cp='cp -i' 

alias mv='mv -i' 

export PATH=/usr/local/bin:$PATH 

export PATH=/usr/local/sbin:$PATH 

其中PATH環境變量指定當使用者鍵入一個指令時,sh尋找這個指令的路徑。

PS1指定sh提示符的格式

其它的export指令,alias指令不用說了吧,busybox裡面的ash和bash非常相似,是以隻要熟悉bash就會不成問題。

轉載自:http://blog.chinaunix.net/uid-20321537-id-1966856.html

修改了原文中的一些錯字。