8

好吧,所以在第 n 次尝试追踪各种软件的依赖关系并复制各种人为所有不同的 Linux 发行版所做的工作之后,我想知道是否有更好的方法来捆绑各种软件到一个 .rpm 或 .deb 文件中以便于分发。

我目前的设置是各种工具的科学怪人,但主要是 Vagrant 和 libguestfs(从在 Fedora 中运行的源代码构建,因为实际上没有一个发行版附带它virt-diff)。以下是我目前遵循的步骤:

  1. 使用 Vagrant box 或通过 live CD 创建一个基本操作系统。
  2. 导出.vmdk并调用它base-image
  3. 旋转上一个图像的精确副本并前往城镇:使用包管理器或其他方式来下载、编译和安装我需要的所有部分。再次导出.vmdk并调用它non-base-image
  4. 使两个基本镜像都可用于具有 libguestfs 的 Fedora 来宾操作系统。
  5. 用于virt-diff区分两个图像并将该数据转储到名为diff.
  6. 运行几个 ruby​​ 脚本以将其diff转换为另一种格式,其中包含我需要的信息,并且没有我不喜欢的/var.
  7. 运行另一个脚本以生成guestfish带有一堆命令的命令脚本copy-out
  8. 运行guestfish脚本。
  9. 运行另一个脚本来重新生成符号链接,diff因为guestfish不能这样做。
  10. 将生成的文件夹结构转换为 .deb 或 .rpm 文件并发布。

我想知道是否有更好的方法来做到这一点。你会认为会有,但我还没有弄清楚。

4

5 回答 5

3

我肯定会考虑以下方面的事情:

一种)

  • yum list(选择你的包/依赖项)
  • 在上一个列表中使用 yumdownloader(或使用您已经下载的 pkgs)
  • 创建仓库
  • 使用将 cd repo 添加到 repolist 等的安装脚本在媒体上发布。

或 B)

如上所述的前两个步骤,然后将 rpms 打包到存档中 构建一个包含上述所有内容的包,并作为后期脚本启动 rpms 的实际安装(沿着 rpm -Uvh /tmp/repo/* 的行) (也许在清理阶段)。不知道这是否可以避免 rpm 数据库上的锁定。

于 2014-01-16T10:31:50.260 回答
2

我认为你已经到了复杂的地步——实际上是一个科学怪人——你应该停止担心制作具有依赖关系的正确包。我们在我之前的工作中这样做了——我们有一组制造的 rpm 包——而且非常简单直接,包括:

  • 安装前/安装后脚本
  • 卸载脚本
  • 依赖关系

我们从来不需要做任何你刚才描述的事情。对于客户来说,甚至安装一组软件包也非常容易!

您可以按照参考手册了解如何构建 RPM 包以获取更多信息。

编辑:如果您需要一个安装包,然后创建这个主包,它将包含所有其他包(正确设置依赖项)并将它们安装在安装后脚本中(并在卸载脚本中卸载它们)。

于 2014-01-12T07:38:00.747 回答
1

问题主要在于确保您的客户已安装您的软件包运行所需的所有标准上游发行版软件包?

如果是这样的话,那么我相信最直接的解决方案是利用 yum 和 apt 基础设施来让这些工具跟踪并安装必要的先决条件包。

如果您提供具有完整的 pre-req 规范的本机 yum/apt 存储库(您显然已经完成了艰苦的工作)。然后标准的系统安装工具会负责其余的工作。有关为 yum/apt 创建个人存储库的更多信息,请参阅下面的链接。

对于离线客户,您可以为您的软件提供媒体,以及上游发行版的镜像镜像子集,以及将它们添加到yum config / apt config的说明。

Yum 在 Fedora 部署指南中创建 Yum 存储库

Apt 如何在 Debian Wiki 上设置 Debian 存储库

于 2014-01-13T22:06:51.890 回答
1

制作一个包含所有依赖项的包主要有 3 个步骤(让它成为 A、B 和 C)。

A. 收集所需文件。
有很多方法可以收集主要软件及其依赖项的文件。为了获得所有依赖和无错误运行,您需要使用基本操作系统(即实时系统)
1. 使用 AppDirAssistant
这个应用程序由 www.portablelinuxapps.org 用于创建可移植应用程序目录。他们扫描并观察应用程序访问的文件以找到所需的文件。
2. 使用 chroot & overlayfs
在这个方法中你不需要启动到 live cd 而是 chroot 到它。
一种。挂载 .iso @ /cdrom 和
b。在另一个地方挂载文件系统(filesystem.squashfs),比如@ /tmp/union/root
c。绑定 mount /proc @ /tmp/union/root/proc
d. 覆盖它
mount -t overlayfs overlayfs /tmp/union/root -o lowerdir=/tmp/union/root,upperdir=/tmp/union/rw
e。根
chroot /tmp/union/root

现在您可以使用 apt-get 或其他方法(仅从 chrooted 终端)安装软件包。所有更改的文件都存储在 @ /tmp/union/rw。从那里获取文件。
3. 使用手动收集的包
使用包管理器收集依赖。例如 apt-get install package --print-uris将打印 dep 包的下载 uris。使用此 uri 下载包并解压缩所有 ( dpkg -x 1.deb ./extracted)。

B.清理垃圾文件
收集文件后删除不需要的文件

C. 打包文件
1. 使用 appImageAssistance
如果您手动收集文件,则需要将 appname.desktop 文件从 ./usr/share/applications 复制到目录树的根目录。还从另一个应用程序复制名为AppRun的文件或从 AppDirAssistance 中提取它。
2. 使用收集的文件制作 .deb 或 .rpm。

于 2014-01-18T15:24:43.000 回答
0

因此,您的客户永远不会安装任何其他软件,这些软件可能会指定您正在遍历的那些依赖项的不同版本,对吧?

如果您要走那么远,为什么不创建自己的发行版?

或者你可以给他们一堆包和一个脚本rpm -i dep1 dep2 yourpackage

于 2014-01-13T19:28:53.993 回答