Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 构建环境隔离和文件系统差异_Linux_Build_Debian_Rpm_Isolation - Fatal编程技术网

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

Linux 构建环境隔离和文件系统差异,linux,build,debian,rpm,isolation,Linux,Build,Debian,Rpm,Isolation,好的,在第n次尝试追踪各种软件的依赖关系,并复制不同的人为所有不同的linux发行版所做的工作之后,我想知道是否有更好的方法将各种软件捆绑到一个.rpm或.deb文件中,以便于分发 我目前的设置是一个由各种工具组成的弗兰肯斯坦怪物,但主要是Vagrant和libguestfs(从Fedora中运行的源代码构建,因为没有一个发行版实际附带了virt diff)。以下是我目前遵循的步骤: 使用一个“流浪者”盒子或从实时CD创建一个基本操作系统来加速基本操作系统 导出.vmdk并将其称为基本图像 旋转

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

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

  • 使用一个“流浪者”盒子或从实时CD创建一个基本操作系统来加速基本操作系统
  • 导出
    .vmdk
    并将其称为
    基本图像
  • 旋转上一张图像的精确复制品并进城:使用软件包管理器, 或者其他方式,下载、编译和安装我需要的所有部件。再次导出
    .vmdk
    ,并将其称为
    非基本图像
  • 使具有libguestfs的Fedora来宾操作系统可以使用这两个基本映像
  • 使用
    virt diff
    区分两个图像,并将数据转储到名为
    diff
    的文件中
  • 运行几个ruby脚本,将
    diff
    转换成另一种格式,其中包含我需要的信息,而不包含我不喜欢
    /var
    中的任何内容
  • 运行另一个脚本,为
    guestfish
    生成一个命令脚本,其中包含一组
    复制
    命令
  • 运行
    guestfish
    脚本
  • 运行另一个脚本从
    diff
    重新生成符号链接,因为
    guestfish
    无法执行此操作
  • 将生成的文件夹结构转换为.deb或.rpm文件并发送

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

    我认为你已经到了复杂性的地步——事实上是一个弗兰肯斯坦怪兽——在这里,你不应该再担心制作具有依赖性的正确包了。在我之前的工作中,我们做了这件事——我们有一套制作好的rpm软件包——非常简单和直接,包括:

    • 安装前/安装后脚本
    • 卸载脚本
    • 依赖关系
    我们从来不用做你刚才描述的任何事情。对于客户来说,安装一套软件包也很容易

    有关更多信息,请参阅的参考手册


    编辑:如果需要单个安装包,则创建此主包,该主包将包含所有其他包(正确设置依赖项),并在安装后脚本中安装(并在卸载脚本中卸载).

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

    如果你想这么做,为什么不创建你自己的发行版呢


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

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

    如果是这样的话,那么我认为最简单的解决方案是利用yum和apt基础设施,让这些工具跟踪并安装必要的必备软件包

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

    对于离线客户,您可以随软件提供介质,以及上游发行版的一个或子集,以及将它们添加到/的说明

    好吃 在Fedora部署指南中

    贴切
    在Debian Wiki

    中,我肯定会考虑以下一些事情:

    (A)

    • yum列表(选择您的包/依赖项)
    • 使用上一列表中的yumdownloader(或使用您已经下载的软件包)
    • createrepo
    • 随附安装脚本的介质发货,该脚本可将cd repo添加到repolist等
    或B)


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

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

    A.收集所需文件。
    有许多方法可以收集主软件及其依赖项的文件。为了获得所有依赖项并实现无错误运行,您需要使用基本操作系统(即实时系统)
    1.使用AppDirAssistant
    www.portablelinuxapps.org使用此应用程序创建便携应用程序目录。他们扫描并监视应用程序访问的文件,以查找所需文件。
    2.使用chroot和overlayfs
    在这种方法中,您不需要启动到live cd,而需要启动到它。
    A.安装.iso@/cdrom和
    B将文件系统(filesystem.squashfs)装载到另一个位置,比如@/tmp/union/root
    C绑定挂载/proc@/tmp/union/root/proc
    D覆盖在它上面
    mount-t-overlayfs-overlayfs/tmp/union/root-o-lowerdir=/tmp/union/root,upperdir=/tmp/union/rw

    EChroot
    chroot/tmp/union/root

    现在,您可以使用apt get或其他方法(仅从chrooted终端)安装软件包。所有更改的文件都存储在@
    /tmp/union/rw
    。从那里获取文件。
    3.使用手动收集的包
    使用包管理器收集依赖项。例如
    apt-get-install