构建环境隔离和文件系统差异
Posted
技术标签:
【中文标题】构建环境隔离和文件系统差异【英文标题】:Build environment isolation and file system diffing 【发布时间】:2014-01-28 23:21:12 【问题描述】:好吧,所以在第 n 次尝试追踪各种软件的依赖关系并复制各种人为所有不同的 linux 发行版所做的工作之后,我想知道是否有更好的方法来捆绑各种将软件片段整合到一个 .rpm 或 .deb 文件中,以便于分发。
我目前的设置是各种工具的科学怪人,但主要是 Vagrant 和 libguestfs(从在 Fedora 中运行的源代码构建,因为实际上没有一个发行版附带 virt-diff
)。以下是我目前遵循的步骤:
-
使用 Vagrant box 或通过 live CD 创建一个基本操作系统。
导出
.vmdk
并将其命名为base-image
。
旋转上一张图片的精确复制品并前往城镇:使用包管理器,
或其他方式,下载、编译和安装我需要的所有部分。再次导出.vmdk
并将其命名为non-base-image
。
使两个基本映像都可用于具有 libguestfs 的 Fedora 客户操作系统。
使用virt-diff
区分两个图像并将该数据转储到名为diff
的文件中。
运行几个 ruby 脚本,将 diff
转换为另一种格式,其中包含我需要的信息,并且没有我不喜欢 /var
中的内容。
运行另一个脚本,为guestfish
生成一个带有一堆copy-out
命令的命令脚本。
运行guestfish
脚本。
运行另一个脚本以从 diff
重新生成符号链接,因为 guestfish
不能这样做。
将生成的文件夹结构转换为 .deb 或 .rpm 文件并发布。
我想知道是否有更好的方法来做到这一点。你会认为会有,但我还没想出来。
【问题讨论】:
因此,您需要一个包含所有依赖项的单个文件安装程序,例如Google Chrome
、Opera
。我对吗 ?。您对便携式应用程序(或便携式目录)感兴趣吗?
@totti:理想情况下是一个类似 chroot 的环境,可以在任何兼容的 linux 环境上发布和运行。
【参考方案1】:
我肯定会考虑以下几点:
一)
yum 列表(选择您的包/依赖项) 使用上一个列表中的 yumdownloader(或使用您已经下载的 pkgs) 创建仓库 通过安装脚本将 cd 存储库添加到 repolist 等的媒体上发布。或 B)
如上所述的前两个步骤,然后将 rpms 打包到一个存档中,构建一个包含上述所有内容的包,并开始实际安装 rpms(沿着 rpm -Uvh /tmp/repo/* 的行)作为一个后期的脚本(也许在清理阶段)。不知道这是否可以避免 rpm 数据库上的锁定。
【讨论】:
【参考方案2】:我认为你已经到了复杂的地步——实际上是一个科学怪人——你应该停止担心制作具有依赖关系的正确包。我们在我之前的工作中这样做了——我们有一组制造的 rpm 包——而且非常简单直接,包括:
安装前/安装后脚本 卸载脚本 依赖关系我们从来不需要做任何你刚才描述的事情。对于客户来说,甚至安装一组软件包也非常容易!
您可以关注how to build RPM package 的参考手册了解更多信息。
编辑:如果您需要一个安装包,然后创建这个主包,它将包含所有其他包(正确设置依赖项)并在安装后脚本中安装它们(以及在卸载脚本中卸载它们)。
【讨论】:
我可以很好地构建 RPM 包,这不是问题。问题是一些客户没有互联网接入,需要一个独立的包。 我没有说构建这些软件包的人更容易。从客户的角度来看,如果我只给他们一个可以使用rpm -i
安装的软件包,那肯定会更容易。
@davidk01 然后你可以按照我的建议准备所有这些包,然后创建一个主包,它将包含所有这些包并在安装后脚本中安装它们(并在卸载脚本中卸载它们) .【参考方案3】:
主要有 3 个步骤来制作一个包含所有依赖项的包(让它成为 A、B 和 C)。
A.收集所需文件。
有很多方法可以收集主要软件及其依赖项的文件。为了获得所有依赖项并无错误运行,您需要使用基本操作系统(即实时系统)
1. 使用 AppDirAssistant
这个应用程序被 www.portablelinuxapps.org 用来创建可移植的应用程序目录。他们扫描并观察应用程序访问的文件以找到所需的文件。
2. 使用 chroot & overlayfs
在这种方法中,您不需要启动到 live cd 而是 chroot 进入它。
一种。挂载 .iso @ /cdrom 和
湾。挂载文件系统(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
e. Chrootchroot /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。
【讨论】:
aufs 需要内核升级和其他类型的诡计,而 unionfs-fuse 有很多问题,我唯一能做到的就是每次我尝试挂载一些目录时都冻结盒子。 哪个操作系统,年份?。以上所有内容在我的 Ubuntu 12.10 中运行良好。【参考方案4】:问题主要在于确保您的客户已安装您的软件包运行所需的所有标准上游发行版软件包吗?
如果是这种情况,那么我认为最直接的解决方案是利用 yum 和 apt 基础架构来让这些工具跟踪并安装必要的先决条件包。
如果您提供具有完整 pre-req 规范的本机 yum/apt 存储库(您显然已经完成了艰苦的工作)。然后标准的系统安装工具会负责其余的工作。有关为 yum/apt 创建个人存储库的更多信息,请参阅下面的链接。
对于离线客户,您可以为您的软件提供媒体,以及上游发行版的mirror 或mirror 子集,以及将它们添加到yum config/apt config 的说明。
百胜 Creating a Yum Repository 在 Fedora 部署指南中
适合 How To Setup A Debian Repository 在 Debian Wiki 上
【讨论】:
没有网络访问。可以在 cd 或其他媒体上发布分发,但同样也可以使用一个包而不是三个不同的包。【参考方案5】:因此,您的客户永远不会安装任何其他软件,这些软件可能会指定您正在遍历的那些依赖项的不同版本,对吧?
如果你想走那么远,为什么不创建自己的发行版?
或者你可以只给他们一堆包和一个执行rpm -i dep1 dep2 yourpackage
的脚本
【讨论】:
说为什么不创建自己的发行版并不是很有帮助,也没有理由进行全面的发行版。给他们一堆包和一个脚本可以工作,但如果我要这样做,那么最好将整个东西打包成一个而不是 X、Y、Z 包。以上是关于构建环境隔离和文件系统差异的主要内容,如果未能解决你的问题,请参考以下文章
通过命令验证docker容器相当一个轻量级的Linux运行环境,且每个容器内都有一个属于自己的文件系统,容器之间相互隔离