Subsections
Целта на този процес е да се организира изграждането на сорс и бинарни
пакети, които да бъдат обработвани от инструментите за пакетиране, инсталиране,
премахване и преконфигуриране. Целта е в системата да има установен ред и правила
при изпълнението на тези дейности с което наистина ще държим нещата под наш
контрол, независимо колко е голяма инсталираното от системата,
знаейки какво е инсталирано, как е инсталирано, с чисто премахване или
надграждане на нещо вече инсталирано. Debian е известен с легендарните си
способности за чисто инсталиране и надграждане на пакетите на системата. В тази глава
ще се постараем да обясним къде е генезиса на всичко това и то да не изглежда просто
като легенда, а като рутинна практика при всекидневното използване на системата.
Като реален пример може да се посочи десктопа на един от авторите който е система
първоначално инсталирана преди около 5 години (към момента на писане на тази глава).
Системата разбира се е подложена на всекидневни упгрейди, инсталации на нови пакети или
тяхното премахване и други по-необичайни дейности, при които проблеми може и да има,
но те са решими. През повечето време системата изглежда като току-що инсталирана. Чиста.
Разбира се, това съвсем не значи, че в някой директории като /usr/local/ и в
домашните директории на потребителите не може да се води война от инсталиране и премахване
на каквото ви душа иска. Напротив, това не е територия на системата и е изцяло на вашата
воля, какво ще правите там. Е, с глупави и опасни програми не си губете времето, внимавайте
какво инсталирате и къде особено когато използвате суперпотребителя root.
Научете Debian отвътре за да подчините и експлоатирате възможностите му за
вашите потребителски цели.
- За да разберем какво съдържа един дебиански пакет, вземаме кой да е
такъв и пробваме командите dpkg-deb -x и dpkg-deb -е върху него.
- За да разберем какво представлява изходния код на един дебиански пакет,
вземаме изходния код на пакета hello, поглеждаме набързо .dsc файла,
а останалите два файла разпакетираш по два начина:
- с dpkg-source
- ръчно с tar и patch
- Разглеждаме съдържанието на директорията debian в изходния код на пакета
hello. Ползваме Debian Policy Manual
като справочник или това е в пакета debian-policy.
- Когато нещата станат ясни, правиме същото с пакета hello-debhelper, използвайки
debhelper(7) като справочник. Имайте на предвид, че debhelper улеснява значително
създаването на дебиански пакети автоматизирайки извършването на много рутинни и повтарящи се дейности.
- През свободното време четем:
- Вземаме програмата която искаме да пакетираме и копираме в изходния й код директорията
debian от пакета hello-debhelper, като пригодяваме нещата за да генерираме
нашия deb-пакет. Следващия път няма да използваме hello-debhelper, а някой вече
съществуващ изготвен от нас пакет.
- Когато разберем какво значи Intend To Package, изпращаме ITP съобщение,
за да не би някой друг да реши да пакетира същата програма и да си дублирате усилията. Ако
все още не сме одобрени за upload в официалното хранилище, можем да използваме
Mentors Public Package Repository
На практика, след като се установи, че даден софтуер си заслужава да се
включи в официалния архив от пакети на Debian, се изготвя
debian source package, който включва upstream source
и директорията с maintainer scripts. От този debian
source package след това се получават debian binary
packages (deb-файлове) за различните хардуерни
архитектури, като се отчита и фактът, че има и такъв софтуер, който не
е пригоден или предвиден за всички хардуерни архитектури, а само за
една или няколко. Обикновено за получаването на базовите или начални
версии на maintainer scripts за debian/ се използват
Perl-скриптовете от пакета debhelper, след което се донастройват
специфичните за пакета неща. В крайна сметка се създава унифицирано
управление на процеса по конфигуриране на сорса, компилация, свързване
и евентуално последващо конфигуриране и преконфигуриране на софтуера
за различните хардуерни архитектури. Разбира се, maintainer
scripts не изместват стандартните GNU devel tools, а
работейки преди или над тях, ги използват по подходящ начин.
Естествено, в крайна сметка се извикват стандартните GNU devel
tools чрез файла debian/rules, който се явява стандартен
файл за програмата make, само че не е именуван като
Makefile, а започващ с shebang (#!) ред в
началото си, указващ пътя до make. Използват се още доста
файлове в maintainer scripts и пример за това как точно
стават нещата, е даден в Debian New Maintainers'
Guide. Едно доста добро
обяснение като за начало би бил документът на IBM -
Learn how to build easy-to-distribute packages for Debian users.
Ще обясним накратко кои пакети и кои програми идващи с тях обикновено
се използват при този процес. Тук ще дадем само някои насоки, което не
изключва прочитането на man(1) страниците на програмите и документацията
в директориите /usr/share/doc/име_на_пакет/. Имайте предвид, че
постоянно могат да се появяват такива, но възлагайте на тях само рутинната част по
създаването на файловете необходими за пакетиране, след което лично се убедете
в тяхното съдържание и нанесете съответните корекции, така щото сорс пакета
който създавате да се получат съответните бинарни пакети ( deb(5)) в
съответствие с всички правила и норми. Процеса може да бъде много прост и
рутинен, но и много сложен и необичаен, всичко зависи от това какъв сорс
пакетирате и как точно сте решили да го направите.
Съдържа програмата dh_make(8), която се използва
за първоначалното създаване на директорията debian и файловете в нея.
С други думи спестява ви тази рутинна дейност, но задължително трябва да разгледате
файловете и да внесете необходимите промени за точно този сорс пакет който дебианизирате.
Дотук вече трябва да сте добили представа как се борави с debian binary packages
(или deb(5)). Нека видим как се получават те. Захващаме се да разберем какво има и в
debian source packages. Само да напомним, че без да сте прочели
Debian New Maintainer's Guide, още достъпен
и като пакет maint-guide, или поне да сте прехвърлили с поглед
стария му превод,
ще ви е доста трудно да разберете за какво ще се говори в следващата глава.
Пакетът dh-make съдържа скрипта dh_make(8), който
генерира debian source package от regular source code archive
(или upstream sources), подготвя control-файловете,
както и предоставя примерна конфигурация за debhelper(1)
инструментите, за която конфигурация обикновено е необходимо само
малко донастройка, за за да пасне за конкретния случай. Или с други
думи, dh-make се използва за създаване на скелета или общия вид
на debian source package, след което може да доредактирате файловете в
директория debian/ както намерите за добре. По-опитните
maintainers могат и без него, но силно се препоръчва да се използва от
начинаещите потребители, при което по-лесно и бързо ще свикнат с
процеса на конфигуриране на debian source packages. Използва се
например така:
# cd program-source-directory
# dh_make -e your.maint@address -f ../programname-x.y.z.tar.gz
Разбира се, ще отговорите на няколко въпроса, като дали това ще е
single или multiple binary packages, библиотеки и прочее. За повече се
обърнете към Debian New Maintainer's
Guige, главата First Steps,
т. 2.4 Initial Debianization.
Съдържа колекция от мощни Perl скриптове които
можете да извиквате от debian/rules, който обикновено е файл за
програмата make(1), както и от други скриптове като
.preinst,.postinst,.prerm,.postrm. Скриптовете са много, просто изпълнете:
dpkg -L denhelper за да ги видите.
Скриптовете dh_* от пакета debhelper се извикват от
maintainer scripts в debian source packages, и по точно от файла
debian/rules. Използват се за автоматизиране на процедурите
по построяването на debian binary packages, а именно, като инсталиране
на определени файлове в дадения пакет, компресиране, установяване на
съответните права и собственост, интегриране с debian menu system и
много други. Повечето debian source packages използват скриптовете на
debhelper като част от техния build процес.
Ето и какви Perl скриптове се съдържат във версия 4.0.2 на пакета
debhelper. За да ги листнем, изпълняваме:
$ dpkg -L debhelper | grep usr/bin
Следват кратки обяснения за скриптовете от пакета debhelper:
- dh_builddeb(1): извиква dpkg(8) да билдва пакети.
- dh_clean(1): почиства build директорията на пакета.
- dh_compress(1): компресира файлове и оправя символните
връзки в билд директорията на пакета.
- dh_fixperms(1): оправя правата на файловете в билд
директорията на пакета.
- dh_gencontrol(1): генерира и инсталира
control-файла в билд директорията на пакета.
- dh_install(1): инсталира файлове, които не се нуждаят от
специална обработка в билд директорията на пакета. За някои
по-специални файлове са предвидени и по-специални скриптове.
- dh_installchangelogs(1): инсталира
changelog-файловете в билд директорията на пакета
- dh_installcron(1): инсталира cron скриптове в
etc/cron.*
- dh_installdeb(1): в DEBIAN директорията
инсталира файловете:
- package.postinst
- package.preinst
- package.postrm
- package.prerm
- package.shlibs
- package.conffiles
- dh_installdebconf(1): инсталира файловете,
използвани от debconf(7) в билд директорията на пакета.
- dh_installdirs(1): създава поддиректориите в билд
директорията на пакета.
- dh_installdocs(1): инсталира документацията в билд
директорията на пакета.
- dh_installemacsen(1): за някои пакети е възможно или е
необходимо да се извършва byte-compiling по време на инсталацията.
Такъв пример е Emacs (е то оставаше точно пък той да не е ;-). Ако
вашият пакет се нуждае подобна функционалност, точно този
dh_*-скрипт ще извикате от файла debian/rules.
- dh_installexamples(1): инсталира examples файловете в
билд директорията на пакета, или по-точно в
usr/share/doc/пакет/examples. Файлът
debian/packages.examples може да съдържа списък с други
файлове, които да бъдат инсталирани.
- dh_installinfo(1): инсталира info-файловете. Файлът
debian/packages.info може да съдържа списък с други
файлове, които да бъдат инсталирани.
- dh_installinit(1): инсталира init-скриптове в билд
директорията на пакета.
- dh_installlogrotate(1): инсталира конфигурационните
файлове за logrotate
- dh_installman(1): инсталира man-файловете. Файлът
debian/packages.manpages може да съдържа списък с други
файлове, които да бъдат инсталирани
- dh_installmanpages(1): това е стария аналог на предната
команда, вместо него използвайте dh_installman(1)
- dh_installmenu(1): инсталира debian menu файловете в билд
директорията на пакета. Автоматично генерира postinst и
postrm, необходими да взаимодействат в пакета menu.
Ако има файл debian/package.menu, то той се инсталира в
usr/lib/menu/package в билд директорията на пакета (това е
debian menu файлът, menufile(5L)). Ако има файл
debian/package.menu-method, то той се инсталира в
etc/menu-methods/пакет в билд директорията на
пакета. Tова е debian menu method файл. За повече информация вижте
update-menus(1).
- dh_installmime(1): инсталира MIME-файловете в билд
директорията на пакета. Ако има файл debian/package.mime,
то той се инсталира в usr/lib/mime/packages/пакет
в билд директорията на пакета.
- dh_installmodules(1): регистрира kernel-модули
посредством modutils. Ако има файл
debian/package.modules, то той ще бъде инсталиран в
etc/modutils/пакет
- dh_installpam(1): инсталира файловете за поддръжка на
PAM. Ако има файл debian/package.pam, то той ще бъде
инсталиран като etc/pam.d/пакет.
- dh_installwm(1): регистрира window manager. Файлът
debian/package.wm може да съдържа списък с други прозоречни
манежери.
- dh_installxaw(1): инсталира конфигурационните файлове на
Xaw wrappers в билд директорията на пакета. Ако има файл
debian/package.xaw, то той ще бъде инсталиран в
usr/lib/xaw-wrappers/config/пакет в билд
директорията на пакета.
- dh_installxfonts(1): регистрира шрифтовете за X
- dh_link(1): създава символни връзки в билд директорията
на пакета
- dh_listpackages(1): листва binary packages, за които ще
се използва debhelper
- dh_makeshlibs(1): генерира shlibs-файл
- dh_md5sums(1): генерира DEBIAN/md5sums файл.
- dh_movefiles(1): файлът debian/package.files
съдържа списък с файловете, които да бъдат преместени от
debian/tmp в subpackages. Използвайте
dh_install(1), която напълно я замества, като може и доста
други работи.
- dh_perl(1): генерира зависимостите на Perl скриптовете
вкл. и Perl модулите, от които зависят
- dh_shlibdeps(1): генерира зависимостите за споделените
библиотеки (много яка проверка)
- dh_strip(1): стрипва или премахва дебъг символите от
изпълнимите и библиотечните файлове, за да се намали размера им
- dh_suidregister(1): не ползвайте този скрипт! Оставен е
само за обратна съвместимост. Вместо него използвайте
dpkg-statoverride(8).
- dh_testdir(1): тества директорията преди да се билдва
пакета. Проверява за наличието на debian/control, както и
за някой други основни файлове.
- dh_testroot(1): проверява за това дали пакетът се билдва
от потребителя root. За справка fakeroot(1).
- dh_testversion(1): не ползвайте този скрипт! Проверява
дали е инсталирана правилната версия на пакета debhelper.
Вместо него се използват dependencies и conflicts от
control файла.
- dh_undocumented(1): създава символна връзка към
undocumented.7.gz. В случай, че пакетът няма man
страница, разбира се.
Разбира се, не при всички debian source packages ще се извикват всички
dh_* скриптове. Това ще зависи от съответния пакет, както и
от решенията на maintainer-а. Най-добре ще е първо да изчетете добре
man-стрaниците за тези скриптове, както и четенето на самите скриптове
(Perl) не пречи, разбира се. Вземете, например, сорса на MPlayer от
CVS или някое негово издание и разгледайте файла debian/rules
за това какви dh_* скриптове се извикват от него. Същото
можете да направите и с който и да е debian source package, включен в
официалния Debian архив. Другото, което е добре да направите, е да
разгледате самия debhelper като debian source package, и по
специално неговата директория debian/ и естествено
Perl-скриптовете, които предоставя. Изпълняваме:
# apt-get source debhelper
Унифициран начин пакетите да задават въпроси на потребители при първоначално
инсталиране, последващо преконфигуриране и премахване.
Съвременният начин. zless /usr/share/doc/devscripts/README.gz
Предвиден е да облекчи живота на Debian package maintainers. Съдържа следните
скриптове, като dependencies/recommendations са показани в счупените скоби:
- bts(1): Команда за комуникиране с Bug Tracking System
[ www-browser, mailx]
- dch(1), debchange(1): Автоматично добавя entries към
debian/changelog файловете
- debclean(1): Пречиства (purge) a Debian source tree
[ fakeroot]
- debuild(1): Wrapper за билдване на пакети без да е
необходимо да се изпълнява su или да се мисли как да се
стартира dpkg(8) да билдва, използвайки fakeroot(1). Също
така се оправя с общите проблеми на средата, umask и т.н.
[ fakeroot, lintian, gnupg]
- debdiff(1): Сравнява две версии на Debian package, за да
привери за добавени или премахнати файлове [ wdiff,
patchutils]
- debpkg(1): Dpkg wrapper за менажиране и тестове на пакети
без su [ perl-suid]
- debi(1), debc(1): скриптове за инсталиране на пакети
и извличане на тяхното съдържание
- debit(1): скрипт за инсталиране на пакети и тестването им
с debian-test [ debian-test]
- debrelease(1): Wrapper за dupload или dput
[ dupload | dput, ssh]
- dscverify(1): Проверка целостта на Debian package от
файловете .changes или .dsc [ gnupg,
debian-keyring, libdigest-md5-perl]
- debsign(1), debrsign(1): подписване на двойката
файлове .changes/.dsc без да необходима останалата
част от пакета; двойката файлове може да се подписва отдалечено или
да се изтеглят файловете и да се подпишат локално [ gnupg,
debian-keyring, ssh]
- dpkg-depcheck(1), dpkg-genbuilddeps(1): Определя
използваните пакети по време на build на даден Debian package;
удобен за определяне на Build-Depends в control
файла [ build-essential, strace]
- grep-excuses(1): grep(1) на файла
update_excuses.html за дадени пакети [ libwww-perl]
- mergechanges(1): merge на .changes файловете от
пакет, който е билднат за друга хардуерна архитектура
- plotchangelog(1): показва графика на данните от
changelog файла [ libtimedate-perl, gnuplot]
- uupdate(1): интегрира upstream промените в debian source
package [ patch]
- uscan(1): сканира upstream сайтовете за нови издания. Също
така са включени и няколко примерни mail filters за филтриране на
пощата от пощенските списъци на Debian чрез exim,
procmail и др. [ libwww-perl]
Старият начин. Това е още един от пакетите, предназначени за
разработка и поддръжка на Debian source packages. Но този пакет се
използва все по-рядко.
- deb-make(1L): генерира debian source package от upstream
source код. Настройва файловете control. Предоставя примерна
конфигурация за debstd, която в повечето случаи е използваема с
минимална нужда от доредактиране
- debstd(1L) разполага със следните възможности:
- автоматизира компресирането и инсталирането на документацията
- генерира multiple binaries от един-единствен debian source
package
- генерира maintainer scripts и ги инсталира на подходящите
места с подходящите права.
- може да модифицира много от debian config files чрез
генериране на подходящи maintainer scripts.
- извиква dpkg-shlibdeps(1) за всички ELF binaries и
генерира коректен shlibs файл за дадените библиотеки автоматично.
- проверява symlinks за manpages / documentation и пренасочва в
случай, че е необходимо.
FIXME: да се започне и довърши step-by-step пример за:
Примерни apt хранилища с binary и source пакети:
Nikola Antonov
2004-10-31