【问题标题】:Buildroot generic package does not install in init.d directoryBuildroot 通用包未安装在 init.d 目录中
【发布时间】:2020-02-28 10:00:17
【问题描述】:

我正在尝试为我正在开发的嵌入式系统构建嵌入式 Linux 映像。
它使用 Buildroot,我们正在尝试在其中安装通用包。
直到我在目标图像的 /etc/init.d/ 目录中安装脚本为止,这都非常有效。

为了在映像中构建我的软件,我创建了以下由 Buildroot 拾取的 makefile。
它旨在通过一些附加脚本将 JAR 文件复制到文件系统。
我发现以字母 S 开头的脚本会自动运行。
见:https://buildroot.org/downloads/manual/manual.html#_init_system

define MY_GATEWAY_INSTALL_TARGET_CMDS

  $(INSTALL) -d $(TARGET_DIR)/$(DST_FOLDER); \
  $(INSTALL) -D -m 0644 $(@D)/*.jar $(TARGET_DIR)/$(DST_FOLDER); \
  \
  $(INSTALL) -D -m 0700 /work/package/mycompany/my-gateway/artifacts/start_heimdall $(TARGET_DIR)/$(DST_FOLDER); \
  ln -snrf $(TARGET_DIR)/$(DST_FOLDER)/start_heimdall $(TARGET_DIR)/usr/bin/start_heimdall; \
  \
  $(INSTALL) -D -m 0755 /work/package/mycompany/my-gateway/artifacts/S99gateway $(TARGET_DIR)/$(DST_FOLDER); \
  $(INSTALL) -D -m 0755 /work/package/mycompany/my-gateway/artifacts/S99gateway $(TARGET_DIR)/etc/init.d/S99gateway; \
  \
  if [[ "$(BR2_HSDP_GATEWAY_INCLUDE_VERSION_FILE)" == "y" ]]; then \
      echo $(HEIMDALL_VERSION) > $(TARGET_DIR)/my_gw_version; \
  fi

endef

构建映像后,我发现 JAR 文件和 start_heimdall 脚本已正确放置在预期的目录中。
S99gateway 脚本不是这种情况,它不会出现在 /etc/init.d/ 目录中。
我的申请因此没有开始。

构建镜像的目标目录如下:

ls -al $(TARGET)/usr/heimdall
total 19476
drwxr-xr-x 2 rick rick     4096 feb 28 08:43 .
drwxr-xr-x 8 rick rick     4096 feb 28 08:43 ..
-rw-r--r-- 1 rick rick 19924893 feb 28 08:40 heimdall-squidlink-1.0.0-1582809178-release.jar
-rwxr-xr-x 1 rick rick      362 feb 28 08:40 S99gateway
-rwx------ 1 rick rick      230 feb 28 08:40 start_heimdall

ls -al /etc/init.d
total 68
drwxr-xr-x  2 rick rick 4096 feb 28 08:43 .
drwxr-xr-x 14 rick rick 4096 feb 28 08:43 ..
-rwxr-xr-x  1 rick rick  423 dec  4 14:50 rcK
-rwxr-xr-x  1 rick rick  408 dec  4 14:50 rcS
-rwxr-x---  1 rick rick 1295 aug 13  2014 S01logging
-rwxr-xr-x  1 rick rick  241 feb 28 08:19 S10mdev
-rwxr-x---  1 rick rick 1708 nov  4  2016 S10modules
-rwxr-x---  1 rick rick  396 mei 30  2016 S11led
-rwxr-x---  1 rick rick  968 mrt 17  2015 S12automount
-rwxr-x---  1 rick rick  397 apr 27  2015 S15hostname
-rwxr-xr-x  1 rick rick 1365 dec  4 14:50 S20urandom
-rwxr-x---  1 rick rick   48 apr 22  2015 S40network
-rwxr-xr-x  1 rick rick  936 feb 28 08:40 S49ntp
-rwxr-xr-x  1 rick rick 4066 feb 28 08:31 S50dropbear
-rwxr-xr-x  1 rick rick  435 feb 28 08:41 S50stunnel
-rwxr-xr-x  1 rick rick  462 feb 28 08:31 S80dnsmasq
-rwxr-xr-x  1 rick rick  362 feb 28 08:40 S99gateway

最后一行显示我的脚本已成功复制到所需目录。
当我将图像刷入我的嵌入式设备并通过 SSH 连接到其中时,我看到以下内容:

ls -al /usr/heimdall
total 19468
drwxr-xr-x    2 root     root           408 Feb 28  2020 .
drwxr-xr-x    8 root     root           616 Feb 28  2020 ..
-rwxr-xr-x    1 root     root           362 Feb 28  2020 S99gateway
-rw-r--r--    1 root     root      19924893 Feb 28  2020 heimdall-squidlink-1.0.0-1582809178-release.jar
-rwx------    1 root     root           230 Feb 28  2020 start_heimdall

ls -al /etc/init.d
total 56
drwxr-xr-x    2 root     root          1128 Jan 17 22:12 .
drwx--x--x   14 root     root          3088 Jan 17 22:12 ..
-rwxr-x---    1 root     root          1295 Aug 13  2014 S01logging
-rwxr-xr-x    1 root     root           241 Feb  7  2020 S10mdev
-rwxr-x---    1 root     root          1708 Nov  4  2016 S10modules
-rwxr-x---    1 root     root           396 May 30  2016 S11led
-rwxr-x---    1 root     root           968 Mar 17  2015 S12automount
-rwxr-x---    1 root     root           397 Apr 27  2015 S15hostname
-rwxrwxr-x    1 root     root          1365 Dec  4  2019 S20urandom
-rwxr-x---    1 root     root            48 Apr 22  2015 S40network
-rwxr-xr-x    1 root     root           936 Jan 17 22:12 S49ntp
-rwxr-xr-x    1 root     root          4066 Feb  7  2020 S50dropbear
-rwxr-xr-x    1 root     root           435 Feb  7  2020 S50stunnel
-rwxr-xr-x    1 root     root           462 Feb  7  2020 S80dnsmasq
-rwxrwxr-x    1 root     root           423 Dec  4  2019 rcK
-rwxrwxr-x    1 root     root           408 Dec  4  2019 rcS

在这种情况下,刷机后,S99 脚本就不再存在了。
/etc/init.d/ 目录是否以某种方式受到保护? 我试图了解为什么脚本不再存在。
脚本内部工作的正确性对安装过程很重要吗?

【问题讨论】:

标签: shell makefile embedded-linux buildroot


【解决方案1】:

/etc/init.d/ 没有什么特别之处。但是,我们无法真正理解这里发生了什么:你的 DST_FOLDER 变量是什么?

如果您的 S99 脚本位于 output/target 中,那么它绝对应该是最终文件系统映像的一部分。你确定你运行make 来重新生成文件系统映像,并正确刷新你的映像吗?

一般来说,你写的有很多问题:

  • 你不需要;或 \ 在每一行的末尾
  • 应该将初始化脚本安装在 _INIT_SYSV 变量中,而不是安装在 _INSTALL_TARGET_CMDS 变量中,即使这不是您的问题
  • BR2_HSDP_GATEWAY_INCLUDE_VERSION_FILE 的检查应该使用 make 条件而不是 shell 条件来完成
  • 不清楚为什么要多次安装每个文件。

【讨论】:

  • 感谢您的回复托马斯。 DST_FOLDER 在同一个文件中定义,其值为/usr/heimdall。我看到所有东西都正确安装在那里,甚至我放在那里的重复的“健全性检查”以查看文件是否已安装。我会牢记风格 cmets 和最佳实践,谢谢。
猜你喜欢
  • 2023-02-13
  • 2023-03-06
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 2017-09-01
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多