Ключевые слова:slackware, linux, packet, (найти похожие документы)
From: Старик Хоттабыч <old.hottab@gmail.com.>
Newsgroups: email
Date: Mon, 10 Nov 2006 14:31:37 +0000 (UTC)
Subject: Пакеты в Slackware или Как не сделать из системы свалку
Наиболее часто к Slackware-системам предъявляются следующие претензии:
1 - Отсутствие менеджера пакетов
2 - Отсутствие зависимостей
3 - Сложность обновлений
4 - Недостаточное количество софта в дистрибутиве.
Попробуем в этом всем разобраться.....
Итак,
1 - Менеджер пакетов в Slackware ЕСТЬ.
Называется pkgtool. Подробно описано вот здесь:
(SlackBook, глава 18)
Описание формата пакетов:
....В Slackware пакет - это просто tar-архив, сжатый gzip'ом.
Собранные пакеты предназначены для распаковки в корневой
каталог.
Вот пример фиктивной программы и её пакета:
./
usr/
usr/bin/
usr/bin/makehejaz
usr/doc/
usr/doc/makehejaz-1.0/
usr/doc/makehejaz-1.0/COPYING
usr/doc/makehejaz-1.0/README
usr/man/
usr/man/man1
usr/man/man1/makehejaz.1.gz
install/
install/doinst.sh
Система работы с пакетами распакует этот файл в корневой каталог и
установит его. В базе данных пакетов будет создана запись с содержимым
этого пакета, чтобы позже его можно было удалить или обновить.
Обратите внимание на подкаталог install/. Это специальный каталог, в
котором находится скрипт, выполняемый после установки, под названием
doinst.sh. Если менеджер пакетов найдёт этот файл, он запустит его
после установки пакета.
Утилиты работы с пакетами
Для управления пакетами существуют четыре основные утилиты. Они
выполняют установку, удаление и обновление пакетов.
pkgtool(8) - это программа с поддержкой меню, которая позволяет
устанавливать и удалять пакеты.
Установка может быть выполнена из текущего каталога, другого каталога
или с дискет. Просто выберите нужный вам метод установки и pkgtool
начнёт искать в указанном вами месте пригодные к установке пакеты.
Также вы можете просмотреть список установленных пакетов.
Если вам нужно удалить пакеты, выберите опцию Remove и вам будет
представлен список всех установленных пакетов. Отметьте те, которые вы
хотите удалить, и нажмите OK. pkgtool выполнит их удаление.
Некоторые пользователи отдают предпочтение этой утилите, а не утилитам
командной строки. Однако, следует отметить, что эти консольные утилиты
предлагают гораздо больше функций. Кроме того, обновление пакетов
возможно только с помощью утилит командной строки.
installpkg
Утилита installpkg(8) выполняет установку в систему новых пакетов. Её
синтаксис следующий:
# installpkg опция имя_пакета
У installpkg есть только три опции. Одновременно может быть
использована только одна опция.
Опции installpkg
-m Выполняет действие makepkg в текущем каталоге.
-warn Показывает, что произойдёт, если вы установите указанный пакет.
Это полезно для ответственных систем, когда, перед тем как
устанавливать что-либо, вы можете узнать что при этом произойдёт.
-r Рекурсивно устанавливает все пакеты их текущего каталога и ниже.
Имя пакета может содержать маску, которая будет использована при
рекурсивном поиске пакетов для установки.
Если вы определите переменную окружения ROOT перед запуском
installpkg, этот путь будет использован в качестве корневого каталога.
Это полезно для настройки новых дисков для размещения на них корневых
каталогов. Обычно они монтируются в /mnt или какой-то другой каталог,
отличный от /.
Запись в базе данных об установленном пакете хранится в
/var/log/packages. Запись представляет собой обычный текстовый файл,
по одному на пакет. Если в пакете есть послеустановочный скрипт, он
записывается в каталог /var/log/scripts/.
Вы можете указать несколько пакетов или использовать маски в именах
файлов. Учтите, что installpkg не сообщит вам, если будет
перезаписываться уже установленный пакет. Он просто установит его
поверх старого. Если вы хотите, чтобы старые файлы из предыдущего
пакета были безопасно удалены, используйте утилиту upgradepkg.
removepkg
Утилита removepkg(8) удаляет из системы установленные пакеты. Её
синтаксис следущий:
# removepkg опция имя_пакета
У removepkg есть только четыре опции. Одновременно может быть
использована только одна опция.
Опции removepkg
-copy Пакет копируется в специальный каталог для пакетов. Так можно
создать дерево из оригинальных пакетов, не удаляя их.
-keep Сохраняет временные файлы, созданные во время удаления. В
действительности полезно только в целях отладки.
-preserve Пакет удаляется, однако в тоже время он копируется в каталог
для резервных копий.
-warn Показывает, что бы произошло, если бы вы удалили пакет.
Если вы определите переменную окружения ROOT перед запуском removepkg,
этот путь будет использован в качестве корневого каталога. Это полезно
для настройки новых дисков для размещения на них корневых каталогов.
Обычно они монтируются в /mnt или какой-то другой каталог, отличный от /.
removepkg выполняет поиск и в остальных установленных пакетах, но
удаляет только те файлы, которые являются уникальными для указанного
вами пакета. Он также найдёт послеустановочный скрипт для указанного
пакета и удалит все созданные им символические ссылки.
Во время процесса удаления на экран выводится отчёт о ходе его
выполнения. После удаления запись из базы данных пакетов перемещается
в каталог /var/log/removed_packages, а скрипт, выполняемый после
установки, перемещается в /var/log/removed_scripts.
Как и в случае с installpkg вы можете указать несколько пакетов или
использовать маски в именах пакетов.
upgradepkg
Утилита upgradepkg(8) обновляет установленные пакеты Slackware. Её
синтаксис следующий:
# upgradepkg имя_пакета
или
# upgradepkg старое_имя_пакета%старое_имя_пакета
upgradepkg сначала устанавливает новый пакет, а затем удаляет старый
пакет, чтобы в системе больше не осталось старых файлов. Если у
обновляемого пакета изменилось имя, используйте в команде знак
процента для указания старого имени пакета (того, что установлен) и
нового имени пакета (до которого вы выполняете обновление).
Если вы определите переменную окружения ROOT перед запуском
upgradepkg, этот путь будет использован в качестве корневого каталога.
Это полезно для настройки новых дисков для размещения на них корневых
каталогов. Обычно они монтируются в /mnt или какой-то другой каталог,
отличный от /.
upgradepkg не лишён недостатков. Вам всегда следует создавать
резервные копии своих конфигурационных файлов. Если они будут удалены
или перезаписаны, для нормальной работы вам потребуется восстановить
их оригиналы.
Как и в случае с installpkg и removepkg вы можете указать несколько
пакетов или использовать маски в именах пакетов.
rpm2tgz/rpm2targz
Менеджер пакетов Red Hat (Red Hat Package Manager, RPM) - это
популярная на сегодняшний день система работы с пакетами. Многие
распространители программного обеспечения предлагают свои продукты в
формате RPM. Поскольку он не является нашим "родным" форматом, мы не
рекомендуем вам использовать его. Однако некотрые вещи бывают доступны
только в виде RPM (даже исходные тексты).
Мы предлагаем программу для преобразования RPM-пакетов в наш родной
формат .tgz. Это позволит вам развернуть пакет (возможно, с помощью
explodepkg) во временный каталог и изучить его содержимое.
Программа rpm2tgz создаст пакет Slackware с расширением .tgz, а
rpm2targz создаёт архив с расширением .tar.gz.
2 - Нет зависимостей.
Зависимости ЕСТЬ. Может быть, не настолько суровые, как в rpm-based, но
есть. ОТСЛЕЖИВАНИЯ зависимостей нет. Эта процедура перекладывается на
пользователя. Насколько это хорошо/плохо - трудно сказать однозначно.
При отсутствии автоматического отслеживания зависимостей есть риск не
поставить необходимый пакет, но в Slackware пакеты более
крупноформатные (если можно так выразится). К примеру:
apache:
Mandriva: 6,921,441 байт в 9 файлах
Slackware: 1,695,912 байт в 1 файле
php:
Mandriva: 634,063 байт в 21 файлах
Slackware: 7,254,109 байт в 1 файле
perl:
Mandriva: 28,335,674 байт в 110 файлах
Slackware: 13,146,478 байт в 1 файле
python:
Mandriva: 16,646,441 байт в 40 файлах
Slackware: 11,716,884 байт в 1 файле
Естественно, я не утверждаю, что функиональность абсолютно идентична.
Данный пример приведен только с целью показать разницу в подходах к
формированию пакетов.
(Mandriva взята не из каких-либо личных предпочтений, просто оказалась
под рукой... :) )
Очевидно, что в случае с Mandriva установить нечто приемлемо работающее
без автоматического отслеживания зависимостей ОЧЕНЬ сложно. Кроме, разве
что, случая полной установки.. :)
В Slackware вероятность недоставить необходимый пакет гораздо ниже, хотя
и присутствует.
С другой стороны, при наличии в пакете двух вариантов программы -
консольного и графического, Вам не поставят по зависимостям иксы, если
Вы ими не пользуетесь.
3 - Обновления.
Механизм обновлений наличествует.
( SlackBook, глава 14.3 )
Каталог /patches
Все обновлённые пакеты, выпущенные для определённой версии Slackware
(обычно только для устранения проблем с безопасностью для уже вышедших
релизов Slackware), помещаются в каталог /patches. Полный путь к этим
патчам будет зависеть от используемого вами зеркала, однако в общем
случае он будет иметь такой вид /путь/к/slackware-x.x/patches/.
Перед установкой этих пакетов неплохо было бы проверить md5sum пакета.
md5sum(1) - это консольная утилита, создающая "уникальный"
математический хэш файла. Если в файле будет изменён хотя бы один бит,
для него будет сгенерировано совершенно другое значение md5sum.
% md5sum пакет-<версия>-<архитектура>-<ревизия>.tgz
6341417aa1c025448b53073a1f1d287d пакет-<версия>-<архитектура>-<ревизия>.tgz
Затем вам следует сравнить это со строкой для этого пакета из файла
CHECKSUMS.md5, находящегося в корне каталога slackware-$ВЕРСИЯ (а
также в каталоге /patches в патчами), или из электронного письма из
рассылки slackware-security.
Если у вас есть файл с md5-суммами, в можете использовать его в
качестве источника для проверки командой md5sum с опцией -c.
# md5sum -c CHECKSUMS.md5
./ANNOUNCE.10_0: OK
./BOOTING.TXT: OK
./COPYING: OK
./COPYRIGHT.TXT: OK
./CRYPTO_NOTICE.TXT: OK
./ChangeLog.txt: OK
./FAQ.TXT: FAILED
Как видите, все файлы, для которых суммы сошлись, md5sum отметил в
списке как "OK", а файлы, для которых суммы не сошлись, отмечены как
"FAILED".
При использовании какой-либо версии Вы всегда можете осведомиться об
имеющихся обновлениях по адресу
ftp://ftp.slackware.com/pub/slackware/slackware-<Ваша_версия>/patches/
или с ближайшего зеркала.
Обновления происходят предельно просто: загружаете с сервера необходимый
пакет, говорите
upgradepkg пакет
все, пакет обновлен.
(Естественно, для важных пакетов стоит предварительно сохранить
конфигурационные файлы. Хотя upgradepkg и не портит их, но мало ли.....)
Можно воспользоваться сторонними (пока что) утилитами
slapt-get - http://software.jaos.org/slackpacks/11.0/gslapt-0.3.15-i386-1.tgz
или
swaret - http://swaret.sourceforge.net/
Они автоматизируют многие шаги.
Вплоть до полностью автоматического обновления.
ВНИМАНИЕ!
Если вы пользуетесь каким-либо релизом, не стоит обновляться с дерева
-current! ( Разве что Вы захотите пощекотать себе нервы... )
Хотите иметь стабильно работающую систему - обновляйтесь из
соответствующих patches.
4 - Установка недостающего софта.
Посмотрите внимательно на собственный диск со Slackware. (или на
ближайший репозитарий) (:))
Там есть такой каталожек, extra называется, много чего интересного в нем
найти можно..... k3b, например....
Если там необходимого пакета не оказалось, можно отправиться на поиски в
инет.
Самый известный ресурс слаковских пакетов - linuxpackages.net. Пакетов
много, но..... Тамошняя публика, как правило, не утруждает себя
выкладыванием SlackBuild'ов... :( К тому же мдавтьногие пакеты собраны с
весьма странными зависимостями....
Собираем сами.
Ну, самый известный способ установки нужной программы -
configure && make && make install
Можете так и делать.
Если хотите привести свою систему в неуправляемое состояние.
...
ИМХО, данный подход оправдан только в одном случае: надо глянуть одним
глазом, что это за софтина, причем делается это не на критичной машине.
То есть на такой, которую со спокойной душой можно в любой момент
переставить начисто.
Во всех остальных случаях КРАЙНЕ рекомендуется сделать пакет.
Вариантов два:
1. пишем свой SlackBuild, что, ИМХО, предпочтительнее, так как серьезно
снижается головная боль при повторной сборке того же софта. ( Вышла новая
версия, собираем с другими параметрами, да мало ли... ) подробнее - вот
здесь:
( SlackBook, глава 18.3 )
Создание пакетов
Создание пакетов Slackware может быть как простым, так и сложным. Не
существует чёткого метода для сборки пакетов. Единственное требование
- пакет должен был tar-файлом, сжатым gzip'ом, и если в нём есть
послеустановочный скрипт, это должен быть /install/doinst.sh.
Если вы заинтересованы в создании пакетов для своей системы или для
обслуживаемой вами сети компьютеров, вам следует ознакомиться с
различными сборочными скриптами, доступными в дереве исходных текстов
Slackware. При создании пакетов мы используем несколько различных
методов.
explodepkg
Утилита explodepkg(8) делает то же самое, что и installpkg делает при
установке пакета, однако на самом деле она не устанавливает его и не
делает запись в базе данных пакетов. Она просто извлекает содержимое
пакета в текущий каталог.
Если вы посмотрите на дерево исходных текстов Slackware, вы увидите,
как мы используем эту команду для пакетов "framework". Эти пакеты
содержат каркас будущего пакета. В них находятся все необходимые имена
файлов (нулевой длины), права доступа и владельцы. Скрипт сборки
извлекает содержимое пакета из каталога с исходными текстами и
помещает его в каталог сборки.
makepkg
Утилита makepkg(8) упаковывает содержимое текущего каталога в пакет
Slackware. Он найдёт в дереве символические ссылки и добавит в скрипт,
выполняемый после установки, блок команд, создающих эти ссылки во
время установки пакета. Он также предупреждает вас о наличии в дереве
пакета файлов нулевого размера.
Эта команда обычно запускается после того, как вы создали дерево
своего пакета.
Скрипты SlackBuild
При необходимости пакеты Slackware могут быть собраны и другими
способами. Не всё программное обеспечение в виде пакетов написано
программистами для компиляции одним и тем же способом. Во многих есть
опции компиляции, которые не используются в пакетах Slackware.
Возможно, когда-то вам понадобятся эти функциональные возможности.
Тогда вам придётся собрать свой собственный пакет. К счастью у многих
пакетов Slackware в дереве исходных текстов пакета вы можете найти
скрипты SlackBuild.
Что же такое скрипт SlackBuild? Скрипты SlackBuild представляют собой
исполняемые скрипты командного процессора, запускаемые вами под
root'ом для настройки, компиляции и создания пакетов Slackware. Вы
можете свободно изменять эти скрипты в дереве исходных текстов и
запускать их для создания своих собственных версий стандартных пакетов
Slackware.
2. пользуемся checkinstall. (Живет в extra, так что далеко на поиски
ходить не надо).
Выглядит это предельно просто:
./configure <ваши_параметры> && make && checkinstall.
Все, Вы имеете готовый для установки пакет.
Позволю себе дать несколько рекомендаций. Следовать им, или нет - Ваше дело.
Изначально в Slackware каталог /usr/local пустой. Нет, дерево каталогов
там присутствует, но файлов там нет.
Как на меня, это очень предусмотрительно.
Почему?
Как известно, за редчайшим исключением, ./configure && make && make
install поставит софтину именно в /usr/local.
То есть
1. Вы не сотрете ненароком имеющуюся софтину,
2. Если то, что Вы собрали, Вас не устроило, можно спокойно удалить, не
рискуя прибить ненароком чужое.
Естественно, если Вы туда ставите все подряд и много, свалка там
получится еще та....
Поэтому и стоит делать пакеты.
Собрали пакет, поставили, не понравилось -
removepkg пакет
И все. "уже никто никуда не идет" :).
Вышла новая версия - собрали новый пакет -
upgradepkg пакет
- все, новая софтинка уже стоит.
Я уже не говорю о том, что собирая пакеты так, как это делает Патрик, Вы
спокойно можете делиться плодами своего труда с другими. (Или
тиражировать собранную софтинку на несколько машин, находящихся под
Вашим командованием. )
Итак, если Вы уверены в корректности Вашего пакета, НЕ собирайте его в
/usr/local. Оставьте этот каталог для экспериментов.
Ежели софтинка малознакомая, или нет уверенности в корректной работе,
или еще какие сомнения - тогда в /usr/local.
Естественно, это все всего лишь рекомендации, следовать им или нет -
Ваше личное дело.