1. 程式人生 > >深入探究Linux下ARM啟動指令碼(/etc/init.d/rcS)在什麼位置被呼叫

深入探究Linux下ARM啟動指令碼(/etc/init.d/rcS)在什麼位置被呼叫

每次啟動板子都要重新設定IP地址,很麻煩,就從網上搜搜怎麼設定成開機自動修改IP地址。

搜的過程中,想著Linux裡面的啟動指令碼是在哪個地方被呼叫?想想還是自己理一遍。

(自己理解的啟動指令碼就是在開機過程中固定呼叫某幾個指令碼,但這樣感覺會不會有點寫死了,Linux可能有更好的解決方案)

百度上全部都是講如何使用啟動指令碼的...很少有文章去研究啟動指令碼在哪個位置被呼叫......

還是找到了一點蛛絲馬跡。

首先,初步搜尋“嵌入式Linux系統啟動指令碼”,大致可以知道:將想要設定某些服務自啟動,只需要在/etc/init.d/rcS下新增指令碼就行了。

然後,搜尋“/etc/init.d/rcS內容分析”,大致可以知道:Linux核心啟動過程中,會掛載檔案系統,在檔案系統掛載後,執行的第一個程式就是根目錄下的linuxrc,而這是一個指向/bin/busybox 的連結,也就是說,系統起來後執行的第一個程式就是busybox本身。

再然後,busybox會解析“/etc/inittab”配置檔案,而/etc/inittab配置檔案裡面會執行/etc/init.d/rcS這個指令碼!


追根溯源,流程大致如下: init程式(linuxrc) -> busybox -> /etc/inittab -> /etc/init.d/rcS

接下來,繼續分析一下/etc/init.d/rcS這個指令碼,內容如下:

#! /bin/sh  // 必須含有這個第一行,表明是bash指令碼
 
/bin/mount -a  // 自動載入檔案系統,檔案系統是通過fstab來配置的 

echo "  // 原來系統啟動後的標誌是在這個位子被打印出來的
            _ _ _ _ _ _ _ _ _ _ _ _
            \  _  _   _  _ _ ___
            / /__/ \ |_/
           / __   /  -  _ ___
          / /  / /  / /
  _ _ _ _/ /  /  \_/  \_ ______
___________\___\__________________
"

ENV_CONF=/etc/conf/env.conf
[ -f ${ENV_CONF} ] && source ${ENV_CONF}

for initscript in /etc/init.d/S[0-9][0-9]*  // 遍歷/etc/init.d/下面所有S開頭,符合格式Snn*格式的服務啟動指令碼  
do
        if [ -x $initscript ] ;  // 如果服務啟動指令碼檔案存在,執行下面啟動流程  
        then
                echo "[RCS]: $initscript"
                source $initscript  // 執行啟動指令碼
        fi
done

分析後發現,在rcS指令碼中,會遍歷/etc/init.d/下面所有S開頭,符合格式Snn*格式的服務啟動指令碼,如果有則啟動指令碼。

總結下吧,如果我們想要在開發板中執行一個指令碼,可以有如下操作:

    1.寫一個指令碼檔案,然後在 /etc/inittab配置檔案中新增並執行該指令碼

    2.寫一個指令碼檔案,腳步檔名符合“S[0-9][0-9]*”,這樣在/etc/init.d/rcS指令碼執行過程中會被執行

    3.直接在/etc/init.d/rcS指令碼檔案末尾新增需要的指令碼程式碼

注意!!!

    之前理清了啟動流程,以為可以直接修改init.d目錄下的檔案,然後實際操作的時候發現並不行!

    後來明白原因應該是,這幾個檔案都是載入根檔案系統時被新增進來的,所以,如果要修改啟動指令碼,必須是在製作根檔案系統時,修改這幾個指令碼檔案。如果在系統啟動後,通過vi /etc/init

.d/rcS修改指令碼,那麼系統重新啟動後,指令碼又會恢復成原來的。(因為這幾個指令碼都是根檔案系統下面的,每次啟動都從根檔案系統下重新拷貝過來)

至此,結束。