Red Hat Training

A Red Hat training course is available for Red Hat Satellite

Глава 8. RPM

В ходе автоматической установки систем, возможно, потребуется установить дополнительные программы, не принадлежащие Red Hat. Они должны предоставляться в виде пакетов RPM. В свою очередь, пакеты должны создаваться в окружении Red Hat Enterprise Linux. Так, сборка пакетов для установки в Red Hat Enterprise Linux 5 должна осуществляться в Red Hat Enterprise Linux 5.
В системе, где будет осуществляться сборка пакетов, надо будет заранее установить rpm-build. Дополнительно могут потребоваться другие компиляторы и библиотеки.
Готовые пакеты должны быть подписаны при помощи ключа GPG, что позволит проверить его подлинность. Парольная фраза ключа 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:
    rpm --import EXAMPLE-RPM-GPG-KEY
    
    Эта операция будет выполняться автоматически во время установки клиентов.
  6. После создания RPM его можно подписать при помощи ключа GPG и добавить в канал:
    rpm --resign package.rpm
    rhnpush --server=http[s]://satellite.server/APP package.rpm --channel=channel-name
  7. Выполните проверку пакета:
    rpm –qip package.rpm
    rpm -K package.rpm

Процедура 8.2. Сборка RPM

  1. Создайте пользователя с именем rpmbuild. Это позволит администраторам использовать одно и то же окружение и GPG-ключ при выполнении сборки пакетов.
  2. В его домашнем каталоге создайте файл .rpmmacros:
    touch /home/rpmbuild/.rpmmacros
    
  3. В созданный файл добавьте:
    %_topdir            %(echo $HOME)/rpmbuild
    %_signature         %gpg
    %_gpg_name          rpmbuild <rpmbuild@example.com>
    
    Каталог /home/rpmbuild/rpmbuild должен иметь ту же структуру что и /usr/src/redhat.

Пример 8.1. Файл спецификации RPM

Ниже приведен пример файла спецификации. Он должен быть размещен в каталоге SPECS, который должен быть расположен в каталоге, заданном с помощью _topdir в файле .rpmmacros
  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)