openwrt啟動指令碼分析

2021-07-24 02:54:15 字數 3565 閱讀 5155

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/etc/init.d

target/linux/brcm-2.4/base-files/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.linux核心的配置檔案由下面兩個檔案組成 a.target linux generic 2.4 config default b.target linux brcm 2.4 config default 在配置檔案中可以看到 config cmdline root...

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

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

OpenWrt啟動指令碼規則

在做專案過程中,時常新增一些啟動指令碼,但是對整個指令碼的啟動流程和規則缺乏理解,所以整理加深一下。etc init.d etc rc.d bin sh 指令碼直譯器 etc rc.common 指令碼執行前的檢查指令碼,可以檢測出非法的引數 start 40 在etc rc.d 生成s40 在啟動...