openwrt啟動流程

2021-07-24 04:09:50 字數 4285 閱讀 1654

了解openwrt系統的啟動流程

1.1:系統介紹

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

1.2:核心補丁

openwrt原始碼中的linux補丁檔案放在$/target/linux/generic/檔案下面,有對於不同版本的linux核心補丁。根據採用不同的核心,使用不同的補丁。這些不同的核心補丁檔案,在編譯openwrt的時候,會首先把他們拷貝到核心目錄下面,然後在核心上面打上這些補丁,然後在編譯核心。首先分析他對於linux啟動的補丁,他的名字是:921-use_preinit_as_init.patch(應該與平台有關),下面是乙個例項:

--- a/init/main.c

+++ b/int/main.c

@@ -844,7 +844,8 @@ static int _ref kernel_init(void *unuse

pr_err("failed to execute %s. attempting default...\n"),

execute_command);

}- if(!run_init_process("/sbin/init")||

+ if(!run_init_process("/etc/preinit")||

!run_init_process("/sbin/init")||

!run_init_process("/etc/init")||

!run_init_process("/bin/preinit")||

!run_init_process("/bin/sh"))

可以看到他修改linux中預設的啟動項,可以看到它首先啟動「/etc/preinit」.他是乙個指令碼,咱們就從指令碼說起.

!/bin/sh

[ -z "$preinit" ] && exec /sbin/init

export path=/usr/sbin:/usr/bin:/sbin:/bin

pi_ifname=

pi_ip=192.168.1.1

pi_broadcast=192.168.1.255

pi_netmask=255.255.255.0

fs_failsafe_ifname=

fs_failsafe_ip=192.168.1.1

fs_failsafe_broadcast=192.168.1.255

fs_failsafe_netmask=255.255.255.0

fs_failsafe_wait_timeout=2

pi_suppress_stderr="y"

pi_init_suppress_stderr="y"

pi_init_path="/usr/sbin:/usr/bin:/sbin:/bin"

pi_init_cmd="/sbin/init"

. /lib/functions.sh

. /lib/functions/preinit.sh

. /lib/functions/system.sh

boot_hook_init preinit_essential

boot_hook_init preinit_main

boot_hook_init failsafe

boot_hook_init initramfs

boot_hook_init preinit_mount_root

for pi_source_file in /lib/preinit/*; do

. $pi_source_file

done

boot_run_hook preinit_essential

pi_mount_skip_next=false

對於這個bash指令碼,前半部分定義了一些變數,先記住他們即可,但是有兩個函式需要了解,即:boot_hook_init 和 boot_run_hook 他們的定義在/lib/functions/preinit.sh檔案當中,boot_hook_init是初始化乙個函式佇列,boot_run_hook是執行乙個函式佇列,有一點該檔案沒有體現,後面檔案當中會遇到,這裡說明一下,boot_hook_add這個是在乙個函式佇列中新增乙個函式。然後就是執行:

for pi_source_file in/lib/preinit/*

. $pi_source_file

done

迴圈執行/lib/preinit 目錄下的乙個檔案,這裡分析02_default_set_state,首先看看他的內容。

#!/bin/sh

define_default_set_state(){

. /etc/diag.h

boot_hook_add pre_main define_set_state

可以看到他就是在preinit_main 函式佇列中增加乙個函式,這個函式就是簡單的執行乙個指令碼。當執行preinit_main 的時候,佇列中的所有函式就會一次的執行。其他檔案可以自行分析,都比較簡單。最後在preini指令碼中執行preinit_main。(作為初學者的我並不會。。)執行完這個指令碼後init程序會根據inittab檔案執行其他的啟動項。

1.4inittab分析

inittab為linux初始化檔案系統時init初始化檔案系統用到的配置檔案。這個檔案負責設定init初始化程式初始化指令碼在**;每個執行級初始化時命令的執行;開機,關機,重啟對應的命令;個執行級登陸時執行的命令。

如果存在/etc/libtab檔案,busybox init程式解析他,然後按照他的知識來建立各種子程序,否則使用預設的配置建立子程序。/etc/libtab 檔案中每個條目用來定義乙個子程序,並且確定他的啟動方法,格式如下:

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

2:runlevel:這個字段沒有意義,可以省略。在linux下是具有意義的。

3:action:表示init程序如何控制這個子程序,下面會給出乙個**

4:process:這個就是我們要執行的可執行程式,當然也可以是乙個指令碼,如果process欄位錢有乙個「-」字元,這個程式就被稱作是互動的。

名稱執行條件

說明sysinit

系統啟動後最先執行

指定初始化指令碼路徑,當然只

執行一次,init程序等待他結束、

繼續執行其他的動作。

wait

系統執行完sysinit程序之後

只執行一次,init程序等待它結束

才繼續執行其他動作

once

系統執行完wait程序之後

只執行一次,init程序不會等待他結束

respawn

啟動完once程序後

init程序檢測發現子程序退出時,重新啟動他,永不

結束,比如shell命令直譯器

askfirst

啟動完respawn程序後

與respawn類似,不過init程序先輸出「please

press enter toactive thisconsole」,等待使用者輸入

回車後才啟動子程序。

shutdown

當系統關機時

及重啟。關閉系統時執行的程式

restart

系統重啟時

init程序重啟時執行的程式,通常是init程式本身先重新讀取,解析/etc/initlab檔案,在執行restart程式

ctrl+alt+del

按下ctrl+alt+del按鍵的時候

按下ctrl+alt+del按鍵的時候執行的程式

下面是我自己的openwrt裡的initlab內容:

::sysinit:/etc/init.d/rcs s boot

::shutdown:/etc/init.d/rcs k shutdown

::askconsole:/bin/ash --login

從上面的分析可以看出它在開機的時候執行的是:/etc/init.d/rcs 指令碼,以前是有/etc/init.d/rcs指令碼的,但是現在的openwrt已經去掉了這個指令碼,只要有rcs s boot這幾個引數就可以了,但是功能是有的就是按順序執行/etc/init.d下面的各個指令碼,以s開頭代表啟動的時候執行的指令碼,與命令中的s對應,以k 開頭的代表關機時候需要執行的指令碼,與命令列中的k對應。

1.5總結

這裡就不寫了

在沒有你的世界裡,愛你,葉錚。

openwrt啟動流程

openwrt是通過一系列shell指令碼進行啟動流程的組織,下面是啟動流程的提綱。如 果想詳細了解啟動的過程,則需要仔細走讀指令碼檔案。1.在make menuconfig 選擇target平台 broadcom bcm947xx 953xx 2.4 2.linux核心的配置檔案由下面兩個檔案組成...

Openwrt啟動流程及啟動指令碼分析

在linux的發展過程中,linux 的啟動程式也在發展,從 sysv init 到現在的 upstart systemd,通常該程式是程序號為 1的程序,該程式在 linux 系統有著舉足輕重的地方。在 openwrt 中,使 用了另外一種啟動程式叫做 procd 本文的重點並不在於介紹 proc...

Openwrt設定開機啟動

設定開機啟動原理 etc init.d目錄下面就是系統載入的開機配置 每個配置可以設定start優先順序,數字越大啟動越靠後,如果有很多需要依賴網路或者usb之類的啟動程式最好設定靠後一些,等其他程式啟動了再啟動。系統讀取etc init.d 下的啟動配置檔案後,系統會根據start優先順序,按照順...