openwrt_imagebuilder_修改缺省配置_system_network_firewall_root密码_制作免配置固件
转载注明来源: 本文链接 来自osnosn的博客,写于 2023-01-29.
参考和方法
- 【官方文档:使用Image Builder】
【官方文档:Using the Image Builder】 - 【imagebuilder快速编译OpenWrt固件使用教程+高级自定义+在线编译】
- 【自定义一个无需配置即可使用的 OpenWrt 固件】
ImageBuilder 自定义配置有两种方式,- 一种是通过 files 写死配置文件,如写一份网络的配置,放在 files/etc/config/network,并在构建时带上 FILES 参数,新系统启动时,就会使用自己写的配置,这样就达到了自定义的目的。
- 另一种是 uci-defaults 脚本,在系统第一次启动时(恢复出厂后也算第一次启动)运行其定义的 UCI 命令,以达到自定义的目的,这个方案相比自定义 files 有一个好处是,OpenWrt 有一些配置是在启动时动态生成的,而 files 会覆盖掉这些逻辑生成的配置,不太科学,而 uci-defaults 只会覆盖想要自定义的配置项,不会影响系统本身的运行逻辑,比较科学。
- 帖子中有uci命令的例子,可以用在脚本中。
- 【OpenWrt config_generate分析】
帖子中有分析,如果network或system文件存在,就不会自动生成,也不会被修改。
简单读一下这两个脚本/etc/rc.d/S10boot
,/bin/config_generate
就明白了。 - UCI 的参考
用imagebuilder定制固件
- 【armvirt:用ImageBuilder打包自定义img】
- 【Newifi Y1/D2:用imagebuilder打包一个自定义bin文件】
- 修改 system, network, 建议用 uci-defaults 脚本。
这两个配置文件,如果存在,并且大于0字节,刷机后第一次启动,就不会自动生成,不会被修改。
其他配置,直接编辑一个新版,覆盖掉原文件就行。 - 修改 wireless, 也建议用 uci-defaults 脚本。
- 这是基于 op-21.02 , op-22.03 版。旧版本的openwrt可能不合适。
样例: /etc/uci-defaults/80-custom-base (脚本无需设置执行权限)#!/bin/sh #修改root密码 passwd root << EOI pass1234 pass1234 EOI #修改源 sed -i 's#downloads.openwrt.org#mirrors.aliyun.com/openwrt#g' /etc/opkg/distfeeds.conf #sed -i 's#downloads.openwrt.org#mirrors.ustc.edu.cn/openwrt#g' /etc/opkg/distfeeds.conf #sed -i 's#downloads.openwrt.org#mirrors.tuna.tsinghua.edu.cn/openwrt#g' /etc/opkg/distfeeds.conf #修改名称,时区, 添加一个ntp服务地址 uci -q batch << EOI set system.@system[0].hostname='OpenWrt-MY' set system.@system[0].zonename='Asia/Shanghai' set system.@system[0].timezone='CST-8' set system.ntp.enable_server='1' add_list system.ntp.server='myntp.server.local' commit system EOI #修改lan IP uci -q batch << EOI set network.lan.ipaddr='192.168.7.1' #修改wan IP,静态地址 set network.wan.proto='static' set network.wan.ipaddr='10.10.10.99' set network.wan.netmask='255.255.255.0' set network.wan.gateway='10.10.10.1' add_list network.wan.dns='10.10.10.53' #如果wan有多个IP #add_list network.wan.ipaddr='10.10.10.88' #add_list network.wan.ipaddr='10.10.10.99' #修改wan pppoe #set network.wan.proto='pppoe' #set network.wan.username='xxx.xxx@xxx.xx' #set network.wan.password='YYYYYY' #set network.wan.ipv6='auto' #如果wan是pppoe,增加一个modem,用于访问光猫 #set network.modem=interface #set network.modem.proto='dhcp' #set network.modem.device='wan' #set network.modem.defaultroute='0' #set network.modem.peerdns='0' commit network EOI #添加ipv4静态路由 uci -q batch << EOI add network route set network.@route[-1].interface='wan' set network.@route[-1].target='10.222.0.0/16' set network.@route[-1].gateway='10.101.10.1' commit network EOI #ipv4&ipv6, 开放tcp端口, 允许外网访问路由器本身的 22 88 uci -q batch << EOI add firewall rule set firewall.@rule[-1].name='allow-ssh-pxy' set firewall.@rule[-1].src='wan' add_list firewall.@rule[-1].proto='tcp' set firewall.@rule[-1].dest_port='22 88' set firewall.@rule[-1].target='ACCEPT' #ipv4, tcp端口映射, 外网8443->192.168.7.1:443 add firewall redirect set firewall.@redirect[-1].name='web-https' set firewall.@redirect[-1].src='wan' set firewall.@redirect[-1].dest='lan' add_list firewall.@redirect[-1].proto='tcp' set firewall.@redirect[-1].src_dport='8443' set firewall.@redirect[-1].dest_ip='192.168.7.1' set firewall.@redirect[-1].dest_port='443' set firewall.@redirect[-1].target='DNAT' commit firewall EOI exit 0
uci batch
后面有空行不影响,会被忽略。#开始的注释行,也会被忽略。
也可以 add, set, 很多规则/条目之后,再 commit。
最后一句exit 0
,保证退出时返回0,哪怕前一语句有错误。让脚本执行一次后,被顺利删除。否则每次启动都被执行,直至执行无错误,才被删除。 - 这是基于 op-21.02 , op-22.03 版。旧版本的openwrt可能不合适。
样例: /etc/uci-defaults/81-custom-wifi (脚本无需设置执行权限)
最后一句#!/bin/sh set_2g() { local rad="$1" uci -q batch <<- EOF >/dev/null set wireless.radio${rad}.disabled=0 #激活wifi set wireless.radio${rad}.country='CN' set wireless.radio${rad}.channel='11' set wireless.@wifi-iface[${rad}].mode='ap' set wireless.@wifi-iface[${rad}].ssid='MY_WIFI_2G' set wireless.@wifi-iface[${rad}].key='2345678901' set wireless.@wifi-iface[${rad}].encryption='psk2+ccmp' #WPA2-PSK + AES commit wireless EOF } set_5g() { local rad="$1" uci -q batch <<- EOF >/dev/null set wireless.radio${rad}.disabled=0 #激活wifi set wireless.radio${rad}.country='CN' set wireless.radio${rad}.channel='36' set wireless.@wifi-iface[${rad}].mode='ap' set wireless.@wifi-iface[${rad}].ssid='MY_WIFI_5G' set wireless.@wifi-iface[${rad}].key='2345678901' set wireless.@wifi-iface[${rad}].encryption='psk2+ccmp' #添加一个企业认证的5g 的wifi set wireless.wifinet2=wifi-iface set wireless.wifinet2.device='radio${rad}' set wireless.wifinet2.mode='ap' set wireless.wifinet2.ssid='MY-EAP_5G' set wireless.wifinet2.auth_server='127.0.0.1' set wireless.wifinet2.auth_secret='key123' set wireless.wifinet2.encryption='wpa2+ccmp' commit wireless EOF } set_wifi() { local rad="$1" if [ "$(uci get wireless.radio${rad}.band)" = "2g" ]; then set_2g "$rad" elif [ "$(uci get wireless.radio${rad}.band)" = "5g" ]; then set_5g "$rad" fi } #配置文件不存在,就不执行,跳过。 [ -s /etc/config/wireless ] && { set_wifi 0 set_wifi 1 } exit 0
exit 0
,保证退出时返回0,前一语句的返回值可能是非0。让脚本执行一次后,被顺利删除。否则每次启动都被执行。 - 测试脚本时。
修改了 system 或 network,用reload_config
生效。
修改了 firewall,用/etc/init.d/firewall restart
生效。
作为uci-defaults脚本,无需 reload_config。
因为执行完所有的 uci-defaults 脚本后,会 reload_config 一次。
firewall 的启动在这些脚本的后面。
----end----
转载注明来源: 本文链接 https://www.cnblogs.com/osnosn/p/17072528.html
来自 osnosn的博客 https://www.cnblogs.com/osnosn/ .