openwrt network 初始化

openwrt 烧写完成以后, 第一次启动会设置 network 的相关参数, 如 ip地址, mac地址, 等.json

这里跟踪一下启动以后直到网络参数设置的过程.网络

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

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

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

  4. /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
}
  1. 若是存在 /etc/board.d 目录, 而且, 普通文件 /etc/board.json 不存在, 则执行 /etc/board.d/ 下的全部脚本io

  2. /etc/board.json 被建立了, 则当即返回
    这里搞错了,谢谢回复中的朋友指正。 这段的逻辑是:/etc/board.json 存在的话,则继续往下执行;若是不存在则当即返回。function

  3. 没有 /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 脚本中完成的.

相关文章
相关标签/搜索