本站内容版权属于本人。转载须告知本人,写明出处,并在文首提供指向本站对应文章的链接。
本文链接:如何在OpenWrt上开发(续)
本文链接:如何在OpenWrt上开发(续)
在上篇文章里,已经写了如何将可执行文件加入OpenWrt包中。这次再写一些更深入,但是常用的话题。
开机启动
在Linux中,把启动脚本放在/etc/init.d
中可以自启动,OpenWrt也不例外。问题是如何把启动脚本打在包中。
在mypackage
目录下运行:
1 2 3 4 |
mkdir -p files/etc/init.d cd files/etc/init.d touch mypackage chmod +x mypackage |
修改刚创建的mypackage
文件,这里用了procd
工具,最简单的写法只需要定义start_service
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/bin/sh /etc/rc.common # 参考 https://openwrt.org/docs/guide-developer/procd-init-scripts START=95 USE_PROCD=1 PROG=/usr/bin/mypackage start_service() { procd_open_instance mypackage procd_set_param command $PROG # 把输出写到系统日志中 # 用logread可以查看系统日志 procd_set_param stderr 1 procd_set_param stdout 1 procd_close_instance } |
在mypackage
目录下的Makefile
中,修改安装的部分:
1 2 3 4 5 6 7 |
define Package/mypackage/install $(INSTALL_DIR) $(1)/etc/init.d $(INSTALL_BIN) ./files/etc/init.d/mypackage $(1)/etc/init.d/ $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_BUILD_DIR)/mypackage $(1)/usr/bin/ endef |
这样,在安装包的同时,也会将启动脚本也安装上。并且opkg会在安装后自动运行mypackage
命令。同样,也可以用以下命令来手动运行:
1 |
/etc/init.d/mypackage start |
配置文件
可以使用和启动脚本类似的方式来安装配置文件,只不过换成了$(INSTALL_CONF)
:
1 2 3 4 5 6 7 8 9 10 |
define Package/mypackage/install $(INSTALL_DIR) $(1)/etc/config $(INSTALL_CONF) ./files/etc/config/mypackage $(1)/etc/config/ $(INSTALL_DIR) $(1)/etc/init.d $(INSTALL_BIN) ./files/etc/init.d/mypackage $(1)/etc/init.d/ $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_BUILD_DIR)/mypackage $(1)/usr/bin/ endef |
但这样有个问题,每次更新包的时候,配置文件都会被覆盖,这是我们不想看到的。为了不覆盖,还需要在Makefile
里面加入以下内容:
1 2 3 4 |
# 里面不要缩进,每行一个文件 define Package/mypackage/conffiles /etc/config/mypackage endef |
这样,在安装时候就不会覆盖,而是将更新的配置改名为mypackage.opkg
,旧配置不变。
如果不想有这样的行为,也可以用preinst
和postinst
脚本来完成这个功能:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# 注意这段内容里面整个是个脚本,所以#!/bin/sh不能少 define Package/mypackage/preinst #!/bin/sh # 用IPKG_INSTROOT判断是在真实的机器上执行,还是在编译期间 if [ -z "$${IPKG_INSTROOT}" ] && [ -f "/etc/config/mypackage" ]; then echo 'Backup config file' cp /etc/config/mypackage/tmp/mypackage.bak fi exit 0 endef define Package/mypackage/postinst #!/bin/sh if [ -z "$${IPKG_INSTROOT}" ] && [ -f "/tmp/mypackage.bak" ]; then echo 'Restore config file' mv /tmp/mypackage.bak /etc/config/mypackage fi exit 0 endef |
总结
有了程序、配置和自启动脚本,一个完整的服务就有了,把它安装到OpenWrt里之后,就可以安心使用了。下篇文章我会介绍如何扩展界面(也就是Luci)。