Red Hat Training
A Red Hat training course is available for Red Hat Satellite
章 8. RPM
通常進行自動化的安裝時,管理員會建置非 Red Hat 所提供的自訂應用程式(例如備份和監控軟體)。若要這麼作,此軟體必須被整合為 RPM。您可在一部執行 Red Hat Enterprise Linux(RHEL)的系統上,設置 RPM 建置環境。請注意,建置系統必須包含與使用於目標系統相同版本的套件。這代表若要為基於 RHEL 5 的系統建置 RPM,您必須使用一部 RHEL 5 系統,而若要建置基於 RHEL 6 的 RPM,您則需要使用 RHEL 6 系統。
rpm-build
套件必須安裝在建置系統上,才可滿足最低系統需求。您可能也需要額外的套件,例如編譯器和函式庫。
準備好用於生產環境中的 RPM 套件應以 GPG 金鑰簽署,這能讓使用者驗證套件的來源和完整性。應只有信任的管理員才可擁有用來簽署 RPM 的 GPG 金鑰之密碼。
過程 8.1. 建立一組 GPG 金鑰
重要
下列指令將會啟動 GPG 金鑰建立,並將它以適合發佈至客戶端系統的格式匯出。您應儲存並備份此金鑰。
- 建立目錄以存放金鑰:
mkdir -p ~/.gnupg
- 產生金鑰配對:
gpg --gen-key
您需要選擇金鑰類型、金鑰大小,以及其有效期限(請按下 enter 來接受預設值)。您亦需要指定名稱、註解,以及電子郵件:Real name: rpmbuild Email address: rpmbuild@example.com Comment: this is a comment You selected this USER-ID: "rpmbuild (this is a comment) <rpmbuild@example.com>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?
請按下 O 以存取詳細資料並繼續進行。 - 列出所有金鑰以及其指紋:
gpg --list-keys --fingerprint
- 匯出金鑰:
gpg --export --armor "rpmbuild <rpmbuild@example.com>" > EXAMPLE-RPM-GPG-KEY
- 將金鑰匯入至 RPM 資料庫,並透過以 root 身份在所有目標系統上執行
gpg --import
,以允許 RPM 原始來源和完整性驗證:rpm --import EXAMPLE-RPM-GPG-KEY
這將會在進行客戶端安裝時自動發生,並且無須手動式執行。 - 當 RPM 被建立後,它便可由 GPG 金鑰簽署,並上載至正確的頻道:
rpm --resign package.rpm rhnpush --server=http[s]://satellite.server/APP package.rpm --channel=custom-channel-name
- 若要驗證 RPM 套件,請瀏覽至包含了該套件的目錄,並執行下列指令:
rpm –qip package.rpm rpm -K package.rpm
過程 8.2. 建置 RPM
- 請建立一個名為
rpmbuild
的無特權使用者帳號,以用來建立套件。這將能讓多個管理員共享建置環境和 GPG 金鑰。 - 請在
rpmbuild
使用者的家目錄(/home/rpmbuild
)中,建立一個名為.rpmmacros
的檔案:touch /home/rpmbuild/.rpmmacros
- 請在文字編輯器中開啟
.rpmmacros
檔案,並附加下列幾行。_gpg_name
必須符合使用來簽署 RPM 的 GPG 金鑰的名稱:%_topdir %(echo $HOME)/rpmbuild %_signature %gpg %_gpg_name rpmbuild <rpmbuild@example.com>
已定義的頂層目錄(於以上範例中的/home/rpmbuild/rpmbuild
)的目錄清單必須擁有與/usr/src/redhat
下,相同的目錄格式。
範例 8.1. RPM 規格檔案
下列為 RPM 規格檔案的基本範例。當建立時,它應位於
_topdir
下的 SPECS
目錄中(如使用者的 .rpmmacros
檔案所定義)。相應的來源和升級檔應位於 SOURCES
目錄中。
Name: foo Summary: The foo package does foo Version: 1.0 Release: 1 License: GPL Group: Applications/Internet URL: http://www.example.org/ Source0 : foo-1.0.tar.gz Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root Requires: pam BuildPrereq: coreutils %description This package performs the foo operation. %prep %setup -q %build %install mkdir -p %{buildroot}/%{_datadir}/%{name} cp -p foo.spec %{buildroot}/%{_datadir}/%{name} %clean rm -fr %{buildroot} %pre # Add user/group here if needed %post /sbin/chkconfig --add food %preun if [ $1 = 0 ]; then # package is being erased, not upgraded /sbin/service food stop > /dev/null 2>&1 /sbin/chkconfig --del food fi %postun if [ $1 = 0 ]; then # package is being erased # Any needed actions here on uninstalls else # Upgrade /sbin/service food condrestart > /dev/null 2>&1 fi %files %defattr(-,root,root) %{_datadir}/%{name} %changelog * Mon Jun 16 2003 Some One <one@example.com> - fixed the broken frobber (#86434)