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 在啟動...