Rpm из исходников. Создание RPM-пакетов. Обновление и установка пакетов

Для Windows 02.07.2020

Все найденные мною в интернете мануалы в большинстве случаев сводятся к двум видам:
— перевод документации (с которым я всё-таки советую ознакомиться, тк в моей статье будет освещена лишь часть информации, которая вам в дальнейшем понадобится)
— краткие инструкции, как запустить rpmbuild когда у нас уже есть всё.
Лично я столкнулся с необходимость собрать пакет из исходника, вместе с которым небыло ничего, а главное spec-файла, по которому необходимо собрать пакет. В итоге мы напишем собственный spec-файл для сборки пакета и добавим туда сразу собственные конфиги (этот вопрос тоже не сильно освящён).

Я буду собирать пакет из исходников ffmpeg для AirVideoServer, который я уже рассказывал как . Я сторонник того, что бы в дистрибутиве, который использует пакетный менеджер, приложения ставились именно через него, по этому на CentOS я не люблю собирать ПО из исходников. По этой причине я решил собрать себе всё в пакеты. Сборка так же необходимых lame (он идёт уже со spec-файлов в комплекте) и x264 (под него вы сможете написать spec-файл сами, после прочтения этой статьи) не должна вызвать у вас проблем в будущем.

И так, для начала нам нужно настроить «среду» в которой мы будет собирать пакет. Не рекомендуется производить сборку пакетов из под root`а, по этому мы заведём отдельного пользователя, но а пока поставим всё необходимое ПО:

Yum install gcc gcc-c++ automake autoconf libtool yasm nasm ncurses-devel git ftp rpmdevtools

а теперь заведём специального пользователя

Useradd rpmbuild

и войдём под ним

Su - rpmbuild

выполним команду

Rpmdev-setuptree

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

Wget http://inmethod.com/airvideo/download/ffmpeg-for-2.4.5-beta7.tar.bz2

разворачиваем его

Tar -xjf ffmpeg-for-2.4.5-beta7.tar.bz2

Положим рядом конфигурационный файл с содержимым:

Nano airvideoserver.conf path.ffmpeg = /usr/bin/ffmpeg password = subtitles.encoding = utf-8 subtitles.font = Verdana folders = Movies:/home/share/films

Сюда же скачаем файл сервера:

Wget http://inmethod.com/airvideo/download/linux/alpha6/AirVideoServerLinux.jar

И init-скрипт:

Nano AirVideoServer #!/bin/bash #chkconfig: - 80 20 #description: AirVideo server # Source function library. . /etc/rc.d/init.d/functions PREFIX_DIR=/usr/local/AirVideo case "$1" in start) echo -n "Starting AirVideo server: " daemon java -jar ${PREFIX_DIR}/AirVideoServerLinux.jar ${PREFIX_DIR}/properties.conf > /dev/null 2>&1 & [ $? -eq 0 ] && success || failure echo ;; stop) echo -n "Stopping AirVideo server: " killproc java echo ;; status) status java ;; restart | reload) $0 stop ; $0 start ;; *) echo "Usage: airvideo {start|stop|status|reload|restart" exit 1 ;; esac

Теперь можно переходить к написанию нашего spec-файла для сборки.
Сначала у нас идут различные заголовки. Имя пакета, версия и релиз — имеют значение, от них будет зависеть в какую директорию будет разворачиваться исходник перед сборкой. В Source1 , Source2 и Source3 мы указываем наши 3 дополнительных файл, конфиг, сервер и init-скрипт, которые необходимо добавить в пакет при сборке.

Name: ffmpeg Version: 2.4.5 Release: beta7 Summary: ffmpeg for AirVideoServer License: GPL URL: http://inmethod.com/airvideo/ Source: http://inmethod.com/airvideo/download/ffmpeg-for-2.4.5-beta7.tar.bz2 Source1: airvideoserver.conf Source2: AirVideoServer Source3: AirVideoServerLinux.jar BuildRoot: %{_tmppath}/%{name}-for-%{version}-%{release}

%description Utility and library for encoding H264/AVC video streams for AirVideoServer.

Секция %prep отвечает за команды, необходимые для начала сборки, что бы мне не мучится с переименованием директории под формат -, я просто ключом -n указываю где лежат распакованные исходники

%prep %setup -n /home/rpmbuild/rpmbuild/BUILD/ffmpeg/

Секция %build отвечает за непосредственную сборку исходника, ключи вы можете менять на необходимые вам, как при обычной сборке и установке из исходников:

%build ./configure \ --prefix="%{_prefix}" \ --bindir="%{_bindir}" \ --libdir="%{_libdir}" \ --enable-pthreads \ --disable-shared \ --enable-static \ --enable-gpl \ --enable-libx264 \ --enable-libmp3lame

Секция %install содержит команды установки файлов пакета в систему, здесь нам необходимо дополнительно указать, куда инсталлировать наши файл конфига, сервер и init-скрипт

%install %{__rm} -rf %{buildroot} %{__make} install DESTDIR="%{buildroot}" mkdir -p $RPM_BUILD_ROOT/usr/local mkdir -p $RPM_BUILD_ROOT/usr/local/AirVideo/ install -m 644 %{SOURCE1} $RPM_BUILD_ROOT/usr/local/AirVideo/ install -m 644 %{SOURCE2} $RPM_BUILD_ROOT/etc/init.d install -m 644 %{SOURCE3} $RPM_BUILD_ROOT/usr/local/AirVideo/

Уберём за собой мусор и выполним ldconfig

%clean %{__rm} -rf %{buildroot} %post -p /sbin/ldconfig %postun -p /sbin/ldconfig

Команды в секции %files задают списки файлов и каталогов, которые с соответствующими атрибутами должны быть скопированы из дерева сборки в rpm-пакет и затем будут копироваться в целевую систему при установке этого пакета.

%files %defattr(-,root,root,-) %doc COPYING* CREDITS README* %{_bindir}/avconv %{_bindir}/avprobe %{_bindir}/avserver %{_bindir}/ffmpeg /usr/include/* /usr/lib64/* /usr/share/avconv/* /usr/local/AirVideo/airvideoserver.conf /etc/init.d/AirVideoServer /usr/local/AirVideo/AirVideoServerLinux.jar

Макрос %doc отмечает файлы документации, копирайты и прочие вещи.
На этом наш spec-файл готов, теперь нам необходимо запустить саму сборку

Rpmbuild -bb ffmpeg/ffmpeg.spec

При успешной сборке пакета, после завершения, в директории RPMS/_архитектура_/ у нас появится наш пакет ffmpeg-2.4.5-beta7.x86_64.rpm который теперь можно выложить и развернуть на любой машине.

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

В данной статье будет подробно описан процесс создание 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 предназначена для произведения всех видов операций с программным обеспечением, в том числе и для создания пакетов для установки (RPM-пакетов).

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

Будем считать, что программа уже откомпилирована и все файлы, необходимые для ее работы, уже подготовлены. Нам нужны следующие файлы:
port - откомпилированный бинарный файл
README - файл
port.1 - файл для справочной системы man

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

Для создания пакета нам нужно создать файл спецификаций. В файле спецификаций указывается вся информация о создаваемом пакете: название, версия, файлы программ, файлы документации, действия, выполняемые при установке пакета и при его удалении.

Вот мой файл спецификаций для программы port
Листинг 1.

# /root/port/port.spec # Файл спецификаций для программы port # Общее описание программы Summary: Program to control your serial device # Название пакета Name: port # Его версия Version: 1.0 # Релиз Release: 99 # Группа программного обеспечения. Группы (или категории) используются многими # программами для манипуляции пакетами, например gnorpm, которая строит дерево # категорий установленного программного обеспечения Group: Monitoring # Если хотите, можете указать свое имя, но обычно указывается GPL License: GPL # Можно также указать и copyleft # Copyright: GPL # Наш пакет ни с чем не конфликтует # Conflicts: # Менеджер сам заполнит это поле при необходимости # (только для создания двоичных пакетов!) # Require: # Информация о создателе пакета Packager: Denis Kolisnichenko URL: http://dkws.narod.ru # Тэги Summary, Name, Version, Release, Group, License являются обязательными # Из вышеуказанной информации видно, что будет создан пакет: # port-1.0-99.i686.rpm # Архитектура у вас может отличаться # Полное описание пакета %description Программа port предназначена для мониторинга состояния последовательного порта. При получении сигнала (1) на какой-нибудь контакт указанного порта, port отправляет сообщение запустившему ее пользователю на указанный email # Файлы, которые будут помещены в пакет %files %doc /root/port/README /root/port/port /root/port/port.1

Для построения пакета нужно ввести команду:

# rpm -bb /root/port/port.spec

Если вы не допустили никаких ошибок при создании файла спецификаций, на экране вы увидите примерно такое сообщение:

Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.33439 Processing files: port-1.0-99 Finding Provides: (using /usr/lib/rpm/find-provides)... Finding Requires: (using /usr/lib/rpm/find-requires)... Requires: ld-linux.so.2 libc.so.6 libc.so.6(GLIBC_2.0) Записан: /usr/src/RPM/RPMS/i686/port-1.0-99.i686.rpm

При этом будет создан пакет port-1.0-99.i686.rpm. Этот пакет будет помещен в каталог /usr/src/RPM/RPMS/i686

Проведем небольшой эксперимент. Запустите Midhight Commander (mc), перейдите в каталог /usr/src/RPM/RPMS/i686/ и "войдите" в пакет port-1.0-99.i686.rpm как в обычный каталог. В нем будет "подкаталог" INFO, в котором и содержится вся информация о пакете.

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

Традиционно, процедура создания RPM-пакетов состоит из следующих этапов:

  1. Извлечения исходных текстов программы из архива
  2. Компилирование программы из исходных текстов
  3. Создание RPM-пакета

Первые два этапа можно пропустить, что мы и сделали при создании нашего пакета. Это можно сделать только в случае, если программа уже откомпилирована из исходных текстов.

Программа RPM использует файл конфигурации rpmrc. Поиск этого файла происходит в каталогах /usr/lib/rpm, /etc, $HOME. Просмотреть этот файл можно с помощью команды:

# rpm --showrc

Запись topdir файла конфигурации rpmrc содержит название каталога, в котором находится дерево подкаталогов, которое используется менеджером RPM для постороения пакетов. Введите команду:

# rpm --showrc | grep topdir -14: _builddir %{_topdir}/BUILD -14: _rpmdir %{_topdir}/RPMS -14: _sourcedir %{_topdir}/SOURCES -14: _specdir %{_topdir}/SPECS -14: _srcrpmdir %{_topdir}/SRPMS -14: _topdir %{_usrsrc}/RPM

У меня эти подкаталоги находятся в каталоге /usr/src/RPM. Как вы видите, в этом каталоге находятся подкаталоги BUILD, RPMS, SOURCES, SPECS, SRPMS.

В каталоге BUILD создается RPM-пакет. В каталоге SOURCES находятся сжатые исходные тексты программы. В каталог RPMS помещаются созданные пакеты. Точнее, они помещаются в один из его подкаталогов, в какой именно - это зависит от архитектуры. В каталог SRPMS помещаются пакеты, содержащие исходные тексты программы.

В каталоге SPECS находятся файлы спецификаций. Обычно файл спецификации называется название_программы-версия-релиз.spec.

Например, если у вас есть исходный текст программы в архиве, из которого вы хотите создать пакет RPM, скопируйте его в каталог SOURCES

# cp source_code-1.0.tar.gz /usr/src/RPM/SOURCES

По умолчанию менеджер RPM работает с пакетами, расположенным в каталоге с именем, совпадающем с названием пакета и его версией. Для нашего пакета port это будет каталог port-1.0-99. Менеджер пакетов будет компилировать наш пакет в каталоге /usr/src/RPM/port-1.0-99

Думаю, уже достаточно информации о каталогах RPM. Теперь перейдем к файлу спецификаций. Файл спецификаций состоит из четырех сегментов: заголовка, подготовительного, файлового, установочного.

В заголовке указывается общая информация о пакете. В листинге 1 к сегменту заголовка относятся тэги Summary, Name, Version, Release, Group и Licese. На них мы останавливаться не будем, так как их назначение понятно из листинга 1.

Есть еще очень полезный тэг: BuildRoot. Он изменяет расположение дерева BUILD. Значением по умолчанию является /usr/src/RPM или другой каталог, задаваемый переменной окружения $RPM_BUILD_ROOT. В целях экономии дискового пространства полезно после установки удалить дерево %RPM_BUILD_ROOT. Но дерево по умолчанию может содержать другие файлы, относящиеся к другим пакетам. Поэтому сначала с помощью тэга BuildRoot нужно задать какой-нибудь временный каталог, а после установки удалить его.

В каждом сегменте находятся макрокоманды. С некоторыми мы уже знакомы - это %description, %files, %doc, %install. В таблице 1 приведено полное описание макрокоманд.

Таблица 1.

Макрокоманда Описание
%description Полное описание пакета
%prep Подготовка архива. Здесь задаются команды для извлечения исходного текста программы и его распаковки, дополнительная подготовка исходного текста. После макрокоманды %prep задаются обычные команды shell.
%setup Макрокоманда извлечения файлов из архивов. Опция -n позволяет указать каталог, в котором будет создаваться новый пакет. Обычно распаковывается архив, расположенный в каталоге SOURCES в каталог BUILD
%build Макрокоманда компилирования. Обычно здесь запускается программа make с необходимыми параметрами
%files Задает список файлов, входящих в состав пакета. При указании имен файлов должен быть указан полный, а не относительный путь. Для указания полного пути можно использовать переменную окружения $RPM_BUILD_ROOT. Необходимые файлы уже должны быть помещены в каталог BUILD. Этого можно достичь с помощью макрокоманды %setup или с помощью %pre (см. ниже)
%config список Задает список файлов, которые будут помещены в каталог /etc
%doc список Задает список файлов, которые будут помещены в каталог /usr/doc/--.
%install Этап установки программного обеспечения. Здесь нужно записать команды, которые будут устанавливать файлы, входящие в состав пакета. Удобнее использовать команду install, которую я использовал в листинге 1
%pre Действия, которые будут выполнены до инсталляции пакета
%post Действия, которые будут выполнены после инсталляции пакета
%preun Действия, которые будут выполнены перед удалением пакета
%postun Действия, которые будут выполнены после удаления пакета
%clean Удаление дерева BUILD. Используется вместо опции --clean программы rpm. Обычно содержит одну команду: rm -rf $RPM_BUILD_ROOT

Нужно сделать небольшое замечание относительно макрокоманд %config и %doc. В этом случае список задается не так, как в макрокоманде %files. Если после макрокоманды %files можно было просто указать по одному файлу в каждой строке, то в макрокоманде %doc каждому файлу (или каждому списку) должна предшествовать команда %doc. Например,

%doc README TODO Changes %doc Install а не %doc README TODO Changes Install

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

При создании пакета мы использовали опцию -bb программы rpm. При указании этой опции создается только двоичный RPM-пакет, если вы хотите создать также пакет, содержащий исходный текст программы, используйте опцию -ba. Созданный пакет помещается в каталог SRPMS и будет иметь имя port-1.0-99.src.rpm. То есть вместо названия архитектуры будет указано, что данный пакет содержит исходный текст программы. Для создания такого пакета в каталоге SOURCES должны находиться исходные тексты программы.

Для полноты картины осталось рассмотреть опции менеджера rpm, которые используются для создания пакетов.

Таблица 2.

-ba Создаются два пакета: двоичный и содержащий исходный текст. При этом не пропускается ни один этап установки, указанный в файле спецификаций
-bb Создается только двоичный пакет. Не пропускается ни один этап установки, указанный в файле спецификаций
-bc Выполняются этапы %pre и %build. При этом пакет распаковывается и компилируется
-bi Выполняются этапы %pre, %build, %install
-bl Выполняется проверка списка файлов, указанных в макрокоманде %files
-bp Выполняется только этап %pre, то есть распаковывается архив
--recompile package.src.rpm Указанный пакет, содержащий исходные тексты, сначала устанавливается, а потом компилируется
--rebuild package.src.rpm Устанавливает и компилируется пакет исходных текстов, а затем создается новый двоичный пакет
--test Проверка файла спецификаций
--clean Удаление дерева каталогов BUILD после создания пакета
--showrc Выводит файл конфигурации


Рекомендуем почитать

Наверх