如何从已安装的文件构建 RPM 包?

如何从已安装的文件构建 RPM 包?

有两台机器,SLES 的版本/架构相同。

在机器 #A 上安装了一个“foo”软件,我们可以看到它使用rpm -qa.

在机器#B 上需要安装“foo”软件。

无法foo.rpm从任何来源(例如互联网等)获得该信息。

问题

由于该软件包foo.rpm已安装在机器 #A 上,我们可以foo.rpm根据已安装的文件在其上构建文件吗?

我认为 rpm 中也有前/后脚本。那么foo.rpm有依赖关系吗?)可以安装。

答案1

正确地做到这一点是可能的,但非常困难。如果您绝望,您可以创建一个新的 RPM.spec文件并构建一个“假”源 RPM (SRPM) 文件,然后您可以使用该文件使用rpmbuild --rebuild.

我会继续寻找实际的 RPM。您没有在问题中说明具体内容,但根据我的经验,如果您知道如何搜索,您可以在互联网上找到任何内容。我发现 Red Hat 发行版的 RPM 的旧版本已经有 10 多年没有使用了,所以我很难相信任何地方都没有这个 RPM 的残余。

此外,您经常可以返回到 RPM 中包含的应用程序的源代码,并使用它来重建 RPM。通常,源应用程序会包含.spec用于重建 RPM 的必要文件。

.spec最后,您可以从构建服务(例如基于 Red Hat 的发行版的 Koji)获取源代码和文件。 SuSE 也维护类似的构建服务,因此您可以搜索这些服务以获取旧的构建工件。

按原样获取二进制文件

您可以使用此方法从一个系统中提取实际的可执行文件,并将其打包以便部署在另一系统上。

机器A

$ rpm -ql <packageNameHere> | xargs tar -zcvf /tmp/program.tgz

机器B

$ tar -zxvf /path/to/your/program.tgz

SLES 的 RPM 版本

根据该线程中的一篇帖子:回复:如何从已安装的软件包创建 RPM rpm据称SLES上有这个开关--repackage。 Red Hat 版本(Fedora 或 CentOS)上不存在此功能。但根据帖子,你可以像这样使用它:

$ rpm -e --repackage <somepackage>

完成后,您将发现您的 RPM 可在此处访问:

/var/spool/repackage

使用rpmerizor

转速是您可以安装的第 3 方工具/脚本,它将把源文件重新打包到相应的 RPM 中。该脚本的用法可在此处访问,标题为:rpmerizor 的手册页

摘抄

Rpmerizor 是一个脚本,允许您从已安装的文件创建 RPM 包。您只需在命令行上指定文件并回答一些交互式问题即可填充 rpm 元数据(包名称、版本...)。您还可以通过元数据的命令行选项以批处理模式使用它。

使用 rpm 重建

不要与构建工具混淆rpmbuildrpmrebuild是另一个 3rd 方脚本,您可以使用它来重新打包已安装的 RPM。

摘抄

rpmrebuild 是一个从基本使用中已安装的软件包构建 RPM 文件的工具,rpmrebuild 使用不需要任何 rpm 构建知识。 (在 debian 上,等效产品是 dpkg-repack)。

例子

假设我们要重新打包 openssh-server。

$ rpm -aq | grep openssh-server
openssh-server-6.2p2-8.fc19.x86_64

现在将其打包:

$ rpmrebuild openssh-server-6.2p2-8.fc19.x86_64
/usr/lib/rpmrebuild/rpmrebuild.sh: WARNING: some files have been modified:
..?......  c /etc/ssh/sshd_config
..?......  c /etc/sysconfig/sshd
Do you want to continue ? (y/N) y
Do you want to change release number ? (y/N) n
result: /root/rpmbuild/RPMS/x86_64/openssh-server-6.2p2-8.fc19.x86_64.rpm

参考

答案2

一般来说,没有。

运气好的话rpm -qi,可以rpm -q --changelog提供有关包裹来源的信息。

如果它是在其运行的系统上构建的,那么您可能仍然拥有用于制作实际 rpm 的规范文件(如果不是两者都有的话)。

作为一般规则,我不建议复制文件/二进制文件,但大多数元信息都在 RPM 数据库中,并且您拥有实际的文件。

rpm -q --list <pkg_name>显示包部署的所有文件。

rpm -q --scripts <pkg_name> 显示通过安装(或删除)包执行的任何脚本可能至少与部署的文件一样深入了解其用途。

任何必须安装的依赖项都可以通过 找到rpm -q --requires <pkg_name>

相关内容