有两台机器,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 重建
不要与构建工具混淆rpmbuild
,rpmrebuild
是另一个 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>
。