深入探究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
至此,結束。