首先介紹點(diǎn)背景知識,關(guān)于inittab的:
init進(jìn)程是系統(tǒng)中所有進(jìn)程的父進(jìn)程,init進(jìn)程繁衍出完成通常操作所需的子進(jìn)程,這些操作包括:設(shè)置機(jī)器名、檢查和安裝磁盤及文件系統(tǒng)、啟動系統(tǒng)日志、配置網(wǎng)絡(luò)接口并啟動網(wǎng)絡(luò)和郵件服務(wù),啟動打印服務(wù)等。Solaris中init進(jìn)程的主要任務(wù)是按照inittab文件所提供的信息創(chuàng)建進(jìn)程,由于進(jìn)行系統(tǒng)初始化的那些進(jìn)程都由init創(chuàng)建,所以init進(jìn)程也稱為系統(tǒng)初始化進(jìn)程。
?????? 下面具體說明inittab文件的格式。
inittab文件中每一記錄都從新的一行開始,每個記錄項(xiàng)最多可有512個字符,每一項(xiàng)的格式通常如下:id:rstate:action:process,下面分別解釋。
1.id字段是最多4個字符的字符串,用來唯一標(biāo)志表項(xiàng)。
2.rstate(run state)字段定義該記錄項(xiàng)被調(diào)用時的運(yùn)行級別,rstate可以由一個或多個運(yùn)行級別構(gòu)成,也可以是空,空則代表運(yùn)行級別0~6。當(dāng)請求init改變運(yùn)行級別時,那些rstate字段中不包括新運(yùn)行級別的進(jìn)程將收到SIGTERM警告信號,并且最后被殺死;只有a、b、c啟動的命令外(a、b、c不是真正的運(yùn)行級別)
3.action字段告訴init執(zhí)行的動作,即如何處理process字段指定的進(jìn)程,action字段允許的值及對應(yīng)的動作分別為:
?????? 1)respawn:如果process字段指定的進(jìn)程不存在,則啟動該進(jìn)程,init不等待處理結(jié)束,而是繼續(xù)掃描inittab文件中的后續(xù)進(jìn)程,當(dāng)這樣的進(jìn)程終止時,init會重新啟動它,如果這樣的進(jìn)程已存在,則什么也不做。
?????? 2)wait:啟動process字段指定的進(jìn)程,并等到處理結(jié)束才去處理inittab中的下一記錄項(xiàng)。
?????? 3)once:啟動process字段指定的進(jìn)程,不等待處理結(jié)束就去處理下一記錄項(xiàng)。當(dāng)這樣的進(jìn)程終止時,也不再重新啟動它,在進(jìn)入新的運(yùn)行級別時,如果這樣的進(jìn)程仍在運(yùn)行,init也不重新啟動它。
?????? 4)boot:只有在系統(tǒng)啟動時,init才處理這樣的記錄項(xiàng),啟動相應(yīng)進(jìn)程,并不等待處理結(jié)束就去處理下一個記錄項(xiàng)。當(dāng)這樣的進(jìn)程終止時,系統(tǒng)也不重啟它。
?????? 5)bootwait:系統(tǒng)啟動后,當(dāng)?shù)谝淮螐膯斡脩裟J竭M(jìn)入多用戶模式時處理這樣的記錄項(xiàng),init啟動這樣的進(jìn)程,并且等待它的處理結(jié)束,然后再進(jìn)行下一個記錄項(xiàng)的處理,當(dāng)這樣的進(jìn)程終止時,系統(tǒng)也不重啟它。
?????? 6)powerfail:當(dāng)init接到斷電的信號(SIGPWR)時,處理指定的進(jìn)程。
?????? 7)powerwait:當(dāng)init接到斷電的信號(SIGPWR)時,處理指定的進(jìn)程,并且等到處理結(jié)束才去檢查其他的記錄項(xiàng)。
?????? 8)off:如果指定的進(jìn)程正在運(yùn)行,init就給它發(fā)SIGTERM警告信號,在向它發(fā)出信號SIGKILL強(qiáng)制其結(jié)束之前等待5秒,如果這樣的進(jìn)程不存在,則忽略這一項(xiàng)。
?????? 9)ondemand:功能通respawn,不同的是,與具體的運(yùn)行級別無關(guān),只用于rstate字段是a、b、c的那些記錄項(xiàng)。
?????????? 10)sysinit:指定的進(jìn)程在訪問控制臺之前執(zhí)行,這樣的記錄項(xiàng)僅用于對某些設(shè)備的初始化,目的是為了使init在這樣的設(shè)備上向用戶提問有關(guān)運(yùn)行級別的問題,init需要等待進(jìn)程運(yùn)行結(jié)束后才繼續(xù)。
?????? 11)initdefault:指定一個默認(rèn)的運(yùn)行級別,只有當(dāng)init一開始被調(diào)用時才掃描這一項(xiàng),如果rstate字段指定了多個運(yùn)行級別,其中最大的數(shù)字是默認(rèn)的運(yùn)行級別,如果rstate字段是空的,init認(rèn)為字段是0123456,于是進(jìn)入級別6,這樣便陷入了一個循環(huán),如果 inittab文件中沒有包含initdefault的記錄項(xiàng),則在系統(tǒng)啟動時請求用戶為它指定一個初始運(yùn)行級別
4.Process字段中進(jìn)程可以是任意的守候進(jìn)程、可執(zhí)行腳本或程序。
另外:在任何時候,可以在文件inittab中添加新的記錄項(xiàng),級別Q/q不改變當(dāng)前的運(yùn)行級別,重新檢查inittab文件,可以通過命令init Q或init q使init進(jìn)程立即重新讀取并處理文件inittab
以上這些都是介紹的標(biāo)準(zhǔn)的linux System V的標(biāo)準(zhǔn),所以對嵌入式來講有些東西并不見得有用!這里介紹點(diǎn)針對嵌入式的,也就是針對busybox init的:
busybox的init
?? 除了基本的命令之外,BusyBox還支持init功能,如同其它的init一樣,busybox的init也是完成系統(tǒng)的初始化工作,關(guān)機(jī)前的工作等等,我們知道在Linux的內(nèi)核被載入之后,機(jī)器就把控制權(quán)轉(zhuǎn)交給內(nèi)核,linux的內(nèi)核啟動之后,做了一些工作,然后找到根文件系統(tǒng)里面的init程序,并執(zhí)行它,BusyBox的init進(jìn)程會依次進(jìn)行以下工作:(參考<<構(gòu)建嵌入式LINUX系統(tǒng)>> p201)
1.?????? 為init設(shè)置信號處理過程
2.?????? 初始化控制臺
3.?????? 剖析/etc/inittab文件
4.?????? 執(zhí)行系統(tǒng)初始化命令行,缺省情況下會使用/etc/init.d/rcS
5.?????? 執(zhí)行所有導(dǎo)致init暫停的inittab命令(動作類型:wait)
6.?????? 執(zhí)行所有僅執(zhí)行一次的inittab(動作類型:once)
一旦完成以上工作,init進(jìn)程便會循環(huán)執(zhí)行以下進(jìn)程:
?????? 1.? 執(zhí)行所有終止時必須重新啟動的inittab命令(動作類型:once)
?????? 2.? 執(zhí)行所有終止時必須重新啟動但啟動前必須詢問用戶的inittab命令(動作類型:askfirst)
?????? 初始化控制臺之后,BusyBox會檢查/etc/inittab文件是否存在,如果此文件不存在,BusyBox會使用缺省的inittab配置,它主要為系統(tǒng)重引導(dǎo),系統(tǒng)掛起以及init重啟動設(shè)置缺省的動作,此外它還會為四個虛擬控制臺(tty1到tty4)設(shè)置啟動shell的動作。如果未建立這些設(shè)備文件,BusyBox會報錯。
?????? inittab文件中每一行的格式如下所示:(busybox的根目錄下的example文件夾下有詳盡的inittab文件范例)?????
?????? id:runlevel:action:process
盡管此格式與傳統(tǒng)的Sytem V init類似,但是,id在BusyBox的init中具有不同的意義。對BusyBox而言,id用來指定啟動進(jìn)程的控制tty。如果所啟動的進(jìn)程并不是可以交互的shell,例如BusyBox的sh(ash),應(yīng)該會有個控制tty,如果控制tty不存在,Busybox的sh會報錯。BusyBox將會完全忽略runlevel字段,所以空著它就行了,你也許會問既然沒用保留著它干嗎,我想大概是為了和傳統(tǒng)的Sytem V init保持一致的格式吧。process字段用來指定所執(zhí)行程式的路徑,包括命令行選項(xiàng)。action字段用來指定下面表中8個可應(yīng)用到process的動作之一。
動作
?結(jié)果
?
sysinit
?為init提供初始化命令行的路徑
?
respawn
?每當(dāng)相應(yīng)的進(jìn)程終止執(zhí)行便會重新啟動
?
askfirst
?類似respawn,不過它的主要用途是減少系統(tǒng)上執(zhí)行的終端應(yīng)用程序的數(shù)量。它將會促使init在控制臺上顯示“Please press Enter to active this console”的信息,并在重新啟動之前等待用戶按下enter鍵
?
wait
?告訴init必須等到相應(yīng)的進(jìn)程完成之后才能繼續(xù)執(zhí)行
?
once
?僅執(zhí)行相應(yīng)的進(jìn)程一次,而且不會等待它完成
?
ctratldel
?當(dāng)按下Ctrl+Alt+Delete組合鍵時,執(zhí)行相應(yīng)的進(jìn)程
?
shutdown
?當(dāng)系統(tǒng)關(guān)機(jī)時,執(zhí)行相應(yīng)的進(jìn)程
?
restart
?當(dāng)init重新啟動時,執(zhí)行相應(yīng)的進(jìn)程,通常此處所執(zhí)行的進(jìn)程就是init本身
?
?
以下是我的usblinux的inittab文件
::sysinit:/etc/init.d/rcS
::respawn:/sbin/getty? 115200? tty1
tty2::askfirst:-/bin/sh
tty3::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/bin/umount -a -r
這個inittab執(zhí)行下列動作
1.?????? 將/etc/init.d/rcS設(shè)置成系統(tǒng)的初始化文件
2.?????? 在115200 bps的虛擬終端tty1上啟動一個登陸會話 (注意getty的用法)
3.?????? 在虛擬終端tty2和tty3上啟動askfirst動作的shell
4.?????? 如果init重新啟動,將/sbin/init設(shè)置成它會執(zhí)行的程序
5.?????? 告訴init,在系統(tǒng)關(guān)機(jī)的時候執(zhí)行umount命令卸載所有文件系統(tǒng),并且在卸載失敗時用只讀模式?jīng)_新安裝以保護(hù)文件系統(tǒng)。
?
?
1、busybox的inittab與pc使用的inittab不同,第一ID并不是隨便取名字的,這個名字要與/dev/目錄下是否有對應(yīng)的文件對應(yīng)
對應(yīng)錯誤
?
can't open /dev/0: No such file or directory
process '-/bin/sh' (pid 789) exited. Scheduling for restart.
can't open /dev/0: No such file or directory
process '-/bin/sh' (pid 793) exited. Scheduling for restart.
2、出現(xiàn)下面這種錯誤:
process '-/bin/sh' (pid 789) exited. Scheduling for restart.
process '-/bin/sh' (pid 794) exited. Scheduling for restart.
process '-/bin/sh' (pid 796) exited. Scheduling for restart.
process '-/bin/sh' (pid 798) exited. Scheduling for restart.
對應(yīng)的inittab文件中有
ttyS0::askfirst:-/bin/sh
雖然在/dev/目錄下有ttyS0設(shè)備,但是這個設(shè)備顯然不可用,所以才會出現(xiàn)上面的錯誤
3、當(dāng)在inittab中同時定義的兩個在同一個串口終端登陸的語句時
::askfirst:-/bin/sh
s3c2410_serial0:23456:respawn:/sbin/getty -L s3c2410_serial0 115200 vt100
出現(xiàn)的情況就是被搶占,不能接收任何串口輸入
4、bad inittab entry
多半時因?yàn)榉欠ㄗ址斐傻摹?/p>
?
5、busybox中的字段runleve也沒有運(yùn)行時的運(yùn)行級別的概念
?
6、分析一下啟動的過程
1.?????? 為init設(shè)置信號處理過程
2.?????? 初始化控制臺
3.?????? 剖析/etc/inittab文件
4.?????? 執(zhí)行系統(tǒng)初始化命令行,缺省情況下會使用/etc/init.d/rcS
5.?????? 執(zhí)行所有導(dǎo)致init暫停的inittab命令(動作類型:wait)
6.?????? 執(zhí)行所有僅執(zhí)行一次的inittab(動作類型:once)
一旦完成以上工作,init進(jìn)程便會循環(huán)執(zhí)行以下進(jìn)程:
?????? 1.? 執(zhí)行所有終止時必須重新啟動的inittab命令(動作類型:once)
?????? 2.? 執(zhí)行所有終止時必須重新啟動但啟動前必須詢問用戶的inittab命令(動作類型:askfirst)
?????? 初始化控制臺之后,BusyBox會檢查/etc/inittab文件是否存在,如果此文件不存在,BusyBox會使用缺省的inittab配置,它主要為系統(tǒng)重引導(dǎo),系統(tǒng)掛起以及init重啟動設(shè)置缺省的動作,此外它還會為四個虛擬控制臺(tty1到tty4)設(shè)置啟動shell的動作。如果未建立這些設(shè)備文件,BusyBox會報錯。
?
7、網(wǎng)上有人問“-”的作用
我很納悶:
:: respawn:-/bin/sh
這個-是干什么的,為什么有的時候有有的時候沒有???
還有啊,我從網(wǎng)上看到一個例程,如下,節(jié)選:
::respawn:-/bin/sh
tty2::askfirst:-/bin/sh
我搞不清兩個的區(qū)別,這樣控制臺就啟動了,是第一句啟動的還是第二句,那我內(nèi)核啟動參數(shù)里面的console=ttyS0會自動來找這個控制臺???
原帖由 wavezone 于 2008-8-22 16:34 發(fā)表?
我很納悶:
:: respawn:-/bin/sh
這個-是干什么的,為什么有的時候有有的時候沒有???
還有啊,我從網(wǎng)上看到一個例程,如下,節(jié)選:
::respawn:-/bin/sh
tty2::askfirst:-/bin/sh
我搞不清兩個的區(qū)別 ...
?
測試的時候是這樣的,加上”-”的語句會在登陸終端之后調(diào)用/etc/目錄下的profile文件,而不加”-”的不會執(zhí)行這個腳本。
其實(shí)登陸終端的命令有幾種方便,但是標(biāo)準(zhǔn)的還是使用getty來登陸,但是直接使用如上的語句也是可以的,并且兼容性強(qiáng)一點(diǎn),因?yàn)樗恍枰付▽?yīng)的串口設(shè)備。
::askfirst:-/bin/sh
s3c2410_serial0::askfirst:-/bin/sh
::askfirst:-/bin/sh
s3c2410_serial0:23456:respawn:/sbin/getty -L s3c2410_serial0 115200 vt100
都是可用的。
?
8./bin/sh: XXX not found
arm-linux-readelf -d xxx
查看你的以用程序依賴哪些庫
一般是因?yàn)槿鄙賚ibc.so.6造成的,實(shí)際還是根文件系統(tǒng)的問題,沒有將常用的庫文件拷貝到/lib目錄下
常用的庫:
[root@centos lib]cp /usr/local/arm/3.4.1/arm-linux/lib/ld* .
[root@centos lib]cp /usr/local/arm/3.4.1/arm-linux/lib/libc-2.3.2.so .
[root@centos lib]cp /usr/local/arm/3.4.1/arm-linux/lib/libc.so.6 .
[root@centos lib]cp /usr/local/arm/3.4.1/arm-linux/lib/libm * .
[root@centos lib]cp /usr/local/arm/3.4.1/arm-linux/lib/libcrypt* .
9、錯誤insmod: chdir(2.6.26.6): No such file or directory
網(wǎng)上有人提出這種解決方法:
需要注意的是insmod等模塊加載命令需要從lib/modules/2.6.26.6
的目錄下加載模塊,所以必須先建立此目錄,然后將模塊放到此目錄下面,否則將出現(xiàn)以下兩種情況:
一是沒有建立lib/modules/2.6.26.6目錄,取決于內(nèi)核版本號,將出現(xiàn)insmod: chdir(2.6.26.6): No such file or directory的錯誤
二是只將模塊簡單地放在根目錄或其它文件夾,沒有將其拷貝到指定的lib/modules/2.6.26.6目錄,將出現(xiàn)
insmod: module 'gpio_driver' not found錯誤
不過這種方法不是很奏效
?
根本原因是insmod的問題,在busybox編譯的時候參考下面的選項(xiàng),不要使用
Linux Module Utilities --->
? [ ] Simplified modutils
//該選項(xiàng)不要選擇
[*] Support version 2.6.x Linux kernels?
//此選項(xiàng)選上
參考如下:
?
?
?
?
10、不能執(zhí)行”-h”命令
在執(zhí)行xxx –h時沒有任何反應(yīng)。是在lib目錄下缺少常見的庫文件
參考如下:
[root@vm-dev rootfs]# ls lib/
ld-2.3.6.so?????????????? libc-2.3.6.so????? libgcc_s.so????? libnsl.so.1???????????? libnss_files.so.2??????? libnss_nis.so.2???? librt-2.3.6.so?????? libthread_db.so.1
ld-linux.so.2???????????? libcrypt-2.3.6.so? libgcc_s.so.1??? libnss_compat-2.3.6.so? libnss_hesiod-2.3.6.so?? libpcprofile.so???? librt.so.1?????????? libutil-2.3.6.so
libanl-2.3.6.so?????????? libcrypt.so.1????? libm-2.3.6.so??? libnss_compat.so.2????? libnss_hesiod.so.2?????? libpthread-0.10.so? libSegFault.so?????? libutil.so.1
libanl.so.1?????????????? libc.so.6????????? libmemusage.so?? libnss_dns-2.3.6.so???? libnss_nis-2.3.6.so????? libpthread.so.0???? libtermcap.so.2????? modules
libBrokenLocale-2.3.6.so? libdl-2.3.6.so???? libm.so.6 ?libnss_dns.so.2???????? libnss_nisplus-2.3.6.so? libresolv-2.3.6.so? libtermcap.so.2.0.8
libBrokenLocale.so.1????? libdl.so.2???????? libnsl-2.3.6.so? libnss_files-2.3.6.so?? libnss_nisplus.so.2????? libresolv.so.2????? libthread_db-1.0.so
評論
查看更多