Rpm

如何從已安裝的文件建構 RPM 包?

  • July 5, 2014

有兩台機器,相同版本/架構的 SLES。

在機器#A 上安裝了一個“foo”軟體,我們可以看到使用rpm -qa.

在機器#B 上需要安裝“foo”軟體。

foo.rpm無法從任何來源、網際網路等獲得。

問題

由於該軟體包foo.rpm已安裝在機器#A 上,我們可以從已安裝的文件在其上建構一個foo.rpm文件嗎?

我認為 rpm 中也有前/後腳本。那麼foo.rpm帶有依賴項?)可以安裝。

這樣做是可能的,但非常困難,以便正確完成。如果您不顧一切,您可以創建一個新的 RPM.spec文件並建構一個“假”源 RPM (SRPM) 文件,然後您可以使用rpmbuild --rebuild.

我會繼續尋找實際的 RPM。你沒有在你的問題中說明哪個,但根據我的經驗,如果你知道如何搜尋,你可以在網際網路上找到任何東西。我發現用於 Red Hat 發行版的 RPM 的古老版本已經 10 多年沒有使用了,所以我很難相信在任何地方都沒有這個 RPM 的殘餘。

此外,您還可以經常返回包含在 RPM 中的應用程序的原始碼,並使用它來重建 RPM。源應用程序通常會包含一個必要的.spec文件,用於重建 RPM。

最後,您可以.spec從建構服務(例如 Koji for Red Hat 發行版)獲取原始碼和文件。SuSE 也維護類似的建構服務,因此您可以搜尋這些服務以獲取舊的建構工件。

按原樣獲取二進製文件

您可以使用此方法從一個系統中提取實際的執行檔並將它們打包以部署到另一個系統上。

機器A

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

機器 B

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

SLES 的 RPM 版本

根據此執行緒中的一篇文章:Re: How to create RPM from installed packages rpm on SLES is purported to have the switch --repackage。這在 Red Hat 版本(在 Fedora 或 CentOS 中)上不存在。但是根據文章,您可以像這樣使用它:

$ rpm -e --repackage <somepackage>

完成後,您會發現您的 RPM 可在此處訪問:

/var/spool/repackage

使用 rpmerizor

Rpmerizor是您可以安裝的第 3 方工具/腳本,它將源文件重新打包到相應的 RPM 中。此腳本的用法可在此處訪問,標題為:rpmerizor 的手冊頁

摘抄

Rpmerizor 是一個腳本,允許您從已安裝的文件創建 RPM 包。您只需在命令行上指定文件並回答一些互動式問題即可填充 rpm 元數據(包名稱、版本…)。您還可以在批處理模式下使用元數據的命令行選項。

使用 rpmrebuild

不要與建構工具混淆rpmbuildrpmrebuild它是另一個可用於重新打包已安裝 RPM 的第 3 方腳本。

摘抄

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

參考

引用自:https://unix.stackexchange.com/questions/140778