OpenWRT rootfs 的生成过程[通俗易懂]

2022-09-27 13:05:56 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

在include目录中有一个 rootfs.mk ,里面主要是: 1.定义了 opkg = 2.定义了 prepare_rootfs

代码语言:javascript复制
opkg = 省略
TARGET_DIR_ORIG := $(TARGET_ROOTFS_DIR)/root.orig-$(BOARD)
define prepare_rootfs
  ...省略...

rootfs.mk 被以下两个文件使用

代码语言:javascript复制
root@localhost:/home2/lql/openwrt# grep "rootfs.mk" include/  package/ scripts/ feeds/  -rn
include/image.mk:22:include $(INCLUDE_DIR)/rootfs.mk
package/Makefile:11:include $(INCLUDE_DIR)/rootfs.mk

这里我们看 package/Makefile,里面有这么一段:

代码语言:javascript复制
$(curdir)/install: $(TMP_DIR)/.build $(curdir)/merge $(if $(CONFIG_TARGET_PER_DEVICE_ROOTFS),$(curdir)/merge-index)
	- find $(STAGING_DIR_ROOT) -type d | $(XARGS) chmod 0755
	rm -rf $(TARGET_DIR) $(TARGET_DIR_ORIG)
	mkdir -p $(TARGET_DIR)/tmp
	$(call opkg,$(TARGET_DIR)) install 
		$(call opkg_package_files,$(shell cat $(PACKAGE_INSTALL_FILES) 2>/dev/null))
	@for file in $(PACKAGE_INSTALL_FILES); do 
		[ -s $$file.flags ] || continue; 
		for flag in `cat $$file.flags`; do 
			$(call opkg,$(TARGET_DIR)) flag $$flag `cat $$file`; 
		done; 
	done || true

	$(CP) $(TARGET_DIR) $(TARGET_DIR_ORIG)

	$(call prepare_rootfs,$(TARGET_DIR),$(TOPDIR)/files)

这里面关键的地方是

代码语言:javascript复制
$(call opkg,$(TARGET_DIR)) install 
		$(call opkg_package_files,$(shell cat $(PACKAGE_INSTALL_FILES) 2>/dev/null))

回头看rootfs.mk 里对 opkg 的定义

代码语言:javascript复制
opkg = 
  IPKG_NO_SCRIPT=1 
  IPKG_INSTROOT=$(1) 
  TMPDIR=$(1)/tmp 
  $(STAGING_DIR_HOST)/bin/opkg 
	--offline-root $(1) 
	--force-postinstall 
	--add-dest root:/ 
	--add-arch all:100 
	--add-arch $(if $(ARCH_PACKAGES),$(ARCH_PACKAGES),$(BOARD)):200

最终展开就是

代码语言:javascript复制
//类似于
staging_dir/host/bin/opkg  --offline-root root-sunxi    install  *.ipk

这条命令作用就是将*.ipk 文件安装到 root-sunxi 目录下

最终root-sunxi 目录下会有这文件

TODO :可继续研究一下OpenWRT 的 Makefile

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/188505.html原文链接:https://javaforall.cn

0 人点赞