Embedded Linux: 如何讓海思Hi3518開機後自動執行Shell Script?
我目前正於海思平台上進行開發,芯片是Hi3518E,Linux的內核是使用海思SDK所提供的代碼去編譯,所以我想以下所說的,大概跟其他海思芯片是差不多的吧(既然是同一家公司的,工程師做的東西應該都差不多才對吧),不過還是以Hi3518為準~
已經了解了Hi3518一段時間,目前需要它於開機啟動時自動插入一些驅動和程序,所以小小研究了一下要怎麼做。首先,因為有一系列的指令要做,所以就給它寫了個Shell Script(腳本),讓它可以一次過運行我所有的指令,之後再放入Startup。至於Shell Script要怎麼寫,我暫時就不多說了,因為我知的也不多~ 哈哈~
0. 基礎知識
/etc/init.d/
: init.d 是一個用來存放Unix/Linux Shell Script的文件夾,如果你的內核有開啟 init.d 的話,系統啟動時,會在登入前自行執行存放在這裡的腳本。一般系統上所有服務的啟動腳本都會放在這裡,一般是Linux系統的話,應該都會看到它的蹤影。
/etc/init.d/rcS
: rcS 是 init.d 下的一個腳本,它在這裡是規限了之後要執行哪些Shell Scripts。
所以放在/etc/init.d/
裡的文件都不一定會自動執行,要附合rcS裡的條件才行!原因是其實系統啟動後是會先分析/etc/inittab
之後再根據inittab去運行其他東西,打開inittab,你可以看到裡面有以下內容:
# /etc/inittab init(8) configuration for BusyBox # 一大堆comment... ::sysinit:/etc/init.d/rcS ::sysinit:/bin/mkdir /dev/shm
其實第一句就是要執行/etc/init.d/rcS
了!
再打開/etc/init.d/rcS
,就會查看到它會運行什麼腳本,之後會再詳細一點說。
在Hi3518E下檢視/etc/init.d/
有以下結果:
1. 把Shell Script放到 /etc/init.d
cp /your_path/script_name /etc/init.d/
your_path是Script原本的路徑。
script_name是Script的名稱。
或是你也可以用vi這個簡單的文字編輯器去編寫一個shell script
vi /etc/init.d/script_name
2. 把你的腳本權限改成乭運行的
chmod +x /etc/init.d/script_name
3. 讓Shell Script在開機時自動執行
剛才提到,/etc/init.d/rcS
規限了要執行的Scripts,所以我們就打開它看一下吧!
文件尾部有:
#! /bin/sh /bin/mount -a for initscript in /etc/init.d/S[0-9][0-9]* do if [ -x $initscript ] ; then echo "[RCS]: $initscript" $initscript fi done
從這裡我們可以得知,系統其後只會運行名稱為「SnnXXXXX」的Scripts,其中 n 是任何數字(0 – 9),X 是任何字符,例如:S00devs、S01udev、S80network、S99config……
所以我們如果要讓它自動運行其他Scripts,那就得改一下rcS囉!不過,最簡單的方法,當然就是把你的Script名稱改成跟它一樣的格式囉~
cd /etc/init.d/
mv ./script_name ./S99script_name
重新啟動,你就應該會發現你的Script已經會自動執行了!
在我的系統,是會有類似以下的提示:
[RCS]: /etc/init.d/S00devs
[RCS]: /etc/init.d/S01udev
[RCS]: /etc/init.d/S80network