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優先順序,按照順...