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 金鑰建立,並將它以適合發佈至客戶端系統的格式匯出。您應儲存並備份此金鑰。
  1. 建立目錄以存放金鑰:
    mkdir -p ~/.gnupg
    
  2. 產生金鑰配對:
    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 以存取詳細資料並繼續進行。
  3. 列出所有金鑰以及其指紋:
    gpg --list-keys --fingerprint
    
  4. 匯出金鑰:
    gpg --export --armor "rpmbuild <rpmbuild@example.com>" > EXAMPLE-RPM-GPG-KEY
    
  5. 將金鑰匯入至 RPM 資料庫,並透過以 root 身份在所有目標系統上執行 gpg --import,以允許 RPM 原始來源和完整性驗證:
    rpm --import EXAMPLE-RPM-GPG-KEY
    
    這將會在進行客戶端安裝時自動發生,並且無須手動式執行。
  6. 當 RPM 被建立後,它便可由 GPG 金鑰簽署,並上載至正確的頻道:
    rpm --resign package.rpm
    rhnpush --server=http[s]://satellite.server/APP package.rpm --channel=custom-channel-name
  7. 若要驗證 RPM 套件,請瀏覽至包含了該套件的目錄,並執行下列指令:
    rpm –qip package.rpm
    rpm -K package.rpm

過程 8.2. 建置 RPM

  1. 請建立一個名為 rpmbuild 的無特權使用者帳號,以用來建立套件。這將能讓多個管理員共享建置環境和 GPG 金鑰。
  2. 請在 rpmbuild 使用者的家目錄(/home/rpmbuild)中,建立一個名為 .rpmmacros 的檔案:
    touch /home/rpmbuild/.rpmmacros
    
  3. 請在文字編輯器中開啟 .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)