openwrt 燒寫完成以後, 第一次啓動會設置 network 的相關參數, 如 ip地址, mac地址, 等.json
這裏跟蹤一下啓動以後直到網絡參數設置的過程.網絡
/sbin/init -> procd -> "sysinit" -> /etc/rc.d/xxxcode
/etc/rc.d/S10boot -> /etc/init.d/boot接口
/etc/init.d/boot -> /bin/board_detectip
/bin/board_detect -> /etc/board.d/02_networkci
看看 /bin/board_detect 都作了什麼:it
#!/bin/sh [ -d "/etc/board.d/" -a ! -f "/etc/board.json" ] && { for a in `ls /etc/board.d/*`; do [ -x $a ] || continue; $(. $a) done } [ -f "/etc/board.json" ] || return 1 [ -f "/etc/config/network" ] || { touch /etc/config/network /bin/config_generate }
若是存在 /etc/board.d 目錄, 而且, 普通文件 /etc/board.json 不存在, 則執行 /etc/board.d/ 下的全部腳本io
/etc/board.json 被建立了, 則當即返回
這裏搞錯了,謝謝回覆中的朋友指正。 這段的邏輯是:/etc/board.json 存在的話,則繼續往下執行;若是不存在則當即返回。function
沒有 /etc/board.json 文件, 說明 /etc/board.d/ 下的腳本沒有按預期設置參數, 則繼續嘗試使用 /bin/config_generate 來設置.date
這裏的第1步使用 /etc/board.json 文件來保證 /etc/board.d/ 下的腳本只執行一次.
/etc/board.d/02_network 腳本中調用了 lib/functions/uci-defaults-new.sh 中的許多接口, 其中 board_config_update() 和 board_config_flush() 就用來建立 /etc/board.json 文件.
若是 /etc/config/network 文件不存在的話,則建立該文件,並執行 /bin/config_generate
。下次開機時,因爲 /etc/config/network 已經建立,則 /bin/config_generate 再也不執行。
root@OpenWrt:/# cat /etc/board.json { "network": { "lan": { "ifname": "eth0", "create_vlan": true, "macaddr": "00:0c:43:76:20:b8" } }, "switch": { "mt7530": { "enable": true, "reset": true, "vlans": { "lan": [ 0, 1, 2, 3 ], "wan": [ 4 ], "vlan3": [ 5 ] }, "cpu_port": 6 } } }
今天查看 openwrt 14.07 release 版本, 其中對 network 的實現有點細微差異.
14.07 中在 /etc/init.d/boot 腳本會在開機時逐一執行 /etc/uci-deafults/ 目錄下的腳本, 執行完以後再刪除它. 這就保證了該目錄下的腳本只會被執行一次, 之後再重啓也不會執行到了. 除非恢復初廠設置.
network 的設置就是在 /etc/uci-defaults/02_network 腳本中完成的.