Иногда бывает, что на поиск нужной RPM-ки уходит времени больше, чем на создание своей из исходников. Например, RPM-пакет pptpd 1.3.4 более недоступен по ссылке, которая была в посте об установке pptpd. А мне он как раз понадобился при настройке очередного VPN-сервера. Выход как всегда есть. Рассмотрим на примере pptpd создание rpm-пакета на основе исходных текстов, запакованных в классический tarball с раширением .tar.gz.
- Качаем tarball отсюда: http://sourceforge.net/projects/poptop/files/
- Устанавливаем пакет 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 (если еще не установлен).
- Собираем пакет:
[root@server]# rpmbuild -tb /tmp/pptpd-1.3.4.tar.gz
- Находим вновьсозданную 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
- Устанавливаем:
[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-файлы почему-то не создавались в процессе сборки.
Если во время сборки пакета вылазит ошибка "error: Installed (but unpackaged) file(s) found", то нужно перечислить эти файлы в секции %files .spec-файла.