经常编译lean固件的朋友肯定发现,lean修改版本号都是在default-settings里面修改的,这个文件夹在/lede/package/lean
里。这个应用主要对路由器固件进行默认设置的,运行原理是将files里的zzz-default-settings文件放入/etc/uci-defaults
里面进行执行。uci-defaults这个文件夹比较特殊,在该目录中的所有脚本都自动执行,如果这些脚本以exit 0 退出,它们将在执行完毕后被删除,也就是说这些脚本只运行一次就没了。详细介绍见官方文档。
我们编译固件时可以根据default-settings仿写一个应用ipk,进行初始化操作,写入自己的配置文件,打造出自己专用的路由器固件。可以直接在default-settings里面改写,但是lean更新比较频繁,每次这个文件改变后,git pull
就会提示文件被修改,需要删除才可以继续更新。所以有必要重新改写个自己的默认配置应用,将拨号账号、网络配置、各种应用软件的配置文件等等自动配置好,路由器刷入固件后就可以直接工作,免去一番设置工作。既可以放入lean的源码里,编译官方固件也可以用,比较灵活。最后编译出个人专用的路由器固件。这次仿写主要针对官方openwrt源码。
把default-settings文件夹复制出来并改名my-settings
,把files文件夹里的zzz-default-settings,改名为my-default-settings
。哪个中文汉化包po
文件夹可以删除,没什么用。这些的文件最好在linux里面编辑,windows平台也可以用notepad 2、notepad– 等软件编辑。Windows自行创建文件要注意用unix文件格式及utf8编码。
本篇先改写Makefile文件
1、第一段定义本应用软件ipk名称、版本等。PKG_NAME:=default-settings 改为 PKG_NAME:=my-settings
,下面的任意。
2、定义包名改为 define Package/my-settings
。然后修改DEPENDS依赖这块,可以根据你的需要将所需的一些luci应用都写入里面,如你的固件必须含有科学上网,可以后面在写入 +luci-app-ssr-plus
。+
表示选中my-settings,也就要选中luci-app-ssr-plus。如果没有+号,表示除非你选中luci-app-ssr-plus,才可以选择 my-settings 。
注意Openwrt官方新版的Luci中文包是LUCI_LANG_zh_Hans
,加入这个就会luci自动选上中文语言。@LUCI_LANG_zh_Hans
表示在make menuconfig
配置界面中必须存在LUCI_LANG_zh_Hans中文选项才可以选中本应用my-settings,否则就看不到my-settings这个选项。+@LUCI_LANG_zh_Hans
就是说必须存在中文,且选上my-settings也要选上中文,也就是说luci的界面语言必须是中文且无法修改。修改后的代码就是:
define Package/my-settings SECTION:=luci CATEGORY:=LuCI TITLE:=LuCI support for My X86 Default Settings PKGARCH:=all DEPENDS:=+luci-base +luci +@LUCI_LANG_zh_Hans +luci-app-ssr-plus +luci-compat endef
3、define Package/default-settings/description 改为define Package/my-settings/description
。
4、定义包的位置这项define Package/default-settings/install,改为 define Package/my-settings/install
。这块主要就是把脚本文件写入到uci-defaults文件夹里。脚本文件my-default-setting
对于一些简单修改可以用uci
等命令在脚本里执行,对于配置内容很多的文件用命令改写设置很麻烦。如dhcp配置文件,我自定义了很多设备名称及ip地址,一条条用命令加入太麻烦,就可以直接将配置好的能正常运行的dhcp配置文件拷贝进固件里,替换Dnsmasq源码编译生成的默认配置文件。 我完成的是这样 :
define Package/my-settings/install $(INSTALL_DIR) $(1)/etc/uci-defaults $(INSTALL_BIN) ./files/my-default-settings $(1)/etc/uci-defaults/99-my-settings $(INSTALL_DIR) $(1)/usr/share/linshi $(INSTALL_CONF) ./files/dhcp $(1)/usr/share/linshi/ $(INSTALL_CONF) ./files/shadowsocksr $(1)/usr/share/linshi/ $(INSTALL_CONF) ./files/nft-qos $(1)/usr/share/linshi/ endef
这里的意思是说,把files文件夹里的my-default-settings 文件写入到/etc/uci-defaults文件夹里,并重命名为99-my-settings,99为优先级别。在/usr/share/
里建立linshi文件夹,将files文件夹的dhcp、shadowsocksr、nft-qos配置文件都放入到/usr/share/linshi/里面。这些配置文件是以前在openwrt固件/etc/config/里面配置好的,可以正常运行的配置文件。之所以这些配置文件不直接放入到/etc/config文件夹里,比如dhcp配置文件,是因为Dnsmasq也在/etc/config/里生成了dhcp文件,本Makefile文件也要生成dhcp文件,会起冲突导致编译失败,我们先把配置文件临时放到/usr/share/linshi/里面,再由my-default-settings脚本文件执行拷贝动作到/etc/config/
。
$(1)
变量表示运行的路由器上的根目录。$(INSTALL_DIR)
表示创建文件夹。
然后用Winscp等软件把你路由器里面现有的/etc/config/文件夹里的dhcp、shadowsocksr等配置文件放入到my-settings文件夹里的files文件夹里。
5、最后使用eval函数实现my-settings的各种定义。改为
$(eval $(call BuildPackage,my-settings))
6、到这里,Makefile文件就设置好了,完整的Makefile文件:
# # Copyright (C) 2016-2017 GitHub # # This is free software, licensed under the GNU General Public License v3. # See /LICENSE for more information. include $(TOPDIR)/rules.mk PKG_NAME:=my-settings PKG_VERSION:=2 PKG_RELEASE:=35 PKG_LICENSE:=GPLv3 PKG_LICENSE_FILES:=LICENSE include $(INCLUDE_DIR)/package.mk define Package/my-settings SECTION:=luci CATEGORY:=LuCI TITLE:=LuCI support for My X86 Default Settings PKGARCH:=all DEPENDS:=+luci-base +luci +@LUCI_LANG_zh_Hans +luci-app-ssr-plus +luci-compat endef define Package/my-settings/description Language Support Packages. endef define Build/Compile endef define Package/my-settings/install $(INSTALL_DIR) $(1)/etc/uci-defaults $(INSTALL_BIN) ./files/my-default-settings $(1)/etc/uci-defaults/99-my-settings $(INSTALL_DIR) $(1)/usr/share/linshi $(INSTALL_CONF) ./files/dhcp $(1)/usr/share/linshi/ $(INSTALL_CONF) ./files/shadowsocksr $(1)/usr/share/linshi/ $(INSTALL_CONF) ./files/nft-qos $(1)/usr/share/linshi/ endef $(eval $(call BuildPackage,my-settings))
my-default-settings 脚本文件见下一篇。
技术不断升级,请注意文章时效性。
本站文章,欢迎转发。转载请注明出处:https://www.bandwh.com/net/560.html
评论列表(2条)
感谢分享,今晚就编译一个试试。
另外,现在新版用的 fw4 防火墙,没有自定义规则了,放进 /etc/firewall.user 也不自动运行,大佬有这方面需求嘛?
@言西:脚本篇里有介绍怎么处理,你看看。