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
修改了原文中的一些錯字。