Управление пакетами Slackware

Вступление

Управление пакетами Slackware - одно из самых простых для понимания и использования. Все пакеты представляют собой обычные архивы tar, поскольку в Slackware 14.2 tar-архивы сжимаются с помощью компрессора xz. Все файлы в пакете уже на своих местах, кроме слэша в начале. Симлинки на файлы создаются во время установки пакета. Для просмотра содержимого пакета вы можете использовать консольный архиватор tar. Сначала убедитесь, что у вас есть доступ к пакетам, например, смонтируйте образ ISO CD/DVD: 

# mkdir -p /mnt/loop
# mount -o loop,ro slackware-14.2-install-dvd.iso /mnt/loop/

Во всех последующих примерах будет подразумеваться, что образ DVD iso уже смонтирован, чтобы больше не показывать команды монтирования.

Теперь заглянем в пакет:

# tar tfv /mnt/loop/slackware/y/bsd-games-2.13-i486-11.txz
...
drwxr-xr-x root/root         0 2010-05-15 20:10 usr/games/
-rwxr-xr-x root/root      4808 2010-05-15 20:10 usr/games/cfscores
-rwxr-xr-x root/root     27144 2010-05-15 20:10 usr/games/cribbage
...

В приведенном выше листинге показан каталог usr/games и два бинарных файла cfscores и cribbage. Вы можете перейти в корневой каталог системы и извлечь пакет, после чего будет создан каталог /usr/games и бинарные файлы в нём. Недостатком этого метода является то, что пакет не будет отображаться в базе данных пакетов. База данных пакета - это отдельный каталог, содержащий текстовый файл (метаданные) для каждого пакета с его содержимым. База данных пакетов находится в каталоге /var/log/packages:

# less /var/log/packages/bsd-games-2.13-i486-11
...
usr/games/
usr/games/cfscores
usr/games/cribbage
...

База данных пакета необходима для удаления пакета, только для пакета и его содержимого. Таким образом, вам не нужно самостоятельно отслеживать содержимое вашей установки Slackware. При удалении пакета, будет считан соответствующий файл метаданных в базе данных пакетов, его содержимое будет удалено с жёсткого диска, а сам файл метаданных будет удален.
В Slackware есть несколько инструментов для установки и удаления пакета:

installpkg
просто устанавливает пакет
removepkg
удаляет пакет
explodepkg
извлекает пакет
upgradepkg
обновляет пакет с тем же названием, если есть отличие в версии, номере сборки и т.д.
makepkg
создаёт пакет
pkgtool
диалоговый интерфейс управления скриптами выше (здесь не описан)

Как видите, большинство названий скриптов говорят сами за себя. Команды находятся в каталоге /sbin/ и представляют собой обычные скрипты shell:

# file /sbin/*pkg*
/sbin/explodepkg: POSIX shell script, ASCII text executable
/sbin/installpkg: POSIX shell script, ASCII text executable
/sbin/makepkg:    POSIX shell script, ASCII text executable
/sbin/pkgtool:    POSIX shell script, ASCII text executable
/sbin/removepkg:  POSIX shell script, ASCII text executable
/sbin/upgradepkg: POSIX shell script, ASCII text executable

Установка пакета

Установка пакета с помощью installpkg не слишком сложна, просто нужно запустить installpkg с именем нужного пакета:

# installpkg /mnt/loop/slackware/y/bsd-games-2.13-i486-11.txz
Verifying package bsd-games-2.13-i486-11.txz.
Installing package bsd-games-2.13-i486-11.txz [OPT]:
PACKAGE DESCRIPTION:
# bsd-games (Classic BSD text games collection)
#
# Games that go in /usr/games:  adventure arithmetic atc backgammon
#   banner battlestar bcd caesar canfield cfscores countmail cribbage
#   factor fish fortune gomoku hangman hunt mille monop morse number
#   phantasia pig pom ppt primes quiz rain random robots rot13 sail
#   snake snscore teachgammon trek wargames worm worms wump
#
# Adds a call to 'fortune' to /etc/profile.d/ so that users will get a
# fortune message when they log in.
#
Executing install script for bsd-games-2.13-i486-11.txz.
Package bsd-games-2.13-i486-11.txz installed.

Если вы боитесь, что при установке пакета могут быть перезаписаны уже существующие файлы, используйте параметр --warn:

# installpkg --warn /mnt/loop/slackware/y/bsd-games-2.13-i486-11.txz
...
/usr/games/cfscores
/usr/games/cribbage
...

Опция --warn проверит, есть ли в системе такой же файл, который должен быть установлен на ваш жесткий диск. Будет выдан список, всех уже имеющихся или установленных в составе пакетов, файлов. Пакет в с опцией --warn установлен не будет.

Для установки пакета в альтернативный корневой каталог, используйте параметр --root. Корнем по умолчанию является / конечно. Сначала нужно создать альтернативный корневой каталог, а затем в него устанавливать пакет:

# mkdir -p /a
# installpkg --root /a /mnt/loop/slackware/y/bsd-games-2.13-i486-11.txz
Verifying package bsd-games-2.13-i486-11.txz.
Installing package bsd-games-2.13-i486-11.txz [OPT]:
PACKAGE DESCRIPTION:
# bsd-games (Classic BSD text games collection)
#
# Games that go in /usr/games:  adventure arithmetic atc backgammon
#   banner battlestar bcd caesar canfield cfscores countmail cribbage
#   factor fish fortune gomoku hangman hunt mille monop morse number
#   phantasia pig pom ppt primes quiz rain random robots rot13 sail
#   snake snscore teachgammon trek wargames worm worms wump
#
# Adds a call to 'fortune' to /etc/profile.d/ so that users will get a
# fortune message when they log in.
#
Executing install script for bsd-games-2.13-i486-11.txz.
Package bsd-games-2.13-i486-11.txz installed.

Теперь просмотрите альтернативный корневой каталог с помощью команды ls:

# ls /a
etc/  usr/  var/

При посмотре каталога /a/var, обратите внимание, что в альтернативном корневом каталоге так же была создана ещё одна база данных пакетов:

# ls /a/var/log/packages/
bsd-games-2.13-i486-11

Опции --warn и --root не могут быть объединены в одной команде. Если вы удалите пакет bsd-games из основной системы, но оставите пакет установленный в альтернативный корневой каталог /a, то опция --warn работать не будет:

# installpkg --warn --root /a /mnt/loop/slackware/y/bsd-games-2.13-i486-11.txz

После команды ничего не произойдет, никакой записи не будет.

При установке Slackware с CD/DVD, вы можете видеть эти модные псевдографические информационные окна во время установки пакета. Этот режим можно воспроизвести с помощью опции --infobox:

# installpkg --infobox /mnt/loop/slackware/y/bsd-games-2.13-i486-11.txz


infobox

С опцией --menu вы получите необычное диалоговое окно, в котором вас попросят подтвердить, действительно ли нужно пакет устанавливать:

installpkg_menu.png

Вместо увеличенного объёма вывода информации вы так же можете уменьшить вывод с помощью опции --terse:

# installpkg --terse /mnt/loop/slackware/y/bsd-games-2.13-i486-11.txz
bsd-games-2.13-i486-11: Classic BSD text games collection                [5.3M]

В управлении пакетами Slackware такая штука, известная как приоритеты. Устанавливая приоритеты, вы можете влиять, будет ли пакет установлен в систему или нет. Есть 4 приоритета:

ADD
установить этот пакет
REC
установка этого пакета рекомендуется
OPT
установка этого пакета не является обязательной
SKP
не устанавливть этот пакет

Приоритеты устанавливаются в файле тегов(tagfile). Каждый каталог с пакетами на DVD имеет свой файл тегов:

# cat /mnt/loop/slackware/y/tagfile
bsd-games:OPT

Конечно, пакет bsd-games не является обязательным для системы, но теперь в качестве примера мы его установим. Для этого создайте новый файл тегов в домашнем каталоге /root:

# vi /root/tagfile
bsd-games:ADD

Теперь установите пакет bsd-games с DVD с опциями --menu и --tagfile:

# installpkg --menu --tagfile /root/tagfile /mnt/loop/slackware/y/bsd-games-2.13-i486-11.txz

Вместо того, чтобы спрашивать вас, должен ли пакет быть установлен, он будет просто установлен напрямую (обычно с опцией --menu вам будет предложено установить пакет или нет). Теперь измените приоритет на SKP:

# vi /root/tagfile
bsd-games:SKP

И снова установите пакет:

# installpkg --menu --tagfile /root/tagfile /mnt/loop/slackware/y/bsd-games-2.13-i486-11.txz

Как вы видите, пакет не был установлен, произошёл возврат в командную строку. Если вы измените приоритет внутри файла тегов на REC или OPT, вас снова спросят, хотите ли вы установить пакет. Так в чем же разница? Попробуйте и посмотрите на заголовок меню, когда вы измените приоритет на REC, заголовок будет отображаться так:

Package Name: bsd-games-2.13-i486-11 [REC]

Обратите внимание на [REC] в конце заголовка. То же самое поизойдёт, если вы измените приоритет на OPT:

Package Name: bsd-games-2.13-i486-11 [OPT]

Название изменится на [OPT]. Это информация для пользователя, из которой он должен решить, устанавливать пакет или нет.

Приоритет ADD может быть переопределен с помощью параметра --ask. Сначала измените приоритет на ADD внутри вашего файла тегов:

# vi /root/tagfile
bsd-games:ADD

Теперь установите пакет с опциями --menu, --tagfail и --ask:

# installpkg --menu --tagfile /root/tagfile --ask /mnt/loop/slackware/y/bsd-games-2.13-i486-11.txz

Независимо от того, установлен ли приоритет ADD, вам будет предложено установить пакет. Название снова изменилось:

Package Name: bsd-games-2.13-i486-11 [ADD]

При установке пакета вы можете создать контрольную сумму md5sum пакета. Это делается с помощью опции --md5sum:

# installpkg --md5sum /mnt/loop/slackware/y/bsd-games-2.13-i486-11.txz

Теперь взгляните на файл метаданных для пакета:

# less /var/log/packages/bsd-games-2.13-i486-11
PACKAGE NAME:     bsd-games-2.13-i486-11
COMPRESSED PACKAGE SIZE:     1.7M
UNCOMPRESSED PACKAGE SIZE:     5.3M
PACKAGE LOCATION: /mnt/loop/slackware/y/bsd-games-2.13-i486-11.txz
PACKAGE MD5SUM: eb5f8e2a42a35021bab92b6142ca8058
PACKAGE DESCRIPTION:
...

Обратите внимание на строку PACKAGE MD5SUM между PACKAGE LOCATION и PACKAGE DESCRIPTION. Если вы устанавливаете пакет без --md5sum, строка PACKAGE MD5SUMM не появляется:

# installpkg /mnt/loop/slackware/y/bsd-games-2.13-i486-11.txz
# less /var/log/packages/bsd-games-2.13-i486-11
PACKAGE NAME:     bsd-games-2.13-i486-11
COMPRESSED PACKAGE SIZE:     1.7M
UNCOMPRESSED PACKAGE SIZE:     5.3M
PACKAGE LOCATION: /mnt/loop/slackware/y/bsd-games-2.13-i486-11.txz
PACKAGE DESCRIPTION:
...

Помните, что генерация md5sum во время установки замедлит сам процесс установки. Для получения быстрой справки по всем опциям, дайте команду installpkg без опций:

# installpkg
...
options:      --warn (предупредить, если файлы будут перезаписаны, но не устанавливать)
...

Или просто используйте справочную страницу:

# man installpkg
...

Удаление пакета

Удалить пакет намного проще. Самый простой способ удалить пакет:

# removepkg bsd-games

Removing package /var/log/packages/bsd-games-2.13-i486-11...
Removing files:
...
  --> Deleting /usr/games/adventure
  --> Deleting /usr/games/arithmetic
...

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

bsd-games
bsd-games-2.13
bsd-games-2.13-i486-11
/var/log/packages/bsd-games-2.13-i486-11

Если файл принадлежит другому пакету, он не будет удален. Пустые каталоги будут удалены. Непустые каталоги не будут удалены. Как и в installpkg в removepkg тоже есть опция -warn:

# removepkg -warn bsd-games
Only warning... not actually removing any files.
Here's what would be removed (and left behind) if you
removed the package(s):
...
  --> /usr/games/adventure would be deleted
  --> /usr/games/arithmetic would be deleted
...

Пакет не будет удален, опция -warn показывает вам только те файлы и каталоги, которые будут удалены. Прежде чем окончательно удалить пакет, вы можете сохранить содержимое, но не в каталоге (каталогах) для этого пакета. Затем используйте опцию -preserve. Опция -preserve создаст всю структуру пакета в /var/log/setup/tmp/preserved_packages:

# removepkg -preserve bsd-games
...
# ls /var/log/setup/tmp/preserved_packages/bsd-games-2.13-i486-11/
etc/  install/  usr/  var/

В /var/log/setup/tmp/preserved_packages будет создан новый каталог с именем пакета, в данном случае bsd-games-2.13-i486-11. В этом каталоге вы можете найти полное содержание оригинального пакета. Пакет удаляется из исходных каталогов на жёстком диске, а также из метаданных в /var/log/packages. Но вы все равно можете иметь доступ к файлам в каталоге /var/log/setup/tmp/preserved_packages. Для создания копии пакета, без удаления из системы, используйте параметр -copy:

# removepkg -copy bsd-games

С опцией -copy установленный пакет останется нетронут, просто его все файлы будут скопированы в каталог /var/log/setup/tmp/preserved_packages:

# ls /var/log/setup/tmp/preserved_packages/bsd-games-2.13-i486-11/usr/games/a*
/var/log/setup/tmp/preserved_packages/bsd-games-2.13-i486-11/usr/games/adventure*
/var/log/setup/tmp/preserved_packages/bsd-games-2.13-i486-11/usr/games/atc*
/var/log/setup/tmp/preserved_packages/bsd-games-2.13-i486-11/usr/games/arithmetic*
# ls /usr/games/a*
/usr/games/adventure*
/usr/games/arithmetic*
/usr/games/atc*

Для того, чтобы отследить, что же было удалено и т. д., используйте опцию -keep. Во время удаления пакета будет создан отдельный список для файлов, которые должны быть удалены или другое. Эти списки динамически генерируются в каталоге /var/log/setup/tmp:

# removepkg -keep bsd-games
...
# ls /var/log/setup/tmp/
...
delete_list10187

Например, файл delete_list10187 содержит список файлов, которые были удалены:

# less /var/log/setup/tmp/delete_list10187
...
usr/games/
usr/games/adventure
usr/games/arithmetic
...

Как и с installpkg, вы можете удалять пакеты установленные в другой корневой каталог. В отличие от всех параметров для removepkg (обратите внимание, что всем параметрам в installpkg предшествует двойной дефис(--), в removepkg же перед параметром ставится один дефис), здесь нет опции -root. Вместо этого вы должны определить переменную ROOT:

# ROOT=/a removepkg bsd-games

Removing package /a/var/log/packages/bsd-games-2.13-i486-11...
Removing files:
...
  --> Deleting /a/usr/games/adventure
  --> Deleting /a/usr/games/arithmetic
...

Теперь каталог /a будет использоваться в качестве корневого каталога, а пакет будет удален. При выполнении removepkg без каких-либо опций или имён пакетов будет выведена на экран краткая справка:

# removepkg
Usage: removepkg [-copy] [-keep] [-preserve] [-warn] packagename ...

Или просто вызовите man-страницу:

# man removepkg
...

Извлечение пакета

Перед установкой пакета вы можете извлечь его в безопасное место. Вот что такое explodepkg. У explodepkg нет опций или чего-то еще, он просто извлечёт пакет в каталог откуда вы дали команду. Для тестирования создайте новый каталог и перейдите в него:

# mkdir -p /root/txz
# cd /root/txz

Теперь дайте команду explodepkg с именем пакета на примонтированом DVD:

# explodepkg /mnt/loop/slackware/y/bsd-games-2.13-i486-11.txz
Exploding package /mnt/loop/slackware/y/bsd-games-2.13-i486-11.txz in current directory:
...
usr/games/
usr/games/cfscores
usr/games/cribbage
...
An installation script was detected in ./install/doinst.sh, but
was not executed.

Просмотрите текущий каталог с помощью команды ls:

# ls
etc/  install/  usr/  var/

Паккет, который устанавливается в корневой каталог системы, извлечён в текущий каталог.

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

Для обновления пакета используйте upgradepkg. В качестве примера сначала установим в систему пакет bsd-games-2.13-i486-11.txz:

# installpkg /mnt/loop/slackware/y/bsd-games-2.13-i486-11.txz
...

Затем создадим новый каталог и скопируем в него пакет bsd-games, изменив версию паковки на другую(11=>12):

# mkdir -p /root/txz
# cp /mnt/loop/slackware/y/bsd-games-2.13-i486-11.txz /root/txz/bsd-games-2.13-i486-12.txz

Обратите внимание на тэги 11 и 12 в конце имён обоих пакетов. Это будет исходная ситуация для следующих нескольких примеров с пакетами - bsd-games-2.13-i486-11.txz уже установленого в системе, и bsd-games-2.13-i486-12.txz - новым пакетом для обновления. Теперь просто обновим установленный пакет:

# cd /root/txz
# upgradepkg bsd-games-2.13-i486-12.txz

+==============================================================================
| Upgrading bsd-games-2.13-i486-11 package using ./bsd-games-2.13-i486-12.txz
+==============================================================================

Pre-installing package bsd-games-2.13-i486-12...

Removing package /var/log/packages/bsd-games-2.13-i486-11-upgraded-2011-12-12,17:51:53...

Verifying package bsd-games-2.13-i486-12.txz.
Installing package bsd-games-2.13-i486-12.txz:
PACKAGE DESCRIPTION:
# bsd-games (Classic BSD text games collection)
#
# Games that go in /usr/games:  adventure arithmetic atc backgammon
#   banner battlestar bcd caesar canfield cfscores countmail cribbage
#   factor fish fortune gomoku hangman hunt mille monop morse number
#   phantasia pig pom ppt primes quiz rain random robots rot13 sail
#   snake snscore teachgammon trek wargames worm worms wump
#
# Adds a call to 'fortune' to /etc/profile.d/ so that users will get a
# fortune message when they log in.
#
Executing install script for bsd-games-2.13-i486-12.txz.
Package bsd-games-2.13-i486-12.txz installed.

Package bsd-games-2.13-i486-11 upgraded with new package ./bsd-games-2.13-i486-12.txz.

Сначала будут установлены все файлы и каталоги. Затем будут удалены все файлы и каталоги, которые были в старом пакете, но отсутствуют в новом. Будут ли удалены каталоги, зависит от того, были ли они пустыми и т. д. (См. removepkg). В этом случае никаких файлов удалено не было, потому пакеты полностью идентичны. Чтобы выполнить пробный прогон и посмотреть, что произойдет, воспользуйтесь параметром --dry-run (перед этим воссоздайте исходную ситуацию):

# upgradepkg --dry-run bsd-games-2.13-i486-12.txz
bsd-games-2.13-i486-12 would upgrade: bsd-games-2.13-i486-11

Скрипту больше нечего сказать, потому как пакеты полностью идентичны. Если вы хотите обновить пакет, который не был ранее установлен вообще, используйте параметр --install-new. Скрипт upgradepkg установит пакет вместо его обновления.

Сначала удалите все установленные пакеты bsd-games:

# removepkg /var/log/packages/bsd-games*
...

Затем установите новый пакет, с помощью upgradepkg с параметром --install-new:

# upgradepkg --install-new /root/txz/bsd-games-2.13-i486-12.txz

+==============================================================================
| Installing new package /root/txz/bsd-games-2.13-i486-12.txz
+==============================================================================

Verifying package bsd-games-2.13-i486-12.txz.
Installing package bsd-games-2.13-i486-12.txz:
...

Если вы попытаетесь обновить пакет тем же пакетом, который уже установлен, вы получите сообщение об ошибке:

# upgradepkg /root/txz/bsd-games-2.13-i486-12.txz

+==============================================================================
| Skipping package bsd-games-2.13-i486-12 (already installed)
+==============================================================================

You can force upgrading with the --reinstall option:

# upgradepkg --reinstall /root/txz/bsd-games-2.13-i486-12.txz

+==============================================================================
| Upgrading bsd-games-2.13-i486-12 package using /root/txz/bsd-games-2.13-i486-12.txz
+==============================================================================

Pre-installing package bsd-games-2.13-i486-12...

Removing package /var/log/packages/bsd-games-2.13-i486-12-upgraded-2011-12-12,18:06:07...

Verifying package bsd-games-2.13-i486-12.txz.
Installing package bsd-games-2.13-i486-12.txz:
...

Также upgradepkg имеет опцию --verbose для более подробного вывода информации, но в руководстве этот пример не показан, вы можете проверить это самостоятельно.

Чтобы увидеть небольшую справку для upgradepkg, запустите upgradepkg без какой-либо опции или имени пакета:

# upgradepkg

Usage: upgradepkg newpackage [newpackage2 ... ]
       upgradepkg oldpackage%newpackage [oldpackage2%newpackage2 ... ]
...

Или взгляните на man-страницу:

# man upgradepkg
...

Создание простого пакета

Создание пакета в Slackware не очень тяжелая работа. В отличие от rpm или deb это очень просто. Я покажу вам, как скомпилировать небольшую (но очень классную) часть программного обеспечения, как создать подходящую структуру каталогов и, наконец, как создать пакет Slackware, который вы можете устанавливать и удалять с помощью стандартных инструментов installpkg и removepkg. При демонстрации создания пакета для Slackware, я буду использовать Lua, но вы можете использовать любую другую программу. Lua- это очень маленькая и простая в компиляции программка, которая должна работать из коробки. Сначала скачайте исходники программы:

# cd /usr/src
# wget http://www.lua.org/ftp/lua-5.1.4.tar.gz
...

Затем распакуйте пакет и перейдите в каталог с исходниками:

# tar xf lua-5.1.4.tar.gz
# cd lua-5.1.4

Теперь соберите программу, используя команду  make, но не устанавливайте её:

# make linux
...

В каталоге src у можно обнаружить несколько файлов: два бинарных файла (lua и luac), заголовки (lua.h, luaconf.h, lualib.h и lauxlib.h), библиотека (liblua.a) и две man-страницы для lua и luac (lua.1 и luac.1). Теперь нужно создать структуру каталогов, которая будет соответствовать стандарту вашей системы. Бинарные файлы хранятся в /usr/bin, заголовки в /usr/include, библиотеки в /usr/lib и man-страницы в /usr/man:

# mkdir -p /usr/src/build/usr/bin
# mkdir -p /usr/src/build/usr/include
# mkdir -p /usr/src/build/usr/lib
# mkdir -p /usr/src/build/usr/man/man1
# mkdir -p /usr/src/build/install

Выше приведенные команды создали дерево каталогов, необходимых для пакета в каталоге /usr/src/build. Каталог install будет задействован позже. Теперь скопируйте все файлы в предназначенные для них каталоги. Бинарные файлы в /usr/src/build/usr/bin, заголовки в /usr/src/build/usr/include и так далее:

# cd /usr/src/lua-5.1.4
# cp src/lua src/luac /usr/src/build/usr/bin
# cp src/lua.h src/luaconf.h src/lualib.h src/lauxlib.h /usr/src/build/usr/include
# cp src/liblua.a /usr/src/build/usr/lib
# cp doc/lua.1 doc/luac.1 /usr/src/build/usr/man/man1

Убедитесь, что все файлы находится в своих каталогах (tree по-прежнему является одной из моих любимых утилит):

# tree /usr/src/build
/usr/src/build
|-- install
`-- usr
    |-- bin
    |   |-- lua
    |   `-- luac
    |-- include
    |   |-- lauxlib.h
    |   |-- lua.h
    |   |-- luaconf.h
    |   `-- lualib.h
    |-- lib
    |   `-- liblua.a
    `-- man
        `-- man1
            |-- lua.1
            `-- luac.1

Произведите переход в неиспользуемый каталог install. В нём вы должны создать так называемый файл slack-desc, который содержит описание выводимое при установке пакета Slackware. Это может выглядеть так (исходный файл был взят из пакета ppp, а все тексты взяты с http://www.lua.org/about.html):

# cd /usr/src/build/install
# vi slack-desc
# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description.  Line
# up the first '|' above the ':' following the base package name, and the '|'
# on the right side marks the last column you can put a character in.  You must
# make exactly 11 lines for the formatting to be correct.  It's also
# customary to leave one space after the ':'.

   |-----handy-ruler------------------------------------------------------|
lua: lua (a powerful, fast, lightweight, embeddable scripting language)
lua:
lua: Lua combines simple procedural syntax with powerful data description
lua: constructs based on associative arrays and extensible semantics. Lua
lua: is dynamically typed, runs by interpreting bytecode for a
lua: register-based virtual machine, and has automatic memory management
lua: with incremental garbage collection, making it ideal for
lua: configuration, scripting, and rapid prototyping.
lua:
lua:
lua:

Сохраните файл и выйдите из редактора. Наконец, создайте пакет:

# cd /usr/src/build
# makepkg -l y -c n /tmp/lua-5.1.4-i486-1.txz

Вот и все. Сейчас можно установить пакет:

# installpkg /tmp/lua-5.1.4-i486-1.txz
Verifying package lua-5.1.4-i486-1.txz.
Installing package lua-5.1.4-i486-1.txz:
PACKAGE DESCRIPTION:
# lua (a powerful, fast, lightweight, embeddable scripting language)
#
# Lua combines simple procedural syntax with powerful data description
# constructs based on associative arrays and extensible semantics. Lua
# is dynamically typed, runs by interpreting bytecode for a
# register-based virtual machine, and has automatic memory management
# with incremental garbage collection, making it ideal for
# configuration, scripting, and rapid prototyping.
#
Package lua-5.1.4-i486-1.txz installed.

Протестировать работу программы, дав команду lua:

# lua
lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> print "Hello World"
Hello World
> ^D

И удалить пакет (при необходимости):

# removepkg lua

Removing package /var/log/packages/lua-5.1.4-i486-1...
Removing files:
  --> Deleting /usr/bin/lua
  --> Deleting /usr/bin/luac
...

Как видите, создавать пакеты для Slackware очень просто.

Создание сложного пакета

Для сборки более сложного пакета, можно скачать и скомпилировать почтовый сервер dovecot:

# cd /usr/src/
# wget http://www.dovecot.org/releases/2.0/dovecot-2.0.16.tar.gz

Затем распакуйте исходный код и сделайте переход в каталог с исходниками:

# gzip -dc dovecot-2.0.16.tar.gz | tar xf -
# cd dovecot-2.0.16

Далее, запустите скрипт настройки условий компилирования(configure) и скомпилируйте исходники командой make:
 
# ./configure --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib64
...
# make
...

Затем создайте каталог для размещения там файлов и каталогов собираемого пакета:

# mkdir -p /usr/src/build

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

# make install DESTDIR=/usr/src/build
...

В каталоге /usr/src/build у вас должен быть полный комплект файлов пакета dovecot. Структура каталогов почти такая же, как и в корневом каталоге вашей системы /:

# ls /usr/src/build
etc/  usr/

Перейдите в каталог сборки пакета и скопируйте пример конфигурационного файла программы:

# cd /usr/src/build
# cp -r usr/share/doc/dovecot/example-config/* etc/dovecot/

Переименуйте файл dovecot.conf в dovecot.conf.new (ниже я объясню зачем):

# mv etc/dovecot/dovecot.conf etc/dovecot/dovecot.conf.new

В каталоге /etc хранятся конфигурацинные файлы, в каталоге /usr каталоги для бинарных файлов (/bin и /sbin) и т. д. Теперь перейдите в каталог /build и создайте каталог /install, в котором будет храниться информация о пакете Slackware:

# cd /usr/src/build
# mkdir install && cd install

В каталоге  install создайте текстовый файл slack-desc:

# vi slack-desc

# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description.  Line
# up the first '|' above the ':' following the base package name, and the '|'
# on the right side marks the last column you can put a character in.  You must
# make exactly 11 lines for the formatting to be correct.  It's also
# customary to leave one space after the ':'.

       |-----handy-ruler------------------------------------------------------|
dovecot: dovecot
dovecot:
dovecot: add any informational description here
dovecot:
dovecot:
dovecot:
dovecot:
dovecot:
dovecot:
dovecot:
dovecot:

Затем в каталоге install создайте скрипт doinst.sh (исходный скрипт был взят из другого пакета):

# vi doinst.sh

#!/bin/sh
config() {
  NEW="$1"
  OLD="`dirname $NEW`/`basename $NEW .new`"
  # Если конфига с таким именем нет, присвоить это имя новому конфигу:
  if [ ! -r $OLD ]; then
    mv $NEW $OLD
  elif [ "`cat $OLD | md5sum`" = "`cat $NEW | md5sum`" ]; then # удалить конфиг *.new из пакета как лишний
    rm $NEW
  fi
  # В противном случае оставить копию .new на рассмотрение админу ...
}
config etc/dovecot/dovecot.conf.new

Скрипт doinst.sh будет выполнен после установки пакета slackware. При работе скрипта функция config() пытается выяснить, есть ли в системе конфигурационный файл /etc/dovecot/dovecot.conf. Если такой файл найден, то новый файл конфигурации  останется в системе с приставкой .new. Если файл конфигурации dovecot.conf не обнаружен, установленный файл dovecot.conf.new будет переименован в dovecot.conf. Перед созданием пакета, название конфигурационного файла, который необходимо защитить таким способом, вы должны отредактировать в строке (config etc/dovecot/dovecot.conf.new) скрипта doinst.sh.

Создайте пакет:

# cd /usr/src/build
# makepkg -l y -c n /tmp/dovecot-2.0.16-i486-1.txz

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

# mkdir /a

Теперь сымитируйте, как будто бы установленный ранее, файл конфигурации dovecot:

# mkdir -p /a/etc/dovecot
# echo "Sample configuration" > /a/etc/dovecot/dovecot.conf

Проверьте результат своей работы:

# tree /a/
/a/
`-- etc
    `-- dovecot
        `-- dovecot.conf

Установите новый пакет dovecot в альтернативный корневой каталог(...--root /a...):

# installpkg --root /a /tmp/dovecot-2.0.16-i486-1.txz
...

Это как раз тот случай, когда исходный файл doevcot.conf был не тронут, а новый файл конфигурации хранится в каталоге под именем dovecot.conf.new:

# ls /a/etc/dovecot/dovecot.conf*
/a/etc/dovecot/dovecot.conf
/a/etc/dovecot/dovecot.conf.new

Теперь удалите все содержимое из альтернативного корневого каталога /a:

# rm -rf /a/*

И установите в него пакет снова:

# installpkg --root /a /tmp/dovecot-2.0.16-i486-1.txz
...

Проверьте каталог /a/etc на предмет наличия файлов doevcot.conf*:

# ls /a/etc/dovecot/dovecot.conf*
/a/etc/dovecot/dovecot.conf

Каталог содержит только один файл - dovecot.conf, файл dovecot.conf.new распакованный из пакета был переименован в dovecot.conf.