天天看點

《OpenWrt開發筆記》第13章 OpenWrt啟動流程【轉】

13.1系統介紹

任何系統的啟動都是開發人員首要關注的問題,因為隻有了解了系統的啟動流程和啟動機制,才能真正掌握一個系統,如果對啟動的啟動不熟悉的話,是不可能真正用好一個系統,openwrt系統也不例外,他的啟動和一般的嵌入式系統啟動還有所差別,現在咱們就分析一下openwrt的啟動流程。

13.2核心更新檔

在openwrt的官網上面下載下傳的源碼,其中包括了一些核心更新檔,這裡究竟為什麼要給核心做更新檔呢?因為openwrt為了支援更多的路由器,更多的操作和openwrt特有的一些核心功能,linux源碼是不具備的,這樣openwrt為了增加這些功能,就需要在linux官網上面下載下傳的源代碼中做一些修改,在這裡展現為給linux源碼打更新檔。Openwrt源碼中的linux更新檔檔案放在target/linux/generic檔案下面,有對于不同版本的linux核心更新檔檔案。Rt5350采用的是3.10版本的核心,是以他的更新檔檔案在patches-3.10目錄下面。這裡是所有的核心更新檔檔案,在編譯openwrt的時候,會首先把他們拷貝到核心目錄下面,然後在核心上面打上這些更新檔,然後再編譯核心。咱們首先分析他對于linux啟動的更新檔,它的名字是921-use_preinit_as_init.patch(在Ubuntu源檔案中),咱們可以看看他的内容。

《OpenWrt開發筆記》第13章 OpenWrt啟動流程【轉】

可以看到他它修改linux核心中預設的啟動項,可以看到它首先啟動/etc/preinit(開發闆的檔案系統中),它是個腳本,咱們就從這個腳本說起。

13.3 preinit

preinit腳本在etc目錄下面,首先先看看他的内容:

《OpenWrt開發筆記》第13章 OpenWrt啟動流程【轉】
《OpenWrt開發筆記》第13章 OpenWrt啟動流程【轉】
《OpenWrt開發筆記》第13章 OpenWrt啟動流程【轉】

這就是個bash腳本,前半部分隻是定義了一些變量,先記住他們的内容即可,有兩個函數是我們需要了解的,boot_hook_init和boot_run_hook。他們定義在/lib/functions/preinit.sh檔案中,boot_hook_init是初始化一個函數隊列,boot_run_hook是運作一個函數隊列,還有一個這個檔案沒有展現,後面的檔案中會遇到,這裡說明一下,boot_book_add這個是在一個函數隊列中添加一個函數。然後就是執行:

《OpenWrt開發筆記》第13章 OpenWrt啟動流程【轉】

循 環 執 行/lib/preinit 目錄下面的腳本,這裡簡要分析/lib/preinit目錄下的一個檔案,循環執行/lib/preinit目錄下面的腳本,這裡簡要分析一個,這裡分析02_default_set_state,首先看看他的内容。

《OpenWrt開發筆記》第13章 OpenWrt啟動流程【轉】

可以看到它就是在preinit_main函數隊列中增加一個函數,這個函數就是簡單的執行一個腳本。當運作preinit_main的時候,隊列中的所有函數就會依次執行。其他檔案可以自行分析,都比較簡單。

最後在preinit腳本中執行preinit_main。執行完這個腳本之後init程序會根據inittab檔案執行其他的啟動項。

13.4 inittab

inittab為linux初始化檔案系統時init初始化程式用到的配置檔案。這個檔案負責設定init初始化程式初始化腳本在哪裡;每個運作級初始化時運作的指令;開機、關機、重新開機對應的指令;各運作級登陸時所運作的指令。

如果存在/etc/inittab檔案,Busyboxinit程式解析它,然後按照它的訓示建立各種子程序,否則使用預設的配置建立子程序。

/etc/inittab檔案中每個條目用來定義一個子程序,并确定它的啟動方法,格式如下

< id> : < runlevels>:< action>:< process>

1、id:表示這個子程序要使用的控制台,如果省略,則使用與init程序一樣的控制台.

2、runlevels:這個字段沒有意義,可以省略。在linux有意義.

3、action:表示init程序如何控制這個子程序,具體取值見下表.

4、process:要執行的程式,它可以是可執行程式,也可以是腳本.如果process字段前有“-”字元,這個程式被稱為“互動的”.

【attention】action取值

表1

《OpenWrt開發筆記》第13章 OpenWrt啟動流程【轉】

先肯看/etc/inittab中的内容:

《OpenWrt開發筆記》第13章 OpenWrt啟動流程【轉】

從上面的分析可以看出它在開機啟動的時候執行/etc/init.d/rcS腳本,以前是有/etc/init.d/rcS腳本的,現在的openwrt已經去掉了這個腳本檔案,隻要有rcSSboot這幾個參數就可以,但是功能是有的就是按順序執行/etc/rc.d下面的各個腳本,以S開頭代表啟動的時候執行的腳本,與指令行中的S對應,以K開頭的代表關機的時候需要執行的腳本,與指令行中的K對應。

13.5總結

從上面的分析我們來總結一下openwrt的啟動流,/etc/preinit->/lib/preinit/* ->/etc/inittab->/etc/rc.d/S*。

【微信公衆号】 張昺華