Skip to content


Создание rpm-пакета

Иногда бывает, что на поиск нужной RPM-ки уходит времени больше, чем на создание своей из исходников. Например, RPM-пакет pptpd 1.3.4 более недоступен по ссылке, которая была в посте об установке pptpd. А мне он как раз понадобился при настройке очередного VPN-сервера. Выход как всегда есть. Рассмотрим на примере pptpd создание rpm-пакета на основе исходных текстов, запакованных в классический tarball с раширением .tar.gz.

  1. Качаем tarball отсюда: http://sourceforge.net/projects/poptop/files/
  2. Устанавливаем пакет rpm-build:
    [root@server]# yum install rpm-build
    Setting up Install Process
    Resolving Dependencies
    --> Running transaction check
    ---> Package rpm-build.i386 0:4.4.2.3-20.el5_5.1 set to be updated
    --> Processing Dependency: elfutils for package: rpm-build
    --> Running transaction check
    ---> Package elfutils.i386 0:0.137-3.el5 set to be updated
    --> Processing Dependency: elfutils-libs-i386 = 0.137-3.el5 for package: elfutils
    --> Processing Dependency: libdw.so.1(ELFUTILS_0.127) for package: elfutils
    --> Processing Dependency: libdw.so.1(ELFUTILS_0.122) for package: elfutils
    --> Processing Dependency: libasm.so.1 for package: elfutils
    --> Processing Dependency: libdw.so.1(ELFUTILS_0.130) for package: elfutils
    --> Processing Dependency: libdw.so.1 for package: elfutils
    --> Processing Dependency: libasm.so.1(ELFUTILS_1.0) for package: elfutils
    --> Processing Dependency: libdw.so.1(ELFUTILS_0.126) for package: elfutils
    --> Running transaction check
    ---> Package elfutils-libs.i386 0:0.137-3.el5 set to be updated
    --> Finished Dependency Resolution
    Dependencies Resolved
    ===================================================================
     Package     Arch    Version         Repository  Size
    ===================================================================
    Installing:
     rpm-build      i386   4.4.2.3-20.el5_5.1   updates    302 k
    Installing for dependencies:
     elfutils       i386   0.137-3.el5          base       228 k
     elfutils-libs  i386   0.137-3.el5          base       193 k
    Transaction Summary
    ===================================================================
    Install       3 Package(s)
    Upgrade       0 Package(s)
     
    Total download size: 723 k
    Is this ok [y/N]: y
    Downloading Packages:
    (1/3): elfutils-libs-0.137-3.el5.i386.rpm               | 193 kB   00:00
    (2/3): elfutils-0.137-3.el5.i386.rpm                    | 228 kB   00:00
    (3/3): rpm-build-4.4.2.3-20.el5_5.1.i386.rpm            | 302 kB   00:00
     
    Total                                            842 kB/s | 723 kB 00:00
    Running rpm_check_debug
    Running Transaction Test
    Finished Transaction Test
    Transaction Test Succeeded
    Running Transaction
      Installing     : elfutils-libs                                1/3
      Installing     : elfutils                                     2/3
      Installing     : rpm-build                                    3/3
    Installed:
      rpm-build.i386 0:4.4.2.3-20.el5_5.1
    Dependency Installed:
      elfutils.i386 0:0.137-3.el5  elfutils-libs.i386 0:0.137-3.el5
    Complete!

    Возможно, также еще потребуется С-компилятор, такой как gcc (если еще не установлен).

  3. Собираем пакет:
    [root@server]# rpmbuild -tb /tmp/pptpd-1.3.4.tar.gz
  4. Находим вновьсозданную rpm-ку:
    [root@server]# ls -l /usr/src/redhat/RPMS/i386/
    -rw-r--r-- 1 root root 84570 Nov  5 22:18 pptpd-1.3.4-1.i386.rpm
  5. Устанавливаем:
    [root@server]# rpm -ivh /usr/src/redhat/RPMS/i386/pptpd-1.3.4-1.i386.rpm

Если пакет собирается обычным юзером, не обладающим привилегиями суперпользователя, то доступа на запись в директорию /usr/src/redhat у него, ясное дело, нет. В этой ситуации можно явно указать rpmbuild-у рабочие директории следующим образом:

WD=$HOME/tmp/rpmtop
[ ! -d $WD ] && mkdir -p $WD
mkdir -p $WD/{SOURCES,BUILD,SPECS,SRPMS,RPMS/`uname -m`}
echo "%_topdir $WD" >> $HOME/.rpmmacros

Во 3-ей строке команда "uname -m" вернёт конкретную, используемую Вами архитектуру. В большинстве случаев это “i386”. У меня - “x86_64”.

Можно также собирать rpm-пакет из src.rpm. Например, мне как-то нужно было поставить на кучу серверов сразу с CentOS x86_64 пакет tinyproxy. В том пакете, который мне удалось найти в известных мне репозиториях (EPEL, RPMForge), был кривой init-скрипт, в котором был неправильно указан путь к бинарнику (/usr/bin/tinyproxy вместо /usr/sbin/tinyproxy) и путь к pid-файлу, что приводило к невозможности запустить сервис штатными средствами без доработки напильником стартового скрипта /etc/init.d/tinyproxy на каждом сервере. К тому же, конфиг-файл по умолчанию меня несколько не устраивал, поэтому я решил всё это один раз подредактировать и создать свою RPM-ку, которую потом простым скриптом можно было сразу проинсталлировать на все сервера. Далее я нашёл tinyproxy-1.8.2-1.fc14.src.rpm и распаковал его:

# rpm2cpio < tinyproxy-1.8.2-1.fc14.src.rpm | cpio -i
430 blocks
# ls -la
total 488
drwxrwxr-x  2 avz avz   4096 Apr 13 13:13 .
drwx------ 10 avz avz   4096 Apr 13 13:13 ..
-rw-r--r--  1 avz avz 214619 Apr 12 14:51 tinyproxy-1.8.2-1.fc14.src.rpm
-rw-rw-r--  1 avz avz 202931 Apr 13 13:13 tinyproxy-1.8.2.tar.bz2
-rw-r--r--  1 avz avz  10147 Apr 13 13:13 tinyproxy.conf
-rw-r--r--  1 avz avz   1906 Apr 13 13:13 tinyproxy.init
-rw-r--r--  1 avz avz    252 Apr 13 13:13 tinyproxy.logrotate
-rw-r--r--  1 avz avz   4109 Apr 13 13:13 tinyproxy.spec

Теперь редактируем файлы tinyproxy.init и tinyproxy.conf (при необходимости). В файл tinyproxy.spec в раздел changelog пишем чего же мы такого ценного привнесли своими изменениями (это необязательно, просто правило хорошего тона) и собственно собираем rpm-ку:

# mv tinyproxy-1.8.2.tar.bz2 tinyproxy.conf tinyproxy.init tinyproxy.logrotate /usr/src/redhat/SOURCES
# rpmbuild -ba tinyproxy.spec

Если всё прошло успешно (нет ошибок от make), то сможем наблюдать появление правильной RPM-ки, которую и можно ставить на все сервера сразу:

# ls /usr/src/redhat/RPMS/`uname -m`/tin*
/usr/src/redhat/RPMS/x86_64/tinyproxy-1.8.2-1.x86_64.rpm

Ключик -ba, кстати, также создаёт и src.rpm в директории /usr/src/redhat/SRPMS --- может пригодиться при последующих пересборках. Если же make выдаёт ошибки, то надо разбираться и чинить. В моём случае, например, пришлось установить пакет docbook-style-xsl, потому что без него man-файлы почему-то не создавались в процессе сборки.

Posted in *nix, Howto.

Tagged with , , , .


One Response

Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.

  1. Петровский says

    Если во время сборки пакета вылазит ошибка "error: Installed (but unpackaged) file(s) found", то нужно перечислить эти файлы в секции %files .spec-файла.

You must be logged in to post a comment.