Создать rpm пакет из списка файлов. Сборка пакетов библиотек для rpm-based дистрибутивов Linux. Solutions collect form web for “Как создать пакет RPM из установленных файлов?”

Но часто бывает так, что вам необходимо собрать пакет с необходимыми опциями (включить поддержку mysql, postgresql или cyrus-sasl2 и т.п.), которые отсутствуют в rpm пакете, поставляемом на диске с дистрибутивом. Выходом из этой ситуации является сборка своего собственного пакета.

Для облегчения сборки rpm пакетов существует специально предназначенный для этих целей пакет - rpm-build.

# rpm -qi rpm-build Name: rpm-build Relocations: (not relocatable) Version: 4.3.3 Vendor: CentOS Release: 7_nonptl Build Date: Пнд 21 Фев 2005 20:21:52 Install Date: Сбт 09 Апр 2005 22:14:57 Build Host: guru.build.karan.org Group: Development/Tools Source RPM: rpm-4.3.3-7_nonptl.src.rpm Size: 1576124 License: GPL Signature: DSA/SHA1, Вск 27 Фев 2005 00:36:59, Key ID a53d0bab443e1821 Packager: Karanbir Singh

Как видно из описания этот пакет содержит набор скриптов и программ, предназначенных для сборки пакетов.

Для того, чтобы собрать какой-либо пакет для начала необходимо загрузить т.н. исходники для сборки пакета, как правило, это файлы с расширением src.rpm. Иногда, как в случае с courier-imap, spec файл включается в исходные коды.

Очень удобным для поиска rpm и src.rpm пакетов является сайт www.rpmfind.net . Например, мы нашли необходимый нам пакет - postfix, squid и т.д. Мы сразу можем узнать какие пакеты, необходимы для его сборки. Вот стандартная страница с информацией о пакете для postix и для squid . Также там указывается контрольная сумма для проверки целостности пакета.

После того, как мы получили исходники и проверили их целостность, необходимо установить соответствующий пакет.

# rpm -ivh postfix-2.2.8-1.2.src.rpm 1:postfix ###########################################

После выполнения данной операции исходники postfix и все необходимые пачти, а также скрипты были установлены в /usr/src/redhat/SOURCES/, а spec файл (инструкция для сборки rpm пакета) в /usr/src/redhat/SPECS/.

# ls /usr/src/redhat/SOURCES/ pflogsumm-1.1.0.tar.gz postfix-etc-init.d-postfix postfix-2.1.1-config.patch postfix-hostname-fqdn.patch postfix-2.1.1-obsolete.patch postfix-large-fs.patch postfix-2.1.5-aliases.patch postfix-pam.conf postfix-2.2.5-cyrus.patch postfix-sasl.conf postfix-2.2.8.tar.gz README-Postfix-SASL-RedHat.txt postfix-alternatives.patch # ls /usr/src/redhat/SPECS/ postfix.spec

Это стандартное месторасположение файлов при установке src.rpm. В принципе названия папок говорят сами за себя.

И так, для того, чтобы начать собирать пакет необходимо перейти в папку с spec файлом и выполнить следующую команду

# cd /usr/src/redhat/SPECS/ # rpmbuild -ba --target=i686 postfix.spec Платформы для сборки: i686 Сборка для платформы i686 Выполняется(%prep): /bin/sh -e /var/tmp/rpm-tmp.82019 + umask 022 + cd /usr/src/redhat/BUILD + umask 022 + cd /usr/src/redhat/BUILD + rm -rf postfix-2.2.8 + /bin/gzip -dc /usr/src/redhat/SOURCES/postfix-2.2.8.tar.gz + tar -xf - + STATUS=0 + "[" 0 -ne 0 "]" + cd postfix-2.2.8 ++ /usr/bin/id -u + "[" 0 = 0 "]" + /bin/chown -Rhf root . ++ /usr/bin/id -u + "[" 0 = 0 "]" + /bin/chgrp -Rhf root . + /bin/chmod -Rf a+rX,u+w,g-w,o-w . + echo "Patch #1 (postfix-2.1.1-config.patch):" Patch #1 (postfix-2.1.1-config.patch): + patch -p1 -b --suffix .config -s ... ... ... Записан: /usr/src/redhat/SRPMS/postfix-2.2.8-1.2.src.rpm Записан: /usr/src/redhat/RPMS/i686/postfix-2.2.8-1.2.i686.rpm Записан: /usr/src/redhat/RPMS/i686/postfix-pflogsumm-2.2.8-1.2.i686.rpm Выполняется(%clean): /bin/sh -e /var/tmp/rpm-tmp.73987 + umask 022 + cd /usr/src/redhat/BUILD + cd postfix-2.2.8 + /bin/rm -rf /var/tmp/postfix-buildroot + exit 0

Из последних строчек видно, что готовый rpm пакет называется postfix-2.2.8-1.2.i686.rpm и сохранен в папке /usr/src/redhat/RPMS/i686/, так как при сборке пакета мы указали ключ --target=i686.

Собственно сборка не должна вызвать никаких проблем. Но что если нам необходимо собрать пакет со своими опциями, например, включить поддержку mysql или sasl2 и т.п.? Для этих целей необходимо будет подправить spec файл.

Рассмотрим часть spec файла postfix, надо заметить, что у postfix так сказать нестандартный spec файл.

Например, мы захотели собрать postfix с поддержкой MySQL, для этого в самом начале меняем %define MYSQL 0 на %define MYSQL 1. и снова выполняем команду

# rpmbuild -ba --target=i686 postfix.spec Платформы для сборки: i686 Сборка для платформы i686 ошибка: Неудовлетворенные зависимости сборки: mysql-devel нужен для postfix-2.2.8-1.2.i686

Он нам пишет, что для сборки необходимо установить пакет mysql-devel. Обратите внимание, что версия не указывается, это значит, что можно установить любую версию, которую поддерживает postfix или нужный вам пакет.

Если бы вы собирали из исходных кодов, то вам пришлось бы самому искать, какие пакеты необходимы для сборки данного пакета. В этом и заключается одно из преимуществ сборки из src.rpm по сравнению с tar.gz или tar.bz2.

Устанавливаем соответствующий пакет

# rpm -ivh MySQL-devel-4.1.9-0.i386.rpm Подготовка... ########################################### 1:MySQL-devel ###########################################

И заново запускаем сборку postfix. На этот раз мы видим, что все необходимые пакеты для сборки установлены и теперь необходимо, лишь дождаться окончания сборки.

# rpmbuild -ba --target=i686 postfix.spec Платформы для сборки: i686 Сборка для платформы i686 Выполняется(%prep): /bin/sh -e /var/tmp/rpm-tmp.86320 + umask 022 + cd /usr/src/redhat/BUILD + umask 022 + cd /usr/src/redhat/BUILD + rm -rf postfix-2.2.8 ... ... ... Записан: /usr/src/redhat/SRPMS/postfix-2.2.8-1.2.src.rpm Записан: /usr/src/redhat/RPMS/i686/postfix-2.2.8-1.2.i686.rpm Записан: /usr/src/redhat/RPMS/i686/postfix-pflogsumm-2.2.8-1.2.i686.rpm Выполняется(%clean): /bin/sh -e /var/tmp/rpm-tmp.52381 + umask 022 + cd /usr/src/redhat/BUILD + cd postfix-2.2.8 + /bin/rm -rf /var/tmp/postfix-buildroot + exit 0

Все пакет у нас собран, теперь необходимо установить его и радоваться жизни.

# rpm -ivh /usr/src/redhat/RPMS/i686/postfix-2.2.8-1.2.i686.rpm Подготовка... ########################################### 1:postfix ###########################################

Для лучшего понимания рассмотрим сборку squid, который имеет более стандартную структуру spec файла. Как всегда для начала устанавливаем src.rpm, при этом не забываем проверить размер и контрольную сумму.

# rpm -ivh squid-2.5.STABLE11-2.src.rpm 1:squid ###########################################

Узнать все возможные ключи можно следующим образом.

# cd /usr/src/redhat/SPECS # rpmbuild --bp squid.spec # cd ../BUILD/squid-2.5.STABLE11/ # ./configure --help Usage: configure Options: Configuration: --cache-file=FILE cache test results in FILE --help print this message --no-create do not create output files --quiet, --silent do not print `checking..." messages --site-file=FILE use FILE as the site file --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX --bindir=DIR user executables in DIR --sbindir=DIR system admin executables in DIR --libexecdir=DIR program executables in DIR --datadir=DIR read-only architecture-independent data in DIR --sysconfdir=DIR read-only single-machine data in DIR --sharedstatedir=DIR modifiable architecture-independent data in DIR --localstatedir=DIR modifiable single-machine data in DIR --libdir=DIR object code libraries in DIR --includedir=DIR C header files in DIR --oldincludedir=DIR C header files for non-gcc in DIR --infodir=DIR info documentation in DIR --mandir=DIR man documentation in DIR --srcdir=DIR find the sources in DIR --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names Host type: --build=BUILD configure for building on BUILD --host=HOST configure for HOST --target=TARGET configure for TARGET Features and packages: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE --with-PACKAGE[=ARG] use PACKAGE --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR --enable and --with options recognized: --disable-dependency-tracking Speeds up one-time builds --enable-dependency-tracking Do not reject slow dependency extractors --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-dlmalloc[=LIB] Compile & use the malloc package by Doug Lea --enable-gnuregex Compile GNUregex. Unless you have reason to use this option, you should not enable it. This library file is usually only required on Windows and very old Unix boxes which do not have their own regex library built in. --enable-xmalloc-statistics Show malloc statistics in status page --enable-carp Enable CARP support --enable-async-io[=N_THREADS] Shorthand for --with-aufs-threads=N_THREADS --with-pthreads --enable-storeio=ufs,aufs --with-aufs-threads=N_THREADS Tune the number of worker threads for the aufs object store. --with-pthreads Use POSIX Threads --with-aio Use POSIX AIO --with-dl Use dynamic linking --enable-storeio="list of modules" Build support for the list of store I/O modules. The default is only to build the ufs module. See src/fs for a list of available modules, or Programmers Guide section
for details on how to build your custom store module
--enable-heap-replacement
Backwards compatibility option. Please use the
new --enable-removal-policies directive instead.
--enable-removal-policies="list of policies"
Build support for the list of removal policies.
The default is only to build the lru module.
See src/repl for a list of available modules, or
Programmers Guide section 9.9 for details on how
to build your custom policy
--enable-icmp Enable ICMP pinging
--enable-delay-pools Enable delay pools to limit bandwidth usage
--enable-useragent-log Enable logging of User-Agent header
--enable-referer-log Enable logging of Referer header
--disable-wccp Disable Web Cache Coordination Protocol
--enable-kill-parent-hack
Kill parent on shutdown
--enable-snmp Enable SNMP monitoring
--enable-cachemgr-hostname[=hostname]
Make cachemgr.cgi default to this host
--enable-arp-acl Enable use of ARP ACL lists (ether address)
--enable-htcp Enable HTCP protocol
--enable-ssl Enable ssl gatewaying support using OpenSSL
--with-openssl[=prefix]
Compile with the OpenSSL libraries. The path to
the OpenSSL development libraries and headers
installation can be specified if outside of the
system standard directories
--enable-forw-via-db Enable Forw/Via database
--enable-cache-digests Use Cache Digests
see http://www.squid-cache.org/FAQ/FAQ-16.html
--enable-default-err-language=lang
Select default language for Error pages (see
errors directory)
--enable-err-languages="lang1 lang2.."
Select languages to be installed. (All will be
installed by default)
--with-coss-membuf-size COSS membuf size (default 1048576 bytes)
--enable-poll Enable poll() instead of select(). Normally poll
is preferred over select, but configure knows poll
is broken on some platforms. If you think you are
smarter than the configure script, you may enable
poll with this option.
--disable-poll Disable the use of poll().
--disable-http-violations
This allows you to remove code which is known to
violate the HTTP protocol specification.
--enable-ipf-transparent
using IP-Filter network address redirection.
--enable-pf-transparent
Enable Transparent Proxy support for systems
using PF network address redirection.
--enable-linux-netfilter
Enable Transparent Proxy support for Linux 2.4.
--with-large-files Enable support for large files (logs etc).
--enable-large-cache-files
Enable support for large cache files (>2GB).
WARNING: on-disk cache format is changed by this option
--with-build-environment=model
The build environment to use. Normally one of
POSIX_V6_ILP32_OFF32 32 bits
POSIX_V6_ILP32_OFFBIG 32 bits with large file support
POSIX_V6_LP64_OFF64 64 bits
POSIX_V6_LPBIG_OFFBIG large pointers and files
XBS5_ILP32_OFF32 32 bits (legacy)
XBS5_ILP32_OFFBIG 32 bits with large file suppor
XBS5_LP64_OFF64 64 bits (legacy)
XBS5_LPBIG_OFFBIG large pointers and files
default The default for your OS
--enable-leakfinder
Enable Leak Finding code. Enabling this alone
does nothing; you also have to modify the source
code to use the leak finding functions. Probably
Useful for hackers only.
--disable-ident-lookups
This allows you to remove code that performs
Ident (RFC 931) lookups.
--disable-internal-dns This prevents Squid from directly sending and
receiving DNS messages, and instead enables the
old external "dnsserver" processes.
--enable-truncate This uses truncate() instead of unlink() when
removing cache files. Truncate gives a little
performance improvement, but may cause problems
when used with async I/O. Truncate uses more
filesystem inodes than unlink..
--disable-hostname-checks
Squid by default rejects any host names with
odd characters in their name to conform with
internet standards. If you disagree with this
you may use this switch to turn off any such
checks, provided that the resolver used by
Squid does not reject such host names.. This
may be required to participate in testbeds for
international domain names.
--enable-underscores Squid by default rejects any host names with _
in their name to conform with internet standards.
If you disagree with this you may allow _ in
hostnames by using this switch, provided that
the resolver library on the host where Squid runs
does not reject _ in hostnames...
--enable-auth="list of auth scheme modules"
Build support for the list of authentication schemes.
The default is to build support for the Basic scheme.
See src/auth for a list of available modules, or
Programmers Guide section authentication schemes
for details on how to build your custom auth scheme
module
--enable-auth-modules="list of helpers"
Backwards compatibility alias for
--enable-basic-auth-helpers
--enable-basic-auth-helpers="list of helpers"
This option selects which basic scheme proxy_auth
helpers to build and install as part of the normal
build process. For a list of available
helpers see the helpers/basic_auth directory.
--enable-ntlm-auth-helpers="list of helpers"
This option selects which proxy_auth ntlm helpers
to build and install as part of the normal build
process. For a list of available helpers see
the helpers/ntlm_auth directory.
--enable-digest-auth-helpers="list of helpers"
This option selects which digest scheme authentication
helpers to build and install as part of the normal build
helpers/digest_auth directory.
--enable-ntlm-fail-open Enable NTLM fail open, where a helper that fails
one of the Authentication steps can allow squid to
still authenticate the user.
--enable-external-acl-helpers="list of helpers"
This option selects which external_acl helpers to
build and install as part of the normal build
process. For a list of available helpers see the
helpers/external_acl directory.
--with-samba-sources=/path/to/samba-source-tree
Path where the correct Samba source files can be
found while building winbind helpers. (defaults to
use internal copies of the headers from Samba-2.2.7)

Disable-unlinkd Do not use unlinkd
--enable-stacktraces Enable automatic call backtrace on fatal errors
--enable-x-accelerator-vary
Enable support for the X-Accelerator-Vary
HTTP header. Can be used to indicate
variance within an accelerator setup.
Typically used together with other code
that adds custom HTTP headers to the requests.
--with-maxfd=N Override maximum number of filedescriptors. Useful
if you build as another user who is not privileged
to use the number of filedescriptors you want the
resulting binary to support

После того, как вы нашли необходимый ключ, добавляем его в %configure. Например, мы хотим собрать squid с поддержкой ssl. Из помощи мы определили, что для этого, необходимо добавить два ключа --enable-ssl и --with-openssl. Вносим соответствующие изменения

Сохраняем файл и начинаем сборку.

# rpmbuild -ba --target=athlon squid.spec Платформы для сборки: athlon Сборка для платформы athlon Выполняется(%prep): /bin/sh -e /var/tmp/rpm-tmp.59199 + umask 022 + cd /usr/src/redhat/BUILD + cd /usr/src/redhat/BUILD + rm -rf squid-2.5.STABLE11 + /usr/bin/bzip2 -dc /usr/src/redhat/SOURCES/squid-2.5.STABLE11.tar.bz2 ... ... ... SSL gatewaying using OpenSSL enabled
Using OpenSSL MD5 implementation
... ... ... Записан: /usr/src/redhat/SRPMS/squid-2.5.STABLE11-2.src.rpm Записан: /usr/src/redhat/RPMS/athlon/squid-2.5.STABLE11-2.athlon.rpm Выполняется(%clean): /bin/sh -e /var/tmp/rpm-tmp.7322 + umask 022 + cd /usr/src/redhat/BUILD + cd squid-2.5.STABLE11 + rm -rf /var/tmp/squid-2.5.STABLE11-root + exit 0 Выполняется(--clean): /bin/sh -e /var/tmp/rpm-tmp.7322 + umask 022 + cd /usr/src/redhat/BUILD + rm -rf squid-2.5.STABLE11 + exit 0

Все squid у нас собран успешно, теперь осталось только установить или обновить его.

В данной статье будет подробно описан процесс создание rpm пакетов и организация репозитория. Прошу всех, кому интересна данная тема, пройти под кат.


Я взялся писать крайне подробно, так что Вы можете пролистать очевидные для Вас вещи.

  • Установка системы
  • Преднастройка
  • Подготовка площадки сборки
  • Собираем Tmux
  • Собираем fbida
  • Настройка доступа по ftp
  • Заключение

Установка системы

Театр начинается с вешалки

Наш сервис начинается с момента установки на него операционной системы. Естественно, что для сборки rpm пакетов мы выбираем rhel дистрибутив. В данном случае, был выбран CentOS 7 .

Скачать CentOS

Создадим директорию, где будет лежать образ и перейдем в нее:


mkdir ~/centos && cd $_

wget https://mirror.yandex.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1708.iso wget https://mirror.yandex.ru/centos/7/isos/x86_64/sha256sum.txt.asc

или посредством torrent`а с помощью программы aria2 , которую для начала установим:


sudo yum install -y epel-release sudo yum install -y aria2 aria2c https://mirror.yandex.ru/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1708.torrent cd ~/centos/CentOS-7-x86_64-Everything-1708

Проверить образ

Скачать образ мало, нужно проверить его целостность и достоверность, что мы и сделаем.


Скачаем ключ для CentOS 7:


wget http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-7

Посмотрим на ключ и импортируем его:


gpg --quiet --with-fingerprint RPM-GPG-KEY-CentOS-7 pub 4096R/F4A80EB5 2014-06-23 CentOS-7 Key (CentOS 7 Official Signing Key) Key fingerprint = 6341 AB27 53D7 8A78 A7C2 7BB1 24C6 A8A7 F4A8 0EB5 gpg --import RPM-GPG-KEY-CentOS-7 gpg: key F4A80EB5: public key "CentOS-7 Key (CentOS 7 Official Signing Key) " imported gpg: Total number processed: 1 gpg: imported: 1 (RSA: 1)

Проверим подпись файла, с контрольной суммой образа:


gpg --verify sha256sum.txt.asc 2>&1 | grep "Good signature" gpg: Good signature from "CentOS-7 Key (CentOS 7 Official Signing Key) "

Как мы видим - все отлично и теперь можем проверить сам образ на целостность:


sha256sum -c sha256sum.txt.asc 2>&1 | grep OK CentOS-7-x86_64-Everything-1708.iso: OK

Запись образа на носитель

После того как мы убедились в целостности образа и его достоверности, неплохо было бы его уже записать и установить! Так сделаем это, но вначале определимся, на что записывать будем.

Запись образа на диск

Для записи данного образа, нам понадобится двухсторонний DVD. Допустим мы его нашли и записываем, установив предварительно wodim:


sudo yum install -y wodim sudo wodim dev=/dev/cdrom -eject -v CentOS-7-x86_64-Everything-1708.iso

Запись образа на флешку

Двухсторонний DVD это как то архаично, так что возьмем флешку на 16 гб и запишем образ на нее, но прежде /dev/sda тут - это флешка, а у Вас она может быть другой. Смотри команду fdisk:


sudo dd if=CentOS-7-x86_64-Everything-1708.iso of=/dev/sda bs=1M status=progress; sync eject /dev/sda

Если status=progress не поддерживается, то по старинке:


watch -n 10 "sudo kill -USR1 $(pgrep ^dd)"

или вот так:


watch -n 10 "sudo pkill -usr1 dd"

а можно воспользоваться pv:


sudo yum install -y epel-release sudo yum install -y pv sudo su dd if=CentOS-7-x86_64-Everything-1708.iso | pv | dd of=/dev/sda

Установка

Как поставить Centos 7, решать Вам, тут и за RAID подумать можно и за LVM и много чего еще,
я ставил минимальный пакет.


Процесс установки можно посмотреть в этом ролике .

Преднастройка

После установки системы, нам необходимо настроить наш сервер.

Обновление и установка пакетов

В начале мы обновим все установленные пакеты, далее установим репозиторий epel, в котором есть много что полезного для нас:


sudo yum update -y sudo yum install -y epel-release

Следующим шагом установим группу пакетов, которые понадобятся нам для сборки, а так же ряд пакетов необходимые для развёртывания репозитория.


sudo yum groupinstall -y "Development Tools" sudo yum install -y glibc-static tree wget vim createrepo sudo yum install -y httpd httpd-devel mod_ssl python2-certbot-apache vsftpd

SSH

Для того чтобы комфортно и безопасно управлять сервером настроим SSH.


Безопаснее пользоваться ключами, по этому мы и создадим себе ключи для доступа к серверу на своем рабочем компьютере:


ssh-keygen

и добавим ключ на сервер:


ssh-copy-id chelaxe@rpmbuild

или ручками:


mkdir ~/.ssh chmod 700 ~/.ssh vim ~/.ssh/authorized_keys ssh-rsa AAAA...tzU= ChelAxe (D.F.H.) chmod 600 ~/.ssh/authorized_keys

Необходимо еще закрутить гайки в самой службе. Создадим копию файла конфигурации и приступим к редактированию:


sudo cp /etc/ssh/sshd_config{,.bak} sudo vim /etc/ssh/sshd_config

В файле стоит добавить/изменить/раскомментировать следующие строки:


# Слушать будем на интерфейсе с адресом 192.168.0.2 ListenAddress 192.168.0.2 # Для авторизации хватит и 30 секунд LoginGraceTime 30 # Запретим подключение root пользователю PermitRootLogin no # Три неудачных попытки хватит MaxAuthTries 3 # Запретить авторизацию по паролю PasswordAuthentication no # Через 10 минут простоя разорвем сессию ClientAliveInterval 600 ClientAliveCountMax 0 # Разрешим вход только пользователю chelaxe AllowUsers chelaxe # Разрешим вход только пользователям из группы chelaxe AllowGroups chelaxe # Заставить sshd работать только с протоколом SSH2 Protocol 2

Перезапускаем службу:


sudo systemctl restart sshd

Межсетевой экран

Важно ограничить доступ к нашему серверу. По этой причине настроим межсетевой экран:


sudo firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client sudo firewall-cmd --permanent --zone=public --remove-service=ssh sudo firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.0.0/28" service name="ssh" accept" sudo firewall-cmd --permanent --zone=public --add-service=http sudo firewall-cmd --permanent --zone=public --add-service=https sudo firewall-cmd --permanent --zone=public --add-service=ftp sudo firewall-cmd --permanent --list-all public target: default icmp-block-inversion: no interfaces: sources: services: http https ftp ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: rule family="ipv4" source address="192.168.0.0/28" service name="ssh" accept sudo firewall-cmd --reload

Подготовка площадки сборки

Подготовим саму площадку для сборки. Стоит отметить, что вернее всего сборку производить на отдельном виртуальном хосте, активно используя технологию snapshot"ов, но тут я опишу все в едином целом. Так же для сборки нужно выделить отдельного пользователя, не являющемся администратором (т.е. sudo ему недоступно).

Создание директорий

Создаем необходимые директории:


mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} sudo mkdir /var/www/repo sudo chown -R chelaxe:chelaxe /var/www/repo ln -s /var/www/repo ~/rpmbuild/REPO tree ~/rpmbuild/ /home/chelaxe/rpmbuild/ ├── BUILD ├── BUILDROOT ├── REPO -> /var/www/repo ├── RPMS ├── SOURCES ├── SPECS └── SRPMS 7 directories, 0 files

Настройка PGP подписи

Наши пакеты, которые мы соберем, необходимо подписать, что будет обеспечивать целостность и достоверность.


Ключ будем использовать свой или если его нет, то создадим. Создавать ключ стоит на своем рабочем компьютере.


Создадим ключ, если его у нас нет:


gpg --gen-key

Нас попросят ответить на ряд вопросов:
тип ключа, выбираем (1) RSA and RSA (default), размер ключа: 4096, срок действия: 6m, наше имя: Alexander F. Mikhaylov, Email: [email protected], комментарий, тут можно указать для чего нам ключ: repo и ждем...


Если вдруг после ответов на все вопросы получим это gpg: cancelled by user , то запускаем команду:


script /dev/null

и повторяем.


Посмотреть ключ:


gpg --fingerprint [email protected] pub 2048R/E6D53D4D 2014-05-07 Key fingerprint = EE2A FF9A 2BE3 318E 9346 A675 8440 3961 E6D5 3D4D uid ChelAxe (D.F.H.)

Сохраняем наш приватный ключ:


gpg --export-secret-keys --armor [email protected] > chelaxe-privkey.asc

Создадим ключ для отзыва:


gpg --output chelaxe-revoke.asc --gen-revoke [email protected]

Экспорт открытого ключа на keyserver:


gpg --keyserver pgp.mit.edu --send-keys E6D53D4D

Теперь ключ можно и импортировать на наш сервер:


gpg --import ~/chelaxe-privkey.asc rm -rf ~/chelaxe-privkey.asc

Смотрим где находится gpg утилита:


which gpg /usr/bin/gpg

и настроем файл для подписи пакетов:


vim ~/.rpmmacros %_signature gpg %_gpg_path /home/chelaxe/.gnupg %_gpg_name ChelAxe %_gpgbin /usr/bin/gpg

Создаем репозиторий

Теперь организуем сам репозиторий.


Создадим директорию, где будем хранить пакеты:


mkdir ~/rpmbuild/REPO/Packages

Экспортируем ключ в репозиторий:


gpg --export -a "ChelAxe" > ~/rpmbuild/REPO/RPM-GPG-KEY-chelaxe

Создаем сам репозиторий и подписываем метаданные:


createrepo ~/rpmbuild/REPO

Пакет для репозитория

Собираем пакет для автоматической установки репозитория в систему.


cd ~/rpmbuild/SOURCES mkdir chelaxe-release && cd $_

Файл репозитория для yum:


vim ~/rpmbuild/SOURCES/chelaxe-release/chelaxe.repo name=ChelAxe Official Repository - $basearch baseurl=https://repo.chelaxe.ru/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-chelaxe

Экспортируем ключ для пакета:


gpg --export -a "ChelAxe" > ~/rpmbuild/SOURCES/chelaxe-release/RPM-GPG-KEY-chelaxe

Собираем все в архив:


cd ~/rpmbuild/SOURCES tar -czf chelaxe-release.tar.gz chelaxe-release/

Создаем SPECS файл для пакета:


cd ~/rpmbuild/SPECS vim ~/rpmbuild/SPECS/chelaxe-release.spec Name: chelaxe-release Version: 1.0 Release: 1%{?dist} Summary: ChelAxe repository configuration Vendor: D.F.H. Packager: ChelAxe Group: System Environment/Base License: GPL URL: https://repo.chelaxe.ru Source0: https://repo.chelaxe.ru/%{name}.tar.gz BuildArch: noarch %description This package contains the ChelAxe official repository GPG key as well as configuration for yum. %prep %setup -q -n %{name} %install %__rm -rf %{buildroot} install -d -m 755 %{buildroot}%{_sysconfdir}/yum.repos.d install -p -m 644 chelaxe.repo %{buildroot}%{_sysconfdir}/yum.repos.d/chelaxe.repo install -d -m 755 %{buildroot}%{_sysconfdir}/pki/rpm-gpg install -p -m 644 RPM-GPG-KEY-chelaxe %{buildroot}%{_sysconfdir}/pki/rpm-gpg/RPM-GPG-KEY-chelaxe %post rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-chelaxe %clean %__rm -rf %{buildroot} %files %defattr(-,root,root,-) %{_sysconfdir}/yum.repos.d/chelaxe.repo %{_sysconfdir}/pki/rpm-gpg/RPM-GPG-KEY-chelaxe %changelog * Tue May 1 2018 ChelAxe (D.F.H.) - 1.0-1%{?dist} - Initial package.

Собираем пакет:


rpmbuild -ba --sign ~/rpmbuild/SPECS/chelaxe-release.spec

На этом этапе нас спросят пароль от нашего PGP ключа.


Копируем созданный пакет в репозиторий и обновляем его:


cp ~/rpmbuild/RPMS/noarch/chelaxe-release-1.0-1.el7.centos.noarch.rpm ~/rpmbuild/REPO/ createrepo --update ~/rpmbuild/REPO

gpg --detach-sign --armor ~/rpmbuild/REPO/repodata/repomd.xml

Теперь установим наш репозиторий в систему:


sudo yum install -y ~/rpmbuild/REPO/chelaxe-release-1.0-1.el7.centos.noarch.rpm

В дальнейшем данный пакет будет доступен по адресу: https://repo.chelaxe.ru/chelaxe-release-1.0-1.el7.centos.noarch.rpm


После установки должен появиться репозиторий chelaxe и PGP ключ:


rpm -q gpg-pubkey --qf "%{name}-%{version}-%{release} --> %{summary}\n" | grep ChelAxe gpg-pubkey-e6d53d4d-5369c520 --> gpg(ChelAxe (D.F.H.) )

Самое важное тут это SPEC файлы, расписывать о них не стану, но предоставлю ряд ссылок:

и одна полезная команда:


rpm --showrc

она отобразит готовые макросы для сборки.

Собираем Tmux

Теперь соберем, для примера, что нибудь полезное. Собирать будем tmux - терминальный мультиплексор, без которого работать мне не комфортно. Стоит отметить tmux есть в base репозитории CentOS 7, но версия там 1.8, а мы соберем 2.7. Так же у пакета из base репозитория есть зависимость libevent, мы же соберем tmux со статическими библиотеками последних версий.

Готовим исходники

Скачиваем исходники tmux и необходимых библиотек:


cd ~/rpmbuild/SOURCES wget https://github.com/tmux/tmux/releases/download/2.7/tmux-2.7.tar.gz wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz wget https://github.com/libevent/libevent/releases/download/release-2.1.8-stable/libevent-2.1.8-stable.tar.gz.asc wget ftp://ftp.gnu.org/gnu/ncurses/ncurses-6.1.tar.gz wget ftp://ftp.gnu.org/gnu/ncurses/ncurses-6.1.tar.gz.sig

gpg --recv-keys 8EF8686D gpg --recv-keys F7E48EDB

Проверяем файлы:


gpg --verify libevent-2.1.8-stable.tar.gz.asc libevent-2.1.8-stable.tar.gz 2>&1 | grep "Good signature" gpg: Good signature from "Azat Khuzhin " gpg --verify ncurses-6.1.tar.gz.sig ncurses-6.1.tar.gz 2>&1 | grep "Good signature" gpg: Good signature from "Thomas Dickey "

Подготовим файл конфигурации tmux:


vim ~/rpmbuild/SOURCES/tmux.conf # Доступные параметры сервера: # Количество буферов set-option -g buffer-limit 50 # Массив пользовательских псевдонимов для команд set-option -g command-alias zoom="resize-pane -Z" # Терминал по умолчанию set-option -g default-terminal "screen-256color" # Ожидание после ввода escape set-option -g escape-time 500 # Отключать сервер без активности set-option -g exit-empty off # Отключать сервер без клиентов set-option -g exit-unattached off # Запрос фокусировки у терминала set-option -g focus-events off # Файл в котором хранится история команд set-option -g history-file ~/.tmux_history # Количество сообщений в журнале для каждого клиента set-option -g message-limit 100 # Устанавливать содержимое терминального буфера обмена с помощью escape set-option -g set-clipboard on # Массив описаний терминалов set-option -g terminal-overrides "xterm:colors=256" set-option -g terminal-overrides "xterm*:colors=256" set-option -g terminal-overrides "screen:colors=256" set-option -g terminal-overrides "screen*:colors=256" # Пользовательские сочетания клавиш # set-option -g user-keys "\e#{?session_many_attached,*,} #{version} # # " # Размер левой части строки состояния set-option -g status-left-length 20 # Стиль левой части строки состояния # Заменяет параметры: status-left-attr status-left-bg status-left-fg set-option -g status-left-style "default" # Позиция строки состояния set-option -g status-position bottom # Формат правой части строки состояния set-option -g status-right " # # %a %d %b %Y %H:%M:%S [%V/%j] " # Размер правой части строки состояния set-option -g status-right-length 40 # Стиль правой части строки состояния # Заменяет параметры: status-right-attr status-right-bg status-right-fg set-option -g status-right-style "default" # Стиль строки состояния # Заменяет параметры: status-attr status-bg status-fg set-option -g status-style "bg=green,fg=black" # Массив переменных окружения которые необходимо обновлять set-option -g update-environment "TERMINFO" # Массив пользовательских клавиш # set-option -g user-keys "\e,#{pane_current_command}}#{?pane_dead,,}" # Цвет отображения времени set-option -gw clock-mode-colour "green" # Формат отображения времени set-option -gw clock-mode-style 24 # Предотвращение изменениея размера окна до высоты set-option -gw force-height 0 # Предотвращение изменениея размера окна до ширины set-option -gw force-width 0 # Высота основной панели set-option -gw main-pane-height 24 # Ширина основной панели set-option -gw main-pane-width 80 # Стиль сочетаний клавиш в режиме копирования set-option -gw mode-keys vi # Стиль окона в режиме копирования # Заменяет параметры: mode-attr mode-bg mode-fg set-option -gw mode-style "bg=yellow,fg=black" # Мониторинг активности в окне set-option -gw monitor-activity on # Мониторинг "звонка" в окне set-option -gw monitor-bell on # Мониторинг "тишины" в окне. Время срабатывания. set-option -gw monitor-silence 0 # Высота других панелей set-option -gw other-pane-height 0 # Ширина других панелей set-option -gw other-pane-width 0 # Стиль рамки активной панели # Заменяет параметры: pane-active-border-attr pane-active-border-bg pane-active-border-fg set-option -gw pane-active-border-style "fg=green" # Начало нумерации панелей set-option -gw pane-base-index 1 # Формат строк состояния панелей set-option -gw pane-border-format "#{?pane_active,#,}#{?window_zoomed_flag,#,} #{pane_index}:#{=6:pane_current_command} #" # Положение строк состояния панелей set-option -gw pane-border-status top # Стиль рамки панели # Заменяет параметры: pane-border-attr pane-border-bg pane-border-fg set-option -gw pane-border-style "fg=green" # Не уничтожать окно по завершению программы set-option -gw remain-on-exit off # Синхронизация панелей на ввод с клавиатуры set-option -gw synchronize-panes off # Стиль активной панели set-option -gw window-active-style "default" # Стиль вкладки окна с активностью в строке состояния # Заменяет параметры: window-status-activity-attr window-status-activity-bg window-status-activity-fg set-option -gw window-status-activity-style "fg=red" # Стиль вкладки окна с "звуком" в строке состояния # Заменяет параметры: window-status-bell-attr window-status-bell-bg window-status-bell-fg set-option -gw window-status-bell-style "fg=red" # Формат вкладки текущего окна в строке состояния set-option -gw window-status-current-format " #{window_index}:#{window_name} " # Стиль вкладки текущего окна в строке состояния # Заменяет параметры: window-status-current-attr window-status-current-bg window-status-current-fg set-option -gw window-status-current-style "reverse" # Формат вкладок окон в строке состояния set-option -gw window-status-format " #{window_index}:#{window_name}#{?window_activity_flag,#,}#{?window_bell_flag,!,}#{?window_silence_flag,~,} " # Стиль вкладки предыдущего окна в строке состояния # Заменяет параметры: window-status-last-attr window-status-last-bg window-status-last-fg set-option -gw window-status-last-style "default" # Строка разделяющая вкладки окон в строке состояния set-option -gw window-status-separator "" # Стиль вкладок окон в строке состояния set-option -gw window-status-style "default" # Стиль панелей set-option -gw window-style "default" # Поиск внутри панели set-option -gw wrap-search on # Генерировать сочетания клавиш set-option -gw xterm-keys on # Настройк сочетаний клавиш # Выбор панелей по Alt + стрелки bind-key -rT root M-Up select-pane -U bind-key -rT root M-Down select-pane -D bind-key -rT root M-Left select-pane -L bind-key -rT root M-Right select-pane -R # Переход в режим копирования bind-key -T root M-PageUp copy-mode -eu # Включение синхронизации ввода с клавиатуры bind-key -T prefix M-s set-option -gw synchronize-panes\; display-message "Синхронизация ввода: #{?synchronize-panes,on,off}" # Блокировка сеанса bind-key -T prefix M-l lock-session # Обновление конфигурации bind-key -T prefix M-r source-file /etc/tmux.conf\; display-message "Обновление конфигурации" # Редактирование конфигурации # bind-key -T prefix M-e # Настройка сеанса # Создать сеанс new-session -s "work"

Готовим SPEC файл

Этот файл будет интереснее предыдущего SPEC файла:


cd ~/rpmbuild/SPECS vim ~/rpmbuild/SPECS/tmux.spec %define libevent 2.1.8 %define ncurses 6.1 Name: tmux Version: 2.7 Release: 1%{?dist} Summary: A terminal multiplexer Vendor: D.F.H. Packager: ChelAxe Group: Applications/System License: ISC and BSD URL: https://github.com/%{name}/%{name} Source0: https://github.com/%{name}/%{name}/releases/download/%{version}/%{name}-%{version}.tar.gz Source1: https://github.com/libevent/libevent/releases/download/release-%{libevent}-stable/libevent-%{libevent}-stable.tar.gz Source2: ftp://ftp.gnu.org/gnu/ncurses/ncurses-%{ncurses}.tar.gz Source3: tmux.conf BuildRequires: gcc, gcc-c++, make, glibc-static %description tmux is a "terminal multiplexer", it enables a number of terminals (or windows) to be accessed and controlled from a single terminal. tmux is intended to be a simple, modern, BSD-licensed alternative to programs such as GNU screen. %prep %setup -q -a1 -a2 %build %__mkdir "libs" pushd "libevent-%{libevent}-stable" %_configure \ --prefix="$(pwd)/../libs" \ --disable-shared %__make install popd pushd "ncurses-%{ncurses}" %_configure \ --prefix="$(pwd)/../libs" \ --with-default-terminfo-dir="/usr/share/terminfo" \ --with-terminfo-dirs="/etc/terminfo:/lib/terminfo:/usr/share/terminfo:$HOME/.terminfo" %__make install popd %_configure \ --enable-static \ --prefix="/usr" \ CFLAGS="-Ilibs/include -Ilibs/include/ncurses" \ LDFLAGS="-Llibs/lib -Llibs/include -Llibs/include/ncurses" \ LIBEVENT_CFLAGS="-Ilibs/include" \ LIBEVENT_LIBS="-Llibs/lib -levent" \ LIBNCURSES_CFLAGS="-Ilibs/include" \ LIBNCURSES_LIBS="-Llibs/lib -lncurses" %__make %install %__rm -rf %{buildroot} %make_install install -d -m 755 %{buildroot}%{_sysconfdir} install -p -m 644 %{SOURCE3} %{buildroot}%{_sysconfdir}/tmux.conf %clean %__rm -rf %{buildroot} %files %defattr(-,root,root,-) %doc README TODO CHANGES example_tmux.conf %config(noreplace) %{_sysconfdir}/tmux.conf %{_bindir}/tmux %{_mandir}/man1/tmux.1.gz %changelog * Fri Jun 29 2018 ChelAxe (D.F.H.) - 2.7-1%{?dist} - Rebuild for new version tmux. * Tue May 1 2018 ChelAxe (D.F.H.) - 2.6-1%{?dist} - Initial package.

Сборка


rpmbuild -ba --sign ~/rpmbuild/SPECS/tmux.spec cp ~/rpmbuild/RPMS/x86_64/tmux-2.7-1.el7.centos.x86_64.rpm ~/rpmbuild/REPO/Packages/ createrepo --update ~/rpmbuild/REPO

Не забываем подписать метаданные:


gpg --detach-sign --armor ~/rpmbuild/REPO/repodata/repomd.xml

Смотри что и как получилось:


tree ~/rpmbuild/ -L 2 /home/chelaxe/rpmbuild/ ├── BUILD │ ├── chelaxe-release │ └── tmux-2.7 ├── BUILDROOT ├── REPO -> /var/www/repo ├── RPMS │ ├── noarch │ └── x86_64 ├── SOURCES │ ├── chelaxe-release │ ├── chelaxe-release.tar.gz │ ├── libevent-2.1.8-stable.tar.gz │ ├── libevent-2.1.8-stable.tar.gz.asc │ ├── ncurses-6.1.tar.gz │ ├── ncurses-6.1.tar.gz.sig │ ├── tmux-2.7.tar.gz │ └── tmux.conf ├── SPECS │ ├── chelaxe-release.spec │ └── tmux.spec └── SRPMS ├── chelaxe-release-1.0-1.el7.centos.src.rpm └── tmux-2.7-1.el7.centos.src.rpm

Установка и запуск

Устанавливаем наш пакет:


sudo yum clean all sudo yum install -y tmux

Запускаем tmux и радуемся:


tmux attach-session

Собираем fbida

Собирать будем fbida - комплект приложений для просмотра изображений в консоли. Данный пакет не нашел под Centos 7.

Готовим исходники

Скачиваем исходники fbida:


cd ~/rpmbuild/SOURCES wget https://www.kraxel.org/releases/fbida/fbida-2.14.tar.gz wget https://www.kraxel.org/releases/fbida/fbida-2.14.tar.gz.asc

Экспортируем GPG ключи для проверки исходников:


gpg --recv-keys D3E87138

Проверяем файлы:


gpg --verify fbida-2.14.tar.gz.asc fbida-2.14.tar.gz 2>&1 | grep "Good signature" gpg: Good signature from "Gerd Hoffmann (work) "

Готовим SPEC файл

В этом SPEC файле будет больше зависимостей:


cd ~/rpmbuild/SPECS vim ~/rpmbuild/SPECS/fbida.spec Name: fbida Version: 2.14 Release: 1%{?dist} Summary: FrameBuffer Imageviewer Vendor: D.F.H. Packager: ChelAxe Group: Applications/Multimedia License: GPLv2+ URL: https://www.kraxel.org/blog/linux/fbida/ Source: https://www.kraxel.org/releases/fbida/fbida-%{version}.tar.gz BuildRequires: libexif-devel fontconfig-devel libjpeg-turbo-devel BuildRequires: libpng-devel libtiff-devel pkgconfig BuildRequires: giflib-devel libcurl-devel libXpm-devel BuildRequires: pixman-devel libepoxy-devel libdrm-devel BuildRequires: mesa-libEGL-devel poppler-devel poppler-glib-devel BuildRequires: freetype-devel mesa-libgbm-devel Requires: libexif fontconfig libjpeg-turbo Requires: libpng libtiff giflib Requires: libcurl libXpm pixman Requires: libepoxy libdrm mesa-libEGL Requires: poppler poppler-glib freetype Requires: mesa-libgbm ImageMagick dejavu-sans-mono-fonts %description fbi displays the specified file(s) on the linux console using the framebuffer device. PhotoCD, jpeg, ppm, gif, tiff, xwd, bmp and png are supported directly. For other formats fbi tries to use ImageMagick"s convert. %prep %setup -q %{__sed} -i -e "s,/X11R6,g" GNUmakefile %install %__rm -rf %{buildroot} %make_install PREFIX=/usr %clean %__rm -rf %{buildroot} %files %defattr(-,root,root,-) %doc Changes COPYING INSTALL README TODO VERSION %{_prefix}/* %changelog * Tue May 1 2018 ChelAxe (D.F.H.) - 2.14-1%{?dist} - Initial package.

Сборка

Собираем пакет и добавляем его в репозиторий:


sudo yum install -y libexif-devel fontconfig-devel libjpeg-turbo-devel libpng-devel libtiff-devel pkgconfig giflib-devel libcurl-devel libXpm-devel ImageMagick dejavu-sans-mono-fonts pixman-devel libepoxy-devel libdrm-devel mesa-libEGL-devel poppler-devel poppler-glib-devel mesa-libgbm-devel rpmbuild -ba --sign ~/rpmbuild/SPECS/fbida.spec cp ~/rpmbuild/RPMS/x86_64/fbida-2.14-1.el7.centos.x86_64.rpm ~/rpmbuild/REPO/Packages/ createrepo --update ~/rpmbuild/REPO

Не забываем подписать метаданные:


gpg --detach-sign --armor ~/rpmbuild/REPO/repodata/repomd.xml

Установка и запуск

Устанавливаем наш пакет:


sudo yum clean all sudo yum install -y fbida

Настройка доступа по http/https

Теперь обеспечим доступ к нашему репозиторию по http/https.

Настройка

Первым делом настроем наш Apache:


sudo mv /etc/httpd/conf.d/welcome{.conf,.bak} sudo cp /etc/httpd/conf/httpd{.conf,.bak}

sudo vim /etc/httpd/conf/httpd.conf # Слушать на определенном интерфейсе и порте Listen 192.168.0.2:80 # Email адрес и имя сервера ServerAdmin [email protected] ServerName repo.chelaxe.ru # Не светить версию Apache ServerSignature Off ServerTokens Prod sudo cp /etc/httpd/conf.d/ssl{.conf,.bak} sudo vim /etc/httpd/conf.d/ssl.conf # Слушать на определенном интерфейсе и порте Listen 192.168.0.2:443 https # OCSP (Online Certificate Status Protocol) SSLStaplingCache "shmcb:logs/stapling-cache(128000)"

Проверим конфигурацию:


sudo apachectl configtest Syntax OK

sudo systemctl start httpd sudo systemctl enable httpd

Настраиваем наш репозиторий:


# Создадим свой файл с параметрами Диффи-Хеллмана cd /etc/ssl/certs sudo openssl dhparam -out dhparam.pem 4096 # Готовим публичный ключ для HKPK (HTTP Public Key Pinning) sudo openssl x509 -noout -in /etc/pki/tls/certs/localhost.crt -pubkey | openssl asn1parse -noout -inform pem -out /tmp/public.key # Получаем отпечаток публичного ключа для HKPK (HTTP Public Key Pinning) openssl dgst -sha256 -binary /tmp/public.key | openssl enc -base64 aQxRkBUlhfQjidLUovOlxdZe/4ygObbDG7l+RgwzSWA= rm -rf /tmp/public.key

Настройка VirtualHost:


sudo vim /etc/httpd/conf.d/repo.conf ServerAdmin "[email protected]" ServerName "repo.chelaxe.ru" DocumentRoot "/var/www/repo" AllowOverride None Options Indexes SSLEngine on # HSTS (HTTP Strict Transport Security) Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" # HKPK (HTTP Public Key Pinning) Header set Public-Key-Pins "pin-sha256=\"aQxRkBUlhfQjidLUovOlxdZe/4ygObbDG7l+RgwzSWA=\"; max-age=2592000; includeSubDomains" # Гнать поисковых роботов Header set X-Robots-Tag "none" # Защита от некоторых XSS-атак Header set X-XSS-Protection "1; mode=block" # Защита от кликджекинг-атак Header always append X-Frame-Options DENY # Защита от подмены MIME типов Header set X-Content-Type-Options nosniff # Защита от XSS-атак Header set Content-Security-Policy "default-src "self";" # OCSP (Online Certificate Status Protocol) SSLUseStapling on # Отключаем сжатие SSL (защита от атаки CRIME) SSLCompression off # Отключаем SSLv2 и SSLv3 SSLProtocol all -SSLv2 -SSLv3 # Набор шифров SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH # Предпочтения сервера при согласовании шифров SSLHonorCipherOrder on # Используем свой файл с параметрами Диффи-Хеллмана # cat /etc/ssl/certs/dhparam.pem >> /etc/pki/tls/certs/localhost.crt # для 2.4.8 и старше # SSLOpenSSLConfCmd DHParameters "/etc/ssl/certs/dhparam.pem" SSLOptions +StrictRequire SSLCertificateFile "/etc/pki/tls/certs/localhost.crt" SSLCertificateKeyFile "/etc/pki/tls/private/localhost.key"

Т.к. в Centos 7 у нас Apache 2.4.6, а не 2.4.8, то параметры Диффи-Хеллмана необходимо вшить в сертификат:


sudo bash -c "cat /etc/ssl/certs/dhparam.pem >> /etc/pki/tls/certs/localhost.crt"

По этой же причине с HTTP/2 у нас ничего не получится, но теперь вы можете собрать сами свежий Apache и воспользоваться HTTP/2.



Сертификат от Let"s Encrypt

Пока у нас свой сертификат и это не красиво, так что получим сертификат от Let"s Encrypt:


sudo certbot --apache --agree-tos --email [email protected] -d repo.chelaxe.ru

При ответе на вопросы, выбираем использование rewrite для перенаправления всех на https. В результате в файле изменяться строки у VirtualHost для http:


RewriteEngine on RewriteCond %{SERVER_NAME} =repo.chelaxe.ru RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI}

и у VirtualHost для https:


Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /etc/letsencrypt/live/repo.chelaxe.ru/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/repo.chelaxe.ru/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/repo.chelaxe.ru/chain.pem

Строку Include /etc/letsencrypt/options-ssl-apache.conf закомментируем.


Тут стоит напомнить о необходимости добавить файл с параметрами Диффи-Хеллмана в конец сертификата:


sudo bash -c "cat /etc/ssl/certs/dhparam.pem >> /etc/letsencrypt/live/repo.chelaxe.ru/cert.pem"

И изменить заголовок HKPK (HTTP Public Key Pinning):


# Готовим публичный ключ для HKPK (HTTP Public Key Pinning) sudo openssl x509 -noout -in /etc/letsencrypt/live/repo.chelaxe.ru/cert.pem -pubkey | openssl asn1parse -noout -inform pem -out /tmp/public.key # Получаем отпечаток публичного ключа для HKPK (HTTP Public Key Pinning) openssl dgst -sha256 -binary /tmp/public.key | openssl enc -base64 aidlhfQjoxRkbvOlxdZLBUe/4ygOUDG7l+RgwzQbSWA= rm -rf /tmp/public.key

И изменим соответственно строку в конфигурации:


# HKPK (HTTP Public Key Pinning) Header set Public-Key-Pins "pin-sha256=\"aidlhfQjoxRkbvOlxdZLBUe/4ygOUDG7l+RgwzQbSWA=\"; max-age=2592000; includeSubDomains"

Проверим конфигурацию и перечитаем конфигурацию:


sudo apachectl configtest Syntax OK sudo systemctl reload httpd

Есть еще одна проблема. Для обновления сертификата добавим запись в крон:


sudo crontab -e SHELL=/bin/bash [email protected] @daily certbot renew >> /var/log/certbot-renew.log

Но этого не достаточно, нужно еще дописать автоматическое добавление файла с параметрами Диффи-Хеллмана и параметры HKPK (HTTP Public Key Pinning).

Файлы.htaccess

Настройка через.htaccess лучше избежать в данном случае, если Вы все же решили его использовать, то сделайте следующее:


sudo chown apache:apache ~/rpmbuild/REPO/.htaccess sudo chmod 600 ~/rpmbuild/REPO/.htaccess sudo chcon -R -t httpd_sys_content_t ~/rpmbuild/REPO/.htaccess

и AllowOverride смените на All . Так же добавьте:


IndexIgnore .htaccess

для исключения в отображении на сайте.


Для vsftpd можно использовать опции:


hide_file={.htaccess} deny_file={.htaccess}

А вообще смените стандартное имя.htaccess на другое с помощью параметра AccessFileName:


AccessFileName .acl

Тут можно используя модуль mod_autoindex Apache настроить внешний вид. Завернуть в noscript тег и используя html5, css3, javascript, jquery, bootstrap, backbone, awesome сделать конфетку, как это сделал я:



Вот что будет при использовании в браузере без поддержки javascript или с отключенным:



Сами файлы web интерфейса нужно будет скрыть как от vsftpd так и от демонстрации на сайте, делается аналогичными способами что и для сокрытия.htaccess файла.


Настроить внешний вид листинга через mod_autoindex или в nginx:

Настройка доступа по ftp

Запускаем службу и прописываем ее в автозапуск:


sudo systemctl start vsftpd sudo systemctl enable vsftpd

Настройка службы:


sudo cp /etc/vsftpd/vsftpd{.conf,.bak} sudo vim /etc/vsftpd/vsftpd.conf anonymous_enable=YES local_enable=NO write_enable=NO local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=NO pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES force_dot_files=NO anon_root=/var/www/repo no_anon_password=YES hide_ids=YES sudo usermod -d /var/www/repo ftp

Настроем SeLinux:


sudo semanage fcontext -a -t public_content_t "/var/www/repo(/.*)?" sudo restorecon -Rv "/var/www/repo"

Перезапустим службу:


sudo systemctl restart vsftpd

В случае использования.htaccess файла - продублируйте, чтобы файл был надежно защищен от доступа по ftp:


sudo chcon -R -t httpd_sys_content_t ~/rpmbuild/REPO/.htaccess

Заключение

Собственно на этом все. Надеюсь, данный мануал будет Вам полезен.

Иногда встречаются полезные программы, доступные только в виде исходных кодов (и/или в виде установочных пакетов для других ОС), но есть необходимость их установки на несколько компьютеров. Чтобы не выполнять компиляцию на каждом компьютере отдельно, можно на одном подготовить установочный пакет и установить его штатными средствами на других компьютерах.
Ниже приведён пример создания RPM пакета для Fedora 21 (для других версий Fedora процедура не отличается) из исходных текстов очень приятной и полезной программы Boomaga версии 0.7.0.

Готовим инструменты сборки RPM

Для начала я попытался установить необходимые инструменты (как мне посоветовала ):
sudo dnf install @development-tools но эта команда не выполнилась, ссылаясь на отсутствие группы development-tools. Тогда я установил всё другой командой, которую мне подсказала :
sudo dnf groupinstall "Development Tools" и ещё две команды из обеих вышеуказанных статей:
sudo dnf install rpmdevtools sudo dnf install fedora-packager Затем надо сгенерировать рабочее пространство для сборки RPM:
rpmdev-setuptree В результате этой команды создадутся необходимые каталоги в домашнем каталоге текущего пользователя (показываю содержимое нового каталога rpmbuild ):
$ ls ~/rpmbuild/ BUILD BUILDROOT RPMS SOURCES SPECS SRPMS В каталог SOURCES сразу перемещаю архив исходников (boomaga-0.7.0.tar.gz), как он есть. Кстати, тут есть небольшой подвох от github, - ссылка на закачку не даётся напрямую, а генерируется только после клика по ней. Из-за этого не получилось указать прямую ссылку на архив в интернете в SPEC файле, о котором пойдёт речь ниже.

Готовим SPEC файл

Для упаковки исходных текстов программы в RPM пакет нужен специальный файл с описанием необходимых действий. Сгенерируем шаблон:
rpmdev-newspec boomaga В результате этой команды будет создан файл boomaga.spec в каталоге ~/rpmbuild/SPEC. Тут важно название SPEC файла. Оно должно совпадать с названием программы (т.е. без номера версии). После автоматической генерации SPEC файла переходим к его редактированию. В моём случае это получилось так:
Name: boomaga Version: 0.7.0 Release: 1%{?dist} Summary: Boomaga is a virtual printer for viewing a document before printing License: GPLv2 and LGPLv2+ URL: http://boomaga.github.io Source0: %{name}-%{version}.tar.gz BuildRequires: cmake,cups-devel,poppler-devel,poppler-cpp-devel,qt5-qtbase-devel,qt5-qttools-devel,snappy-devel Requires: cups %description Boomaga (BOOklet MAnager) is a virtual printer for viewing a document before printing it out using the physical printer. The program is very simple to work with. Running any program, click “print” and select “Boomaga” to see in several seconds (CUPS takes some time to respond) the Boomaga window open. If you print out one more document, it gets added to the previous one, and you can also print them out as one. %prep %setup -q %build mkdir build cd build cmake .. %make_install %files %defattr(0755,root,root,-) /usr/lib/cups/backend/boomaga /usr/lib/cups/filter/boomaga_pstopdf /usr/local/bin/boomaga /usr/local/lib/boomaga/boomagabackend /usr/local/lib/boomaga/boomagamerger /usr/local/share/applications/boomaga.desktop /usr/local/share/boomaga/translations/boomaga_cs.qm /usr/local/share/boomaga/translations/boomaga_de.qm /usr/local/share/boomaga/translations/boomaga_el.qm /usr/local/share/boomaga/translations/boomaga_fr.qm /usr/local/share/boomaga/translations/boomaga_it.qm /usr/local/share/boomaga/translations/boomaga_lt.qm /usr/local/share/boomaga/translations/boomaga_pl_PL.qm /usr/local/share/boomaga/translations/boomaga_ru.qm /usr/local/share/boomaga/translations/[email protected] /usr/local/share/dbus-1/services/org.boomaga.service /usr/local/share/icons/hicolor/128x128/apps/boomaga.png /usr/local/share/icons/hicolor/16x16/apps/boomaga.png /usr/local/share/icons/hicolor/32x32/apps/boomaga.png /usr/local/share/icons/hicolor/64x64/apps/boomaga.png /usr/local/share/mime/packages/boomaga.xml /usr/share/ppd/boomaga/boomaga.ppd %attr(0644,root,root) %doc /usr/local/share/man/man1/boomaga.1.gz %changelog * Mon Jun 22 2015 Oleg - Всё, что идёт после знака процента является макросом (например, %build) или предопределённым значением (например, %{name}). Как сказано в документации Fedora , перечень и описание всех макросов можно найти в каталогах:
  • /etc/rpm/*
  • /usr/lib/rpm
  • /usr/lib/rpm/macros
Много полезной информации можно почерпнуть, выполнив команду
rpm --showrc Прокомментирую указанные значения.
Параметр Name должен совпадать с именем SPEC файла и названием программы (указывается без номера версии).
Параметр Source0 должен по-хорошему указывать на архив в интернете, который имеет такое же название, как и файл в каталоге ~/rpmbuild/SOURCES, но т.к. ссылки на boomaga-0.7.0.tar.gz в интернете я не нашёл, то указал локальную ссылку. Без пути. Только название файла и с использованием переменных (берутся из указанных выше одноимённых параметров).
Перед тем, как пытаться собрать RPM пакет, я пробовал скомпилировать программу обычным образом. Для этого понадобилось установить инструмент cmake и зависимости данной программы: cups-devel, poppler-devel, poppler-cpp-devel, qt5-qtbase-devel, qt5-qttools-devel, snappy-devel. Все эти пакеты я указал в параметре BuildRequires .
Т.к. boomaga может работать в роли виртуального принтера как прослойка между CUPS, то я указал cups в параметре Requires .
Далее идут макросы, которые будут выполняться при сборке RPM пакета.
После макроса %description делаем переход на новую строку и вставляем описание из родного сайта проекта.
Макрос %setup -q распаковывает исходные коды в каталог ~/rpmbuild/BUILD/%{name}-%{version}, т.е. в нашем случае - ~/rpmbuild/BUILD/boomaga-0.7.0
Далее начинается самое ответственное. Нужно описать всё для автоматической компиляции проекта. Я поступил так. Открыл официальную инструкцию по установке данного приложения и переделал под текущую ситуацию. Инструкция по установке оказалась весьма лаконичной и понятной:
mkdir ~/boomaga/build cd ~/boomaga/build cmake .. make && sudo make install В форме макросов в SPEC файле эти инструкции выразились так:
%build mkdir build cd build cmake .. %make_install Первый макрос %build отвечает за сборку исходников. В этой фазе создаём каталог build в текущем каталоге (т.е. в ~/rpmbuild/BUILD/boomaga-0.7.0) и перемещаемся в него. Потом запуск cmake для генерации Makefile. Т.е. всё то, что написано в инструкции по обычной установке данной программы.
Затем макрос %make_install собирёт всё каталоге в ~/rpmbuild/BUILDROOT/boomaga-0.7.0-1.fc21.R.x86_64 так, как если бы шла нормальная установка. Т.е. там создаётся каталог usr со всеми задействованными подкаталогами.
Операции макросов %files (тут нужно указать список всех файлов, входящих в RPM пакет) и %doc (вся документация) заполнил в соответствии с подсказками после первых неудачных запусков, - при сборке пакета выводилось сообщение:
Processing files: boomaga-debuginfo-0.7.0-1.fc21.R.x86_64 Проверка на неупакованный(е) файл(ы): /usr/lib/rpm/check-files /home/oleg/rpmbuild/BUILDROOT/boomaga-0.7.0-1.fc21.R.x86_64 ошибка: Обнаружен(ы) установленный(е) (но не упакованный(е)) файл(ы): /usr/lib/cups/backend/boomaga /usr/lib/cups/filter/boomaga_pstopdf /usr/local/bin/boomaga /usr/local/lib/boomaga/boomagabackend /usr/local/lib/boomaga/boomagamerger /usr/local/share/applications/boomaga.desktop /usr/local/share/boomaga/translations/boomaga_cs.qm /usr/local/share/boomaga/translations/boomaga_de.qm /usr/local/share/boomaga/translations/boomaga_el.qm /usr/local/share/boomaga/translations/boomaga_fr.qm /usr/local/share/boomaga/translations/boomaga_it.qm /usr/local/share/boomaga/translations/boomaga_lt.qm /usr/local/share/boomaga/translations/boomaga_pl_PL.qm /usr/local/share/boomaga/translations/boomaga_ru.qm /usr/local/share/boomaga/translations/[email protected] /usr/local/share/dbus-1/services/org.boomaga.service /usr/local/share/icons/hicolor/128x128/apps/boomaga.png /usr/local/share/icons/hicolor/16x16/apps/boomaga.png /usr/local/share/icons/hicolor/32x32/apps/boomaga.png /usr/local/share/icons/hicolor/64x64/apps/boomaga.png /usr/local/share/man/man1/boomaga.1.gz /usr/local/share/mime/packages/boomaga.xml /usr/share/ppd/boomaga/boomaga.ppd Ошибки сборки пакетов: Обнаружен(ы) установленный(е) (но не упакованный(е)) файл(ы): /usr/lib/cups/backend/boomaga /usr/lib/cups/filter/boomaga_pstopdf /usr/local/bin/boomaga /usr/local/lib/boomaga/boomagabackend /usr/local/lib/boomaga/boomagamerger /usr/local/share/applications/boomaga.desktop /usr/local/share/boomaga/translations/boomaga_cs.qm /usr/local/share/boomaga/translations/boomaga_de.qm /usr/local/share/boomaga/translations/boomaga_el.qm /usr/local/share/boomaga/translations/boomaga_fr.qm /usr/local/share/boomaga/translations/boomaga_it.qm /usr/local/share/boomaga/translations/boomaga_lt.qm /usr/local/share/boomaga/translations/boomaga_pl_PL.qm /usr/local/share/boomaga/translations/boomaga_ru.qm /usr/local/share/boomaga/translations/[email protected] /usr/local/share/dbus-1/services/org.boomaga.service /usr/local/share/icons/hicolor/128x128/apps/boomaga.png /usr/local/share/icons/hicolor/16x16/apps/boomaga.png /usr/local/share/icons/hicolor/32x32/apps/boomaga.png /usr/local/share/icons/hicolor/64x64/apps/boomaga.png /usr/local/share/man/man1/boomaga.1.gz /usr/local/share/mime/packages/boomaga.xml /usr/share/ppd/boomaga/boomaga.ppd В результате успешной сборки формируются RPM пакеты:
~/rpmbuild/RPMS/x86_64/boomaga-0.7.0-1.fc21.R.x86_64.rpm
~/rpmbuild/RPMS/x86_64/boomaga-debuginfo-0.7.0-1.fc21.R.x86_64.rpm
~/rpmbuild/SRPMS/boomaga-0.7.0-1.fc21.R.src.rpm
А вот, собственно, как запускать сборку:
rpmbuild --target=x86_64 -ba ~/rpmbuild/SPECS/boomaga.spec Команда отрабатывает за пару минут. В это время в консоли пролетают красивые разноцветные строчки.

Позже, когда дистрибутив Fedora обновится до следующей версии, можно будет попробовать перепаковать пакет boomaga-0.7.0-1.fc21.R.src.rpm такой командой:
rpmbuild --rebuild boomaga-0.7.0-1.fc21.R.src.rpm Теоретически это позволит сократить время сборки RPM пакета.
Для проверки SPEC файла и формируемого пакета можно перейти в каталог ~/rpmbuild/SPEC и воспользоваться командой:
rpmlint boomaga.spec ../SRPMS/boomaga* ../RPMS/*/boomaga* В результате будут показаны различные предупреждения и ошибки. В моём случае есть ошибки расположения файлов. Но для личного пользования подойдёт и так. Хотя с такими ошибками в официальные репозитории не пропустят.
Посмотреть описание ошибки можно, указав её название после ключа -I в следующей команде:
rpmlint -I hardcoded-library-path

Полезные ссылки

Различных параметров и макросов существует довольно много. В официальной документации Fedora есть исчерпывающие полезные и обширные материалы "How to create an RPM package " и "Packaging:Guidelines ". Также есть пример с пояснениями SPEC файла в материале "Annotated spec file ".

Делаем RPM лучше

Чтобы полученный RPM пакет не только выполнял свою функцию, но и делал это правильно, нужно избавиться от всех ошибок, на которые указывает rpmlint.

Основная ошибка состоит в том, что полученные файлы в системе устанавливаются не туда, куда положено. Во-первых, всё должно соответствовать стандарту Filesystem Hierarchy Standard , который недавно обновился . Во-вторых RPM пакет для Fedora должен соответствовать правилам этого дистрибутива.

Нужно избавиться от жёстко прописанных путей в секции %files. Для этого применяются макросы. В моём случае исходный код программы в нескольких местах имел жёстко прописанный путь в подкаталог lib, а для архитектуры x86_64 нужно было указывать lib64. Поэтому потребовалось немного подкорректировать исходный код программы .

В результате общения с разработчиками программы на github.com , SPEC файл пополнился также автоматическим прописыванием принтера в системе. Плюс программа Boomaga успела обновиться до версии 0.7.1. Результирующий SPEC файл:

Name: boomaga Version: 0.7.1 Release: 1%{?dist} Summary: A virtual printer for viewing a document before printing License: GPLv2 and LGPLv2+ URL: http://boomaga.github.io Source0: %{name}-%{version}.tar.gz BuildRequires: cmake,cups-devel,poppler-devel,poppler-cpp-devel,qt5-qtbase-devel,qt5-qttools-devel,snappy-devel Requires: cups,snappy %description Boomaga (BOOklet MAnager) is a virtual printer for viewing a document before printing it out using the physical printer. The program is very simple to work with. Running any program, click “print” and select “Boomaga” to see in several seconds (CUPS takes some time to respond) the Boomaga window open. If you print out one more document, it gets added to the previous one, and you can also print them out as one, and you can also print them out as one. Regardless of whether your printer supports duplex printing or not, you would be able to easily print on both sides of the sheet. If your printer does not support duplex printing, point this out in the settings, and Booklet would ask you to turn over the pages half way through printing your document. The program can also help you get your documents prepared a bit before printing. At this stage Boomaga makes it possible to: * Paste several documents together. * Print several pages on one sheet. * 1, 2, 4, 8 pages per sheet * Booklet. Folding the sheets in two, you’ll get a book. %prep %setup -q %build %ifarch x86_64 %cmake -DLIB_SUFFIX=64 -DCUPS_BACKEND_DIR=%{_libdir}/cups/backend -DCUPS_FILTER_DIR=%{_libdir}/cups/filter . %else %cmake -DCUPS_BACKEND_DIR=%{_libdir}/cups/backend -DCUPS_FILTER_DIR=%{_libdir}/cups/filter . %endif make %{?_smp_mflags} %install make install DESTDIR=%{buildroot} %__mkdir -p %{buildroot}%{_datadir}/%{name}/scripts %__install -m 755 scripts/installPrinter.sh %{buildroot}%{_datadir}/%{name}/scripts/ chmod +x %{buildroot}%{_datadir}/%{name}/scripts/installPrinter.sh # Add translation lang tags (cd %{buildroot} && find . -name "*.qm") | %__sed -e "s|^.||" | sed -e \ "s:\(.*/translations/boomaga_\)\(\+\)\(.*qm$\):%lang(\2) \1\2\3:"\ >> %{name}.lang %pre # Start cups if is stopped if [ "$(systemctl is-active cups.service)" != "active" ]; then systemctl start cups sleep 2 fi %post # Install the printer to cups backends if [ $1 = 1 ]; then sh %{_datadir}/%{name}/scripts/installPrinter.sh fi %preun # Uninstall the printer lpadmin -x "Boomaga" %files %defattr(755,root,root,-) %{_libdir}/cups/backend/%{name} %defattr(-,root,root,-) %{_libdir}/cups/filter/boomaga_pstopdf %{_bindir}/%{name} %{_libdir}/%{name}/boomagabackend %{_libdir}/%{name}/boomagamerger %{_datadir}/applications/boomaga.desktop %{_datadir}/%{name}/translations/* %{_datadir}/dbus-1/services/org.boomaga.service %{_datadir}/icons/hicolor/* %{_datadir}/mime/packages/boomaga.xml %{_datadir}/ppd/%{name}/boomaga.ppd %{_datadir}/%{name}/scripts/installPrinter.sh %doc COPYING GPL LGPL README.md %{_mandir}/man1/boomaga.1.gz %changelog * Tue Jun 30 2015 Oleg Ekhlakov 0.7.1-1.fc21.R - Initial version of the package

Есть две машины, идентичная версия / арка SLES.

На компьютере #A установлено программное обеспечение «foo», которое мы можем увидеть с помощью rpm -qa .

На машине #B необходимо установить программное обеспечение «foo».

foo.rpm недоступен из любого источника, из Интернета и т. Д.

Вопрос

Так как пакет foo.rpm был установлен на машине #A, можем ли мы создать файл foo.rpm на нем из уже установленных файлов?

По-моему, есть и сценарии pre / post в rpm. Таким образом, можно установить foo.rpm (с зависимостями? ).

2 Solutions collect form web for “Как создать пакет RPM из установленных файлов?”

Это возможно, но очень сложно сделать это, чтобы все было сделано правильно. Если вы в отчаянии, вы можете создать новый файл RPM .spec и создать «фальшивый» исходный RPM-файл (SRPM), который затем можно использовать для создания результирующего файла RPM с помощью rpmbuild --rebuild .

Я бы продолжил поиск фактического RPM. Вы не указываете, что в вашем вопросе, но мой опыт заключается в том, что вы можете найти что-нибудь в Интернете, если знаете, как его искать. Я нашел древние версии RPM для дистрибутивов Red Hat, которые не использовались в течение более 10 лет, поэтому мне было бы трудно поверить, что в этом RPM нет остатка.

Также вы можете часто возвращаться к источнику приложения, который содержится в RPM, и использовать его для восстановления RPM. Часто исходные приложения будут содержать необходимый файл.spec который используется для восстановления RPM.

Наконец, вы можете получить источник и файл.spec из службы построения, например, для дистрибутивов на основе Koji для Red Hat. SuSE поддерживает аналогичные услуги сборки, поэтому вы можете искать их, чтобы получить старые артефакты сборки.

Взятие двоичных файлов как

Вы можете использовать этот метод, чтобы поднять фактические исполняемые файлы из одной системы и разгрузить их для развертывания в другой системе.

машина A

$ rpm -ql | xargs tar -zcvf /tmp/program.tgz

машина B

$ tar -zxvf /path/to/your/program.tgz

Версия RPM от SLES

Согласно одному из сообщений в этом потоке: Re: Как создать RPM fron установленные пакеты rpm на SLES предполагается иметь переключатель --repackage . Этого не существует в версии Red Hat (в Fedora или CentOS). Но, согласно сообщению, вы можете использовать его так:

$ rpm -e --repackage

После этого вы найдете здесь свой RPM:

/var/spool/repackage

Использование rpmerizor

Rpmerizor является сторонним инструментом / скриптом, который вы можете установить, который будет повторно упаковывать исходные файлы в соответствующий RPM. Использование этого скрипта доступно здесь, под названием: справочная страница rpmerizor .

выдержка

Rpmerizor – это скрипт, который позволяет вам создавать RPM-пакет из установленных файлов. Вам просто нужно указать файлы в командной строке и ответить на несколько интерактивных вопросов, чтобы заполнить метаданные rpm (имя пакета, версия …). Вы также можете использовать его в пакетном режиме с параметрами командной строки для метаданных.

Использование rpmrebuild

Чтобы не путать с инструментом сборки rpmbuild , rpmrebuild – это еще один сторонний скрипт, который вы можете использовать для повторной упаковки уже установленного RPM.

выдержка

rpmrebuild – это инструмент для создания RPM-файла из пакета, который уже был установлен при базовом использовании, использование rpmrebuild не требует каких-либо знаний о создании rpm. (На debian эквивалентный продукт – dpkg-repack).

пример

Предположим, мы хотим переупаковать openssh-сервер.

$ rpm -aq | grep openssh-server openssh-server-6.2p2-8.fc19.x86_64

Теперь пакет:

$ rpmrebuild openssh-server-6.2p2-8.fc19.x86_64 /usr/lib/rpmrebuild/rpmrebuild.sh: WARNING: some files have been modified: ..?...... c /etc/ssh/sshd_config ..?...... c /etc/sysconfig/sshd Do you want to continue ? (y/N) y Do you want to change release number ? (y/N) n result: /root/rpmbuild/RPMS/x86_64/openssh-server-6.2p2-8.fc19.x86_64.rpm

  • Re : Как создать RPM-установленные установленные пакеты

Как правило, нет.

С небольшим rpm -qi и rpm -q --changelog дают представление о том, откуда появился пакет.

Если он был построен на системе, на которой он работает, вы все равно можете использовать файл spec, используемый для создания фактических оборотов, если не оба.

rpm -q --list Показывает все файлы, которые развертывает пакет.

rpm -q --scripts Чтобы показать любые скрипты, которые выполняются при установке (или удалении) пакета, могут обеспечить как можно меньше информации о его назначении, так как файлы, которые развертываются.

И любые зависимости, которые необходимо установить, можно найти с помощью rpm -q --requires

RPM пакеты имеют собственную структуру, отличную от других. Но зачем создавать свои RPM, если можно просто скомпилировать исходники? Ответ на этот вопрос в рутинной установке, а также помощи разработчикам Fedora или другим дистрибутивам. Устанавливая каждый раз одни и те же программы из исходников, можно написать скрипт для автоматизации этого, однако, если есть RPM, то не надо тратить много времени на установку, также как и необходимая программа будет постоянно доступна онлайн из репозитория (конечно же, если вы ее туда отправите).

Итак приступим к подготовке рабочей среды для создания RPM.

# yum groupinstall "Development Tools"
# yum install rpmdevtools
На данной стадии происходит установка необходимых утилит и различных библиотек разработчика.

НИКОГДА НЕ СОЗДАВАЙТЕ RPM ОТ ROOT! (это может нарушить работу системы, увеличить возможность взлома и так далее)

После окончания установки, запустите

rpmdev-setuptree
Это приведет к создание ветки директорий
BUILD BUILDROOT RPMS SOURCES SPECS SRPMS

Из всех директорий нас интересует только SOURCES SPECS, информация в остальных, если все сделано верно, сгенерируется автоматически.

Теперь нам нужен.spec файл, примеры можно найти путем стачивания.src.rpm с репозитория, после распаковки, будет.spec файл, который необходимо поправить под наши нужды.

Сами исходники с патчами или без, копируем в SOURCES.

Когда все готово, запускаем компилирование и создание RPM

rpmbuild -ba ПУТЬ/NAME.spec для создания.src.rpm
rpmbuild -bi ПУТЬ/NAME.spec для создания бинарника или просто.rpm

Для установки и/или тестирования

# rpm -ivh sourcepackage-name*.src.rpm
или
# rpm -ivh package-name*.rpm
Если все сделано правильно, то программа установится с предупреждением, что rpb database изменена сторонней программой (правильно, мы же ее еще не залили на Fedora сервер).

Объяснение часто используемых областей в.spec файле

Name : Базовое имя пакета удовлетворяющее требованиям Packagen Naming Guidelines . После этого, макрос %{name} будет обращаться к данному разделу.

Version : Номер версии, при использовании даты в версии, используйте формат, гг.мм (пример 11.02). %{version} для последующего обращения к данной области.

Release : Должно быть 1%{?dist} , таким образом, число будет увеличиваться каждый раз, когда создается пакет для одной и той же версии дистрибутива.

Summary : Краткое описание пакета.

Group : Существующая группа пакетов, например Applications/Databases.

Чтобы узнать весь список
# less /usr/share/doc/rpm-*/GROUPS
Для документации будет соответственно группа Documentation.

License : Лицензия на программу, обязана быть для открытых исходников, например "GPLv2+" (GPL версии 2 или новее). Для нескольких лицензий используйте "and" или "or" "GPLv2 and BSD". Следует указывать лицензию максимально точно, можно указывать несколько лицензий с помощью "and" и "or", например "GPLv2 and BSD".

Source0 : Ссылка на архив с исходным кодом. Если указана полная ссылка, то одноименный пакет должен быть в папке SOURCES. Если источников исходного кода несколько, то используем Source1 , Source2 и т.д.

Patch0 : Название первого патча для программы, имя файла должно заканчиваться на.patch и лежать в директории ~/rpmbuild/SOURCES. Патчей может быть несколько.

BuildArch : Архитектура программы под определенные процессоры. Для универсальных пакетов "noarch".

BuildRoot : Место, выделенное для компиляции и установки исходников приложения во время выполнения процесса "%install". По стандарту Fedora, будет создана специальная директория в /var/tmp. Более новые версии RPM пропустят это значение и поместят build root в %{_topdir}/BUILDROOT/

BuildRequires : Список необходимых приложений для сборки пакета (через запятую). Автоматически не определяются . Некоторые стандартные приложения могут быть опущены в данном списке. Полный список приложений, которые могут быть пропущены здесь (https://fedoraproject.org/wiki/Packaging/Guidelines).

Requires : Список необходимых приложений для работы после установки (через запятую). В большинстве случаев определяются автоматически rpmbuild .

%description : Описание программы, строки не должны быть длиннее 80 символов.
%prep : Скрипты для подготовки программы, распаковки и подготовки к сборке.
%build : Скрипты для сборки программы, компиляции и подготовки к установке.
%test : Скрипты для тестирования программы, выполняются после %build, но до %install.
%install : Скрипты для установки программы, команды скопируют файлы из "build directory" %{_builddir} (которая находится ~/rpmbuild/BUILD) в директорию buildroot %{buildroot}, которая обычно находится в /var/tmp.
%clean : Инструкции для очистки buildroot, например,
rm -rf %{buildroot}
%files : Список устанавливаемых файлов.
%changelog : Изменения в программе.

Статья подготовлена опираясь на официальный источник от