2

如何在OpenWrt上开发(续)

 3 years ago
source link: https://blog.chaofan.io/archives/how-to-develop-on-openwrt-2
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
主页 › 如何在OpenWrt上开发(续)

如何在OpenWrt上开发(续)

本站内容版权属于本人。转载须告知本人,写明出处,并在文首提供指向本站对应文章的链接。
本文链接:如何在OpenWrt上开发(续)

在上篇文章里,已经写了如何将可执行文件加入OpenWrt包中。这次再写一些更深入,但是常用的话题。

在Linux中,把启动脚本放在/etc/init.d中可以自启动,OpenWrt也不例外。问题是如何把启动脚本打在包中。

mypackage目录下运行:

mkdir -p files/etc/init.d
cd files/etc/init.d
touch mypackage
chmod +x mypackage

修改刚创建的mypackage文件,这里用了procd工具,最简单的写法只需要定义start_service

#!/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中,修改安装的部分:

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命令。同样,也可以用以下命令来手动运行:

/etc/init.d/mypackage start

可以使用和启动脚本类似的方式来安装配置文件,只不过换成了$(INSTALL_CONF)

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里面加入以下内容:

# 里面不要缩进,每行一个文件
define Package/mypackage/conffiles
/etc/config/mypackage
endef

这样,在安装时候就不会覆盖,而是将更新的配置改名为mypackage.opkg,旧配置不变。

如果不想有这样的行为,也可以用preinstpostinst脚本来完成这个功能:

# 注意这段内容里面整个是个脚本,所以#!/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
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
exit 0
endef

有了程序、配置和自启动脚本,一个完整的服务就有了,把它安装到OpenWrt里之后,就可以安心使用了。下篇文章我会介绍如何扩展界面(也就是Luci)。

浏览人数: 3

 Linux, OpenWRT

发表评论 取消回复

邮箱地址不会被公开。 必填项已用*标注

评论

姓名 *

电子邮件 *

站点

CAPTCHA

验证码 *

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK