构建环境隔离和文件系统差异

时间:2014-01-10 05:14:11

标签: linux build debian rpm isolation

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

我目前为此做的设置是各种工具的frankenstein怪物,但主要是Vagrant和libguestfs,它们是在Fedora中运行的源码构建的,因为没有一个发行版实际上发布了virt-diff。以下是我目前遵循的步骤:

  1. 使用Vagrant框或通过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文件并发送。
  11. 我想知道是否有更好的方法来做到这一点。你认为会有,但我还没弄明白。

5 个答案:

答案 0 :(得分:3)

我肯定会考虑以下几点:

A)

  • yum list(选择你的包/依赖项)
  • 在上一个列表中使用yumdownloader(或使用已下载的pkgs)
  • createrepo
  • 在带有安装脚本的媒体上发布,该脚本将cd repo添加到repolist等

或B)

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

答案 1 :(得分:1)

我认为你达到了复杂程度 - 实际上是一个frankenstein怪物 - 你应该停止担心制作具有依赖性的正确包装。我们在之前的工作中做到了这一点 - 我们有一套制造的rpm包 - 它非常简单直接,包括:

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

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

您可以按照how to build RPM package的参考手册获取更多信息。

编辑:如果您需要单个安装包,则创建此主包,其中包含所有其他包(正确设置了依赖关系)并将其安装在安装后脚本中(和在卸载脚本中卸载它们。)

答案 2 :(得分:1)

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

如果是这种情况,那么我认为最直接的解决方案是利用yum和apt基础设施来跟踪这些工具并安装必要的必备软件包。

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

对于离线客户,您可以向媒体提供您的软件,以及上游发行版的mirror - 或mirror子集,以及将其添加到yum config /的说明apt config

荫 Fedora部署指南中的Creating a Yum Repository

公寓 Debian Wiki上的How To Setup A Debian Repository

答案 3 :(得分:1)

制作具有所有依赖关系的包(主要是A,B和C)主要有3个步骤。

一个。收集所需文件 收集主要软件及其依赖项的文件有很多种方法。为了获得所有的依赖和无差错运行,您需要使用基本OS(即实时系统)
1.使用AppDirAssistant
这个应用程序由www.portablelinuxapps.org用于创建可移植的应用程序目录。他们扫描并观察应用程序访问的文件以查找所需的文件 2.使用chroot& overlayfs
在这种方法中,你不需要启动到live cd而是chroot到它 一个。安装.iso @ / cdrom和
湾挂载文件系统(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
即chroot环境
chroot /tmp/union/root

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

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

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

答案 4 :(得分:0)

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

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

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

的脚本