zoukankan      html  css  js  c++  java
  • 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 脚本中完成的.

  • 相关阅读:
    Solon 开发进阶,二、体外扩展机制
    Solon Web 开发,二、开发知识准备
    Solon Web 开发,四、请求上下文
    CODING 项目协同 2.0 —— 让协作有条不紊
    (三)React组件的三大特性 State
    (四)React组件的三大特性 Props
    (五)React的三大特性 refs
    (二)React的组件的创建 ,js类的基础复习
    (一)React系列文章:虚拟DOM的创建与解释,注意的相关规则
    [源码解析] PyTorch 分布式(16) 使用异步执行实现批处理 RPC
  • 原文地址:https://www.cnblogs.com/sammei/p/4091863.html
Copyright © 2011-2022 走看看