Создание бинарных пакетов RPM без прав суперпользователя

2005-03-17 at 03:38 | Posted in uncategorized | Leave a comment

Используется образцовая система с установленной системой RPM:

$ echo `uname -sr` on `uname -m`
Linux 2.4.18-3 on i686
$ rpm --version
RPM version 4.0.4

Создадим пользователя rpmtest:users для тестирования:

$ su -
Password:
# useradd -g users rpmtest
# passwd rpmtest
Changing password for user rpmtest.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

Дальнейшие шаги будем выполнять от его имени:

# exit
$ su - rpmtest
Password:
$

Для построения пакетов используется каталог, описываемый макросом RPM _topdir. Посмотреть его значение можно так:

$ rpm --showrc | grep "[^{]_topdir[^}]" | cut -f 2
%{_usrsrc}/redhat

Если проследить подстановку макросов, можно узнать конретный полный путь. На образцовой системе это был /usr/src/redhat. Можно либо разрешить запись в поддерево _topdir, либо создать пользовательский конфигурационный файл с (пере)определением макроса:

$ echo "%_topdir $HOME/tmp/rpmtop" > ~/.rpmmacros

После этого _topdir будет иметь значение:

$ rpm --showrc | grep "[^{]_topdir[^}]" | cut -f 2
/home/rpmtest/tmp/rpmtop

Создадим и сам каталог _topdir:

$ install -d ~/tmp/rpmtop
$ ls -ld ~/tmp/rpmtop
drwxr-xr-x    2 rpmtest  users        1024 Mar  1 09:57 /home/rpmtest/tmp/rpmtop

Общесистемное дерево _topdir имеет вид:

$ tree -d /usr/src/redhat/
/usr/src/redhat/
|-- BUILD
|-- RPMS
|   |-- athlon
|   |-- i386
|   |-- i486
|   |-- i586
|   |-- i686
|   `-- noarch
|-- SOURCES
|-- SPECS
`-- SRPMS

Воссоздадим его структуру в ~/tmp/rpmtop. Если никто не менял его показанной выше структуры, то дерево можно воссоздать таким скриптом:

$ for i in `find /usr/src/redhat -type d`; do
>     install -d `echo $i | sed s_/usr/src/redhat_$HOME/tmp/rpmtop_`;
> done
$ tree -d ~/tmp/rpmtop
/home/rpmtest/tmp/rpmtop
|-- BUILD
|-- RPMS
|   |-- athlon
|   |-- i386
|   |-- i486
|   |-- i586
|   |-- i686
|   `-- noarch
|-- SOURCES
|-- SPECS
`-- SRPMS

Теперь построение пакетов возможно с правами непривилегированного пользователя! Протестируем возможность создания пакетов. В качестве примера возьмём пакет id3tool-scripts, который представляет собой несколько полезных скриптов к программке id3tool. Создадим spec-файл:

$ pushd ~/tmp/rpmtop/SPECS/
~/tmp/rpmtop/SPECS ~
$ vi id3tool-scripts-0.1.spec
> i
> name: id3tool-scripts
> version: 0.1
> release: 1
> license: GPL
> group: Applications/Media
> summary: Useful scripts for id3tool.
> 
> exclusiveArch: noarch
> requires: id3tool >= 1.2
> prefix: /usr/local/id3tool-scripts
> 
> %description
> 
> %files
> 
> %defattr(-,root,root)
> /usr/local/id3tool-scripts
> /usr/local/bin/id3title
> :wq

Предполагается, что файлы создаваемого пакета уже находятся в файловой системе. Это каталог /usr/local/id3tool-scripts и символическая ссылка /usr/local/bin/id3title:

$ ls -l /usr/local/id3tool-scripts
total 1
-rwxr-xr-x    1 root     root           47 Mar  1 04:02 id3title
$ ls -l /usr/local/bin/id3title
lrwxrwxrwx    1 root     root           35 Mar  1 07:12 /usr/local/bin/id3title
> -> /usr/local/id3tool-scripts/id3title

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

$ rpm -bb --target noarch id3tool-scripts-0.1.spec
Building target platforms: noarch
Building for target noarch
Processing files: id3tool-scripts-0.1-1
Finding  Provides: (using /usr/lib/rpm/find-provides)...
Finding  Requires: (using /usr/lib/rpm/find-requires)...
PreReq: rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames)
> <= 3.0.4-1
Requires(rpmlib): rpmlib(PayloadFilesHavePrefix) <= 4.0-1
> rpmlib(CompressedFileNames) <= 3.0.4-1
Requires: id3tool >= 1.2 /bin/sed
Wrote: /home/rpmtest/tmp/rpmtop/RPMS/noarch/id3tool-scripts-0.1-1.noarch.rpm
$ echo $?
0

Таким образом, поставленная задача решена! =)

Leave a Comment »

RSS feed for comments on this post. TrackBack URI

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Blog at WordPress.com.
Entries and comments feeds.

%d bloggers like this: