openwrt network 初始化


openwrt 燒寫完成之后, 第一次啟動會設置 network 的相關參數, 如 ip地址, mac地址, 等.

這里跟蹤一下啟動之后直到網絡參數設置的過程.

  1. /sbin/init -> procd -> "sysinit" -> /etc/rc.d/xxx

  2. /etc/rc.d/S10boot -> /etc/init.d/boot

  3. /etc/init.d/boot -> /bin/board_detect

  4. /bin/board_detect -> /etc/board.d/02_network

看看 /bin/board_detect 都做了什么:

#!/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
}
  1. 如果存在 /etc/board.d 目錄, 並且, 普通文件 /etc/board.json 不存在, 則執行 /etc/board.d/ 下的所有腳本

  2. /etc/board.json 被創建了, 則立即返回
    這里搞錯了,謝謝回復中的朋友指正。 這段的邏輯是:/etc/board.json 存在的話,則繼續往下執行;如果不存在則立即返回。

  3. 沒有 /etc/board.json 文件, 說明 /etc/board.d/ 下的腳本沒有按預期設置參數, 則繼續嘗試使用 /bin/config_generate 來設置.

這里的第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 腳本中完成的.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM