构建环境隔离和文件系统困难



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

我目前为此设置的是一个由各种工具组成的弗兰肯斯坦怪物,但主要是Vagrant和libguestfs(基于在Fedora中运行的源代码构建,因为没有一个发行版实际使用virt-diff)。以下是我目前遵循的步骤:

  1. 使用Vagrant盒子或通过从现场CD创建一个来启动基本操作系统
  2. 导出.vmdk并将其称为base-image
  3. 旋转上一个图像的精确复制品,然后进城:使用包管理器,或者其他方式,下载、编译和安装我需要的所有部分。再次导出.vmdk并将其称为non-base-image
  4. 将这两个基本映像都提供给具有libguestfs的Fedora来宾操作系统
  5. 使用virt-diff来区分这两个图像,并将数据转储到名为diff的文件中
  6. 运行几个ruby脚本将diff转换为另一种格式,其中包含我需要的信息,而没有我不喜欢的/var
  7. 运行另一个脚本,用一堆copy-out命令为guestfish生成一个命令脚本
  8. 运行guestfish脚本
  9. 运行另一个脚本从diff重新生成符号链接,因为guestfish无法执行此操作
  10. 将生成的文件夹结构转换为.deb或.rpm文件并发送

我想知道是否有更好的方法。你可能认为会有,但我还没想清楚。

我肯定会考虑以下内容:

A)

  • 百胜列表(选择您的包/依赖项)
  • 使用上一个列表中的yumdownloader(或者使用您已经下载的pkg)
  • createrepo
  • 在介质上附带安装脚本,该脚本将cd repo添加到replist等

或B)

如上所述的前两个步骤,然后将rpms打包到一个归档文件中。构建一个包含以上所有内容的包,并作为后期脚本(可能在清理阶段)开始实际安装rpms(按照rpm-Uvh/tmp/repo/*)。如果可以避免对rpm数据库的锁定,那就不需要了。

我认为您已经达到了复杂性的地步——实际上是一个弗兰肯斯坦怪物——在那里您应该停止担心制作具有依赖性的适当包。我们在我之前的工作中做到了这一点——我们有一套预制的rpm包——而且非常简单明了,包括:

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

我们从未做过你刚才描述的任何事情。对于客户来说,安装一套软件包都非常容易!

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

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

制作一个具有所有依赖项的包主要有三个步骤(假设它是a、B和C)。

A。收集所需的文件
有很多方法可以收集主要软件及其依赖项的文件。为了获得所有依赖项并实现无错误运行,您需要使用基本操作系统(即实时系统)
1。使用AppDirAssistant
www.portallinuxapps.org使用此应用程序创建可移植应用程序目录。他们扫描并监视应用程序访问的文件,以找到所需的文件
2.使用chroot&overlayfs
在这个方法中,你不需要启动到livecd,而是chroot到它。
a.安装.iso@/cdrom和
b。在另一个地方安装文件系统(filesystem.swashfs),比如@/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
chroot /tmp/union/root

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

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

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

问题主要是确保您的客户安装了运行包所需的所有标准上游发行版包吗?

如果是这样的话,那么我相信最简单的解决方案是利用百胜和apt基础设施来跟踪并安装必要的必备包。

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

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

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

公寓如何在Debian Wiki 上设置Debian存储库

所以您的客户永远不会安装任何其他软件,这些软件可能会指定您正在浏览的依赖项的不同版本,对吧?

如果你想走那么远,为什么不创建自己的发行版呢?

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

最新更新