openwrt啟動流程

2021-06-21 01:42:02 字數 3545 閱讀 4433

openwrt是通過一系列shell指令碼進行啟動流程的組織,下面是啟動流程的提綱。如

果想詳細了解啟動的過程,則需要仔細走讀指令碼檔案。

1. 在make menuconfig 選擇target平台 broadcom bcm947xx/953xx [2.4]

2. linux核心的配置檔案由下面兩個檔案組成

target/linux/generic-2.4/config-default

target/linux/brcm-2.4/config-default

3. 在配置檔案中可以看到

config_cmdline="root=/dev/mtdblock2 rootfstype=squashfs,jffs2

init=/etc/preinit noinitrd console=ttys0,115200"

因此,linux核心啟動後,首先執行/etc/preinit指令碼

4. preinit指令碼位置在

package/base-files/files/etc/preinit

5. preinit指令碼是一系列指令碼的入口,這一系列指令碼放在下面的目錄:

package/base-files/files/lib/preinit

target/linux/brcm-2.4/base-files/lib/preinit

編譯完成後,會統一放在rootfs的/lib/preinit目錄下,

03_init_hotplug_failsafe_brcm 40_init_shm

05_failsafe_config_switch_brcm 40_mount_devpts

05_init_inte***ces_brcm 40_mount_jffs2

05_mount_skip 40_run_failsafe_hook

05_set_failsafe_switch_brcm 41_merge_overlay_hooks

10_check_for_mtd 50_choose_console

10_essential_fs 50_indicate_regular_preinit

10_indicate_failsafe 60_init_hotplug

10_indicate_preinit 70_initramfs_test

15_mount_proc_brcm 70_pivot_jffs2_root

15_set_preinit_inte***ce_brcm 80_mount_root

20_check_jffs2_ready 90_init_console

20_device_fs_mount 90_mount_no_jffs2

20_failsafe_net_echo 90_restore_config

20_failsafe_set_boot_wait_brcm 99_10_failsafe_login

30_device_fs_daemons 99_10_mount_no_mtd

30_failsafe_wait 99_10_run_init

由於指令碼眾多,因此openwrt的設計者將這些指令碼分成下面幾類:

preinit_essential

preinit_main

failsafe

initramfs

preinit_mount_root

每一類函式按照指令碼的開頭數字的順序執行。

6. preinit則執行下面的兩類指令碼

boot_run_hook preinit_essential

boot_run_hook preinit_main

7. preinit執行的最後乙個指令碼為99_10_run_init,執行

exec env - path=$pi_init_path $pi_init_env $pi_init_cmd

pi_init_cmd為

pi_init_cmd="/sbin/init"

因此開始執行busybox的init命令

8. busybox的init命令執行inittab的指令碼,該指令碼來自

package/base-files/files/etc/inittab

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

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

tts/0::askfirst:/bin/ash --login

ttys0::askfirst:/bin/ash --login

tty1::askfirst:/bin/ash --login

sysinit為系統初始化執行的 /etc/init.d/rcs s boot指令碼

shutdown為系統重啟或關機執行的指令碼

tty開頭的是,如果使用者通過串列埠或者telnet登入,則執行/bin/ash --login

askfirst和respawn相同,只是在執行前提示"please press enter to activate

this console."

9. 當前啟動轉到執行 /etc/init.d/rcs s boot,該指令碼來自

package/base-files/files/etc/init.d/rcs

和preinit類似,rcs也是一系列指令碼的入口,其執行/etc/rc.d目錄下s開頭的的所

有指令碼(如果執行rcs k stop,則執行k開頭的所有指令碼)

k50dropbear s02nvram s40network s50dropbear s96led

k90network s05netconfig s41wmacfixup s50telnet s97watchdog

k98boot s10boot s45firewall s60dnsmasq s98sysntpd

k99umount s39usb s50cron s95done s99sysctl

package/base-files/files

target/linux/brcm-2.4/base-files/etc/init.d/etc/init.d

還有一些指令碼來自各個模組,在install時拷貝到rootfs,比如dropbear模組

package/dropbear/files/dropbear.init

這些指令碼先拷貝到/etc/init.d下,然後通過/etc/rc.common指令碼,將init.d的腳

本鏈結到/etc/rc.d目錄下,並且根據 這些指令碼中的start和stop的關鍵字,新增

k$和s$的字首,這樣就決定了指令碼的先後的執行次序。

10.可以看出,openwrt的啟動主要是兩個階段,preinit主要是完成系統的初始化

(如檔案系統的準備、模組的載入),rcs主要依次 啟動各個模組。

附:指令碼走讀的一些技巧

a. rootfs目錄在build_dir/target-mipsel_uclibc-0.9.30.1/root-brcm-2.4,可以直接在該目錄下走讀shell指令碼。

b. openwrt的shell指令碼比較複雜,因此看指令碼時可以通過新增 set -x和echo等命令,直接看shell指令碼的結果,而不要花太多的時間硬看指令碼,主要是理解其主要的意思和設計思路。

openwrt啟動流程

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

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

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

Openwrt設定開機啟動

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