linux生成RPM安裝包的過程及問題解決措施

2021-09-12 05:22:01 字數 4369 閱讀 9844

linux生成rpm安裝包的過程及問題解決措施

日期:2004-6-8

1 製作前的準備

1.1 學習並掌握的知識

熟悉 bash/ksh script 語法,熟悉grep、 sed、 awk、 install、 ldconfig 等工具的使用, 熟悉 rpm 程式的四大基本功能:install、 upgrade、 query、 verify,linux c 語言程式設計, makefile 寫作概念,diff、patch 的使用。

1.2 參考資料

1 . linux rpm-howto

2 . linux下製作rpm包關鍵所在

3 . 精通rpm

2 製作過程

2.1 安裝檔案、打包、路徑設定

將檔案放到最終安裝目錄,包括/opt/superha目錄下的四個子目錄bin、etc、log、gui和檔案/opt/exehasvrd、/opt/ha.pwd;將/opt目錄打包成opt-0.1-1.tar.gz用作源**包(由於本安裝包的製作不包含編譯源**,所以源**包可以任意製作,充數而已)。

將opt-0.1-1.tar.gz拷貝到/usr/src/redhat/sources目錄下(根據系統不同這個目錄也不同),redhat9在root使用者的工作目錄是/root/redhat所以同時拷貝乙份到/root/redhat/sources,這裡可以不在/usr/src/redhat下做任何事情,不過我是在這下面操作的。

2.2 安裝包spec檔案描述**編寫

在 /usr/src/redhat/specs 底下編寫 superha-1.0-1.spec,

summary: ha system for linux

name: superha

version: 0.1

release: 1

source: opt-1.0-1.tgz

packager: bowdar

%description

this package is a ha system for rpm building.

%changelog

* sun jun 6 2004 bowdar

- build for the first time.

%prep

%build

%install

%files

/opt/superha

/opt/exehasvrd

/opt/ha.pwd

2.3 打包過程

編寫完spec描述檔案後就可以開始打包了,確定檔案存在的正確性,然後在/usr/src/redhat/specs目錄下執行rpmbuild –ba superha-1.0-1.spec,順利的話應該看到以下提示資訊

checking for unpackaged file(s): /usr/lib/rpm/check-files /var/tmp

wrote: /root/redhat/srpms/superha-0.1-1.src.rpm

wrote: /root/redhat/rpms/i386/superha-0.1-1.i386.rpm

至此軟體包安裝完成,但事實上不會這麼順利,我的幾乎所有問題都出現在這裡,詳見問題及措施。

3 問題及措施

3.1 getoutputform(): 斷開的通道

打包在進行到checking for unpackeged file(s) /usr/lib/rpm/check-files %時會提示錯誤getoutputform(): 斷開的通道錯誤。

這個錯誤的出現讓我手足無搓,參考的文件中並沒有提起這種問題的出現,而且不知道出現這個錯誤的原因,後來在對rpm-howtu解決的一篇文章中看到,打包rpm之前需要寫乙個rpmrc文件,我參照它的內容寫後,出現了更多錯誤,原來早版本的linux才需要這個文件,不過這個文件中的buildroot項給了我提示,於是在spec文件的前面加上一句%define buildroot /var/tmp後,重新建立包,這個錯誤被解決。

[color=blue]3.2 requires

打包到最後提示以下警告資訊:

requires: libaio.so.1 libaio.so.1(sunw_0.7) libc.so.1 libc.so.1(sunw_0.8) libc.so.6 libc.so.6(glibc_2.0) libc.so.6(glibc_2.1) libc.so.6(glibc_2.1.3) libcrypt.so.1 libcrypt.so.1(glibc_2.0) libelf.so.1 libm.so.6 libncurses.so.5 libnsl.so.1 libpthread.so.0 libpthread.so.0(glibc_2.0) libpthread.so.0(glibc_2.1) libsocket.so.1 libstdc++-libc6.2-2.so.3 libucb.so.1 libucb.so.1(sunw_0.7)

checking for unpackaged file(s): /usr/lib/rpm/check-files /var/tmp

經過很多方面的尋求答案,終於知道這個rpm包build時rpmbuild自動幫我生成依賴關係,並將這種依賴關係加入到製作出來的rpm包裡以便安裝時對安裝環境做判斷,其中的依賴有:libaio.so.1 libaio.so.1(sunw_0.7) libc.so.1 libc.so.1(sunw_0.8),也就是說,安裝者的系統必須有這幾個so才能執行我這個程式,而我安裝這個rpm包時所出現的依賴缺少報警的原因是,rpm命令安裝時會自動在你系統所安裝的所有rpm包資料庫裡搜尋這幾個so,由於rpm資料庫裡沒有這幾個so(估計這幾個so是我自己手工編譯裝上的,而不是rpm包格式安裝的,因此rpm包資料裡沒有我這幾個so的資訊),因此報警依賴缺少。

也就是說,我build的這個rpm包是正確的,因為程式確實依賴這幾個so來執行,只是可能因為我這幾個so是由於非rpm安裝的才產生這種安裝錯誤。

那麼為什麼會出現這個錯誤呢?每安裝和刪除乙個rpm包,都會更新乙個資料庫,這個資料庫位於/var/lib/rpm目錄下(下面稱這個資料庫為rpm資料庫); 這個資料庫記錄了我安裝上的所有的包的相關資訊,包括包的各種描述資訊(譬如安裝進系統的包的名字,用途描述,包裡面包括的檔案等等),譬如,a.rpm這個包安裝時將b這個檔案安裝到/usb/bin/b,這個資訊會記錄(/usr/bin/b)進rpm資料庫,以後我解除安裝a這個rpm包時,系統會自動根據資料庫裡的記錄將/usr/bin/b解除安裝掉,同時去掉資料庫裡關於a這個包的一切記錄。正是由於這個資料庫的存在,才讓rpm包的安裝和解除安裝變得易於管理。根據這個資料庫,很容易知道你曾經安裝過哪些rpm包(rpm -qa |more),安裝上的所有包的描述資訊(rpm -qia|more),和其中某個包的資訊(rpm -qil rpm包名)。 當要安裝乙個rpm包時,rpm命令會先讀取這個rpm包的依賴檔案(rpm包的依賴檔案你可以用rpm -qpi --requires ***.rpm命令檢視),然後遍歷一遍rpm資料庫進行對比,如果讀到的依賴檔案在rpm資料庫裡全部有記錄存在,也判斷依賴關係完全滿足而順利安裝,否則,就會出現我說的情況;注意的是,它只會在rpm資料庫裡進行對比,而不是在實際系統存在的檔案裡進行對比。

我仔細檢查了每乙個二進位制檔案發現hamond、hasvrd等幾個主要的ha系統檔案呼叫了那幾個so,因此build rpm包時自動將那些依賴關係加入了rpm包資訊裡(這是很有必要的,因為這些檔案確實需要那些so才能正常執行),而那幾個so是由於非rpm方式安裝上的,因此在我機器上安裝製作出來的包時會出現依賴缺少的警告。

包是打成功了,不過安裝的時候會檢查系統是否有這些so檔案,會提示以下錯誤而無法安裝

error: failed dependencies:

libaio.so.1 is needed by superha-0.1-1

libaio.so.1(sunw_0.7) is needed by superha-0.1-1

libc.so.1 is needed by superha-0.1-1

libc.so.1(sunw_0.8) is needed by superha-0.1-1

libsocket.so.1 is needed by superha-0.1-1

libucb.so.1 is needed by superha-0.1-1

libucb.so.1(sunw_0.7) is needed by superha-0.1-1

如果系統裡沒有這些包,提示這個資訊就只有通過加引數 –-nodeps強行安裝,但安裝後應該不能執行,如果二進位制檔案需要這些so的話。

(打包過程還遇到了其它很多小問題,一般也能解決,這裡就省略了)[/color]

4 打包結束

打包最後生成的檔案在/root/redhat/rpms資料夾下生成了superha-0.1-1.i386.rpm,執行rpm –ivh superha-0.1-1.i386(如果提示錯誤,加上--nodeps)將安裝成功,rpm –e superha-0.1解除安裝掉安裝好的檔案。

rpm安裝包製作

rpm是rpm package manager rpm軟體包管理器 1.安裝製作工具 yum install rpm build2.目錄結構 root rpmbuild sources 存放源 補丁,圖示等檔案 root rpmbuild specs 存放用於管理rpm製作程序的spec檔案 roo...

製作rpm安裝包

1 安裝rpmbuild軟體 sudo apt get install rpmbuild 2 配置工作路徑 在製作 rpm 包之前,首先要配置工作路徑,也就是製作 rpm 包所在的目錄。製作 rpm 包需要有乙個特定的目錄結構。當前的 工作路徑儲存在巨集 topdir 中,可以通過 rpmbuild...

Linux下rpm 安裝包方式安裝

為了方便linux 使用者新增和刪除軟體,red hat 公司提出了軟體包管理器rpm,由於它的出現使得在linux 中安裝 解除安裝應用程式變得相對簡單,預設情況下 即不出現檔案依賴問題 使用者只需雙擊rpm 軟體包,系統會自動進行安裝。乙個rpm包檔案是能夠讓應用軟體執行的全部檔案的乙個集合,它...