【问题标题】:Run time installation directory of debian package contentsdebian包内容的运行时安装目录
【发布时间】:2012-01-19 05:50:38
【问题描述】:

我有一个我构建的 debian 包,其中包含文件的 tar 球、控制文件和 postinst 文件。它使用 dpkg-deb 构建,并使用 dpkg 正确安装。

我想做的修改是让文件的安装目录在运行时根据将在 deb 文件上运行 dpkg -i 时设置的环境变量来确定。我在 postinst 脚本中回显环境变量,我可以看到它的设置正确。

我的问题:

1) 是否可以在运行时动态确定安装目录?

2) 如果可能的话,我会怎么做?我已阅读有关规则文件和 mypackage.install 文件的信息,但我不知道其中任何一个是否允许我完成此操作。

我可以通过将文件复制到 posinst 脚本中的目标位置来破解它,但如果可能的话,我更愿意以正确的方式进行操作。

提前致谢!

【问题讨论】:

  • 您可以将一个选项传递给dpkg 以使用与/usr 不同的根进行安装。 deb 软件包在这个意义上没有“安装目录” - 如果您添加了您现在拥有的以及您希望它是什么的示例,这将有所帮助。从理论上讲,您可以移动 postinst 脚本中的内容,但我强烈反对您。
  • 好主意。我尝试使用 --instdir= 并且它复制了文件但 postinst 不会运行,因为 --instdir 做了一个 chroot 所以你必须在那里也有 dpkg 管理目录。我还尝试结合使用 --root 和 --admindir 来查看是否可以拆分这两个目录。 rpm 有一个重定位标志,因此您可以移动包的位置。我必须有一个动态目录,因为这个包必须位于两个不同嵌入式 Linux 发行版的不同位置。例如,假设 tarball 中的单个文件位于不同机器上的不同位置。
  • 我会简单地创建两个不同的deb 包,除非文件是一个conffile。例子仍然会有所帮助。典型的包管理文件类似于 /usr/lib/yourpackage.so 和典型的 conffile,例如/etc/yourpackage.cfg.
  • 也许还可以看看“替代”工具,尽管它主要在相反的方向上有用(两个不相关的包想要在一个约定的标准位置控制符号链接的目的地)。
  • 我可以创建两个包没问题。问题是包中的代码都是通用的,需要安装在 6 个不同的嵌入式平台上,这些平台的安装都在不同的位置。更具体地说,某些平台上不存在某些目录结构。这意味着管理 6 个不同的包而不是 1 个。目前仍在研究。感谢您的建议。

标签: linux ubuntu debian dpkg


【解决方案1】:

这就是我在过去几周发现的有关此问题的信息。

使用预打包的二进制文件,您无法构建目标目录在运行时动态确定的 debian 包。我相信如果安装从源代码构建的软件包,您可以使用 configure 设置安装目录,这可能是可能的。但在这种情况下,因为这些是嵌入式 Ubuntu 机器,他们没有制造,所以我没有追求这样的选择。我确实制定了一种非传统的安装方法(hack),它确实有效。由于 debian 包只包含一个相对于 / 的 tar 球,因此只需相对于 /tmp 下的目录构建你的包。在 postinst 脚本中,您可以确定将文件从存档复制到永久位置的位置。

我预计在重新启动并自动删除 /tmp 下的子目录后,dpkg 可能不知道该文件包存在。这不是问题。当我运行“dpkg -l myapp”时,它显示为仍然安装。使用 dpkg/apt-get 更新软件包也很顺利。

我确实发现,如果您尝试使用“dpkg -r myapp”删除软件包,dpkg 会尝试删除不好的 /tmp。但是 /tmp 不容易删除,因此它从未成功。另外,在我们的情况下,我们从不删除软件包,而是简单地升级它们。

我最终不得不放弃通用包,因为源代码存在差异,导致必须在每个平台上重新编译,但我本来会这样,它确实有效。

我尝试使用 --instdir 更改软件包的安装目录,它确实重新定位了文件,但 dpkg 失败,因为相对于新的 instdir 找不到 dpkg 文件。使用 --instdir 有点像 chroot。我还尝试了 --admindir 和 --root 的各种组合,以查看是否可以相对于 / 使用 dpkg 系统,但安装重定位文件但它们不起作用。我猜 rpm 有一个有效的重定位选项,但不适用于 Ubuntu。

【讨论】:

    【解决方案2】:

    你也可以编写一个脚本,在不同的环境下运行 dpkg-deb 6 次,生成 6 个不同的包。当您进行修改时,您只需运行您的脚本,所有 6 个包都会生成,您可以将它们安装在您的机器上,避免 postinst 黑客攻击!

    【讨论】:

      【解决方案3】:

      为什么不安装到标准位置,而只需使用 postinst 脚本创建指向所需位置的符号链接?这更干净,不应该破坏 dpk -I 中的任何内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多