openwrt的默认/etc/config/network文件是如何生成的?

摘要:
openwrt的network文件,或者说在/etc/config下的文件,都是动态生成的。我们看一看uci-default.sh的内容#!

openwrt的network文件,或者说在/etc/config下的文件,都是动态生成的。

脚本的函数定义在openwrt1407/package/base-files/files/lib/functions中,有以下几个文件:

tf@ubuntu:~/projects/openwrt1407/package/base-files/files/lib/functions$ lsleds.sh  network.sh  preinit.sh  service.sh  system.sh  uci-defaults.sh

其中uci-defaults.sh会生成默认的/etc/config下的文件,而其它文件是它的“库”。

我们看一看uci-default.sh的内容

#!/bin/sh# Copyright (C) 2011OpenWrt.org

UCIDEF_LEDS_CHANGED=0
ucidef_set_led_netdev() {
    local cfg="led_$1"local name=$2local sysfs=$3local dev=$4
    uci -q get system.$cfg && return 0
    uci batch <<EOF
set system.$cfg='led'set system.$cfg.name='$name'set system.$cfg.sysfs='$sysfs'set system.$cfg.trigger='netdev'set system.$cfg.dev='$dev'set system.$cfg.mode='link tx rx'EOF
    UCIDEF_LEDS_CHANGED=1}

ucidef_set_led_usbdev() {
    local cfg="led_$1"local name=$2local sysfs=$3local dev=$4
    uci -q get system.$cfg && return 0
    uci batch <<EOF
set system.$cfg='led'set system.$cfg.name='$name'set system.$cfg.sysfs='$sysfs'set system.$cfg.trigger='usbdev'set system.$cfg.dev='$dev'set system.$cfg.interval='50'EOF
    UCIDEF_LEDS_CHANGED=1}

ucidef_set_led_wlan() {
    local cfg="led_$1"local name=$2local sysfs=$3local trigger=$4
    uci -q get system.$cfg && return 0
    uci batch <<EOF
set system.$cfg='led'set system.$cfg.name='$name'set system.$cfg.sysfs='$sysfs'set system.$cfg.trigger='$trigger'EOF
    UCIDEF_LEDS_CHANGED=1}

ucidef_set_led_switch() {
    local cfg="led_$1"local name=$2local sysfs=$3local trigger=$4local port_mask=$5
    uci -q get system.$cfg && return 0
    uci batch <<EOF
set system.$cfg='led'set system.$cfg.name='$name'set system.$cfg.sysfs='$sysfs'set system.$cfg.trigger='$trigger'set system.$cfg.port_mask='$port_mask'EOF
    UCIDEF_LEDS_CHANGED=1}

ucidef_set_led_default() {
    local cfg="led_$1"local name=$2local sysfs=$3local default=$4
    uci -q get system.$cfg && return 0
    uci batch <<EOF
set system.$cfg='led'set system.$cfg.name='$name'set system.$cfg.sysfs='$sysfs'set system.$cfg.default='$default'EOF
    UCIDEF_LEDS_CHANGED=1}

ucidef_set_led_rssi() {
    local cfg="led_$1"local name=$2local sysfs=$3local iface=$4local minq=$5local maxq=$6local offset=$7local factor=$8
    uci -q get system.$cfg && return 0
    uci batch <<EOF
set system.$cfg='led'set system.$cfg.name='$name'set system.$cfg.sysfs='$sysfs'set system.$cfg.trigger='rssi'set system.$cfg.iface='rssid_$iface'set system.$cfg.minq='$minq'set system.$cfg.maxq='$maxq'set system.$cfg.offset='$offset'set system.$cfg.factor='$factor'EOF
    UCIDEF_LEDS_CHANGED=1}

ucidef_set_rssimon() {
    local dev="$1"local refresh="$2"local threshold="$3"
    local cfg="rssid_$dev"
    uci -q get system.$cfg && return 0
    uci batch <<EOF
set system.$cfg='rssid'set system.$cfg.dev='$dev'set system.$cfg.refresh='$refresh'set system.$cfg.threshold='$threshold'EOF
    UCIDEF_LEDS_CHANGED=1}

ucidef_commit_leds()
{
    [ "$UCIDEF_LEDS_CHANGED" == "1" ] &&uci commit system
}

ucidef_set_interface_loopback() {
    uci batch <<EOF
set network.loopback='interface'set network.loopback.ifname='lo'set network.loopback.proto='static'set network.loopback.ipaddr='127.0.0.1'set network.loopback.netmask='255.0.0.0'set network.globals='globals'set network.globals.ula_prefix='auto'EOF
}

ucidef_set_interface_raw() {
    local cfg=$1local ifname=$2
    uci batch <<EOF
set network.$cfg='interface'set network.$cfg.ifname='$ifname'set network.$cfg.proto='none'EOF
}

ucidef_set_interface_lan() {
    local ifname=$1
    uci batch <<EOF
set network.lan='interface'set network.lan.ifname='$ifname'set network.lan.force_link=1set network.lan.type='bridge'set network.lan.proto='static'set network.lan.ipaddr='192.168.1.1'set network.lan.netmask='255.255.255.0'set network.lan.ip6assign='60'EOF
}

ucidef_set_interface_wan() {
    local ifname=$1
    uci batch <<EOF
set network.wan='interface'set network.wan.ifname='$ifname'set network.wan.proto='dhcp'set network.wan6='interface'set network.wan6.ifname='@wan'set network.wan6.proto='dhcpv6'EOF
}

ucidef_set_interfaces_lan_wan() {
    local lan_ifname=$1local wan_ifname=$2
    ucidef_set_interface_lan "$lan_ifname"ucidef_set_interface_wan "$wan_ifname"}

ucidef_set_interface_macaddr() {
    local ifname=$1local mac=$2
    uci batch <<EOF
set network.$ifname.macaddr='$mac'EOF
}

ucidef_add_switch() {
    local name=$1local reset=$2local enable=$3uci batch <<EOF
add network switch
set network.@switch[-1].name='$name'set network.@switch[-1].reset='$reset'set network.@switch[-1].enable_vlan='$enable'EOF
}

ucidef_add_switch_vlan() {
    local device=$1local vlan=$2local ports=$3uci batch <<EOF
add network switch_vlan
set network.@switch_vlan[-1].device='$device'set network.@switch_vlan[-1].vlan='$vlan'set network.@switch_vlan[-1].ports='$ports'EOF
}

ucidef_add_switch_port() {
    local device=$1local port=$2uci batch <<EOF
add network switch_port
set network.@switch_port[-1].device='$device'set network.@switch_port[-1].port='$port'EOF
}

看到了吧,改这里的内容就会改到openwrt固件的默认配置了。

调用这些库的函数在这里:

tf@ubuntu:~/projects/openwrt1407/target/linux/ar71xx/base-files/etc/uci-defaults$ ls01_leds                       03_network-vlan-migration  09_fix-trx-header
02_network                    04_led_migration
03_network-switchX-migration  09_fix-seama-header

对于网络,则是02_network文件,看看该文件的开头内容为:

#!/bin/sh#
# Copyright (C) 2011OpenWrt.org
#

[ -e /etc/config/network ] && exit 0

touch /etc/config/network

. /lib/functions/uci-defaults.sh. /lib/ar71xx.sh
ucidef_set_interface_loopback

board=$(ar71xx_board_name)

...

这样就清晰了。

免责声明:文章转载自《openwrt的默认/etc/config/network文件是如何生成的?》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇shell脚本基本语法八叉树(Octree)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

OpenWrt包管理软件opkg的使用(极路由)

说明: 1、OpenWrt本身系统没什么问题,关键点是一些路由器尝试的限制,比如一些厂商设置成内存分区为只读,那么这个安装软件就变得没什么意义了。 2、opkg的操作有点反人类,正常步骤是查询,安装;而opkg在一些厂商的限制下需要update,然后download,最后install;且有时会安装在tmp区,重启会没有。 常用安装步骤: 如果想要安装一个...

NGINX+keepalived

参考博客: http://pmghong.blog.51cto.com/3221425/1264947/ 第一步:配置NGINX负载均衡   http://www.cnblogs.com/carbon3/p/5853590.html 第二步:配置 keepalived 的高可用 二、安装配置keepalived(node2配置参考node1,大体上一样)...

keepalive 双主配置

两端都为双主,也同时为对方的备份,主服务器宕机,从服务器自动切换上去,保证主服务器能使用,也不影响从服务器使用 一、修改192.168.1.4上keepalived配置文件 vim /etc/keepalived/keepalived.conf 1、复制实例1 修改前: vrrp_instance VI_1 { state MASTER i...

mysql主从之keepalive+MySQL高可用

一 keepalive介绍 1.1 keepalived 是什么 keepalived 是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。 1.2 keepalived 工作原理 keepalived 是以VRRP 协议为实现基础的,VRRP 全称VirtualRouter Redundancy Protocol,即虚拟路由冗余协议。虚拟路由冗...

Pandorabox(Openwrt) 双宽带(WAN) 叠加网络实战

准备 一台已经刷好Pandorabox(Openwrt)的路由器、两条宽带 实战环境 固件:PandoraBox R8.1.12 By Lean 硬件:K2P A1版 过程 配置VLAN 为了将一个LAN口映射为WAN口,选择网络-交换机,添加一个VLAN3,比如我希望将LAN1口配置为WAN口,在VLAN1中把LAN1配置为关,VLAN3中除LAN1...

openwrt-智能路由器hack技术(1)---"DNS劫持"

openwrt-智能路由器hack技术(1)---"DNS劫持" 1导读 PS:之前写的一个文章,现在发现结构内容排版不是太好,导致阅读体验太差,影响传播和SEO,所以现在整理拆分一下,从小处写起, 本系列介绍了两个关于智能路由器的hack技术,供大家赏玩一下。 本文提到的两个基于网络的hack技术: DNS劫持 数据抓包 基本本质上就是路由器设备的...