• 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 脚本中完成的.

  • 相关阅读:
    依赖注入简单解释
    设计模式
    Git 命令使用
    手机版自适应
    自定义属性的添加
    innerText Textcontent浏览器兼容代码
    获取间的内容
    密码长度为6-10的判断
    模拟输入框
    排他功能
  • 原文地址:https://www.cnblogs.com/sammei/p/4091863.html
Copyright © 2020-2023  润新知