Subsections

Многото лица на debconf

Като frontend към пакетите ползващи debconf като конфигиратор може да използвате пакета configure-debian. При стартирането на едноименната команда се появява списък на тези пакети групирани тематично.

Обработване на конфигурационните файлове на пакетите

Това става чрез debconf-скриптове, извиквани от maintainer scripts:

# apt-get install base-files
Preparing to replace base-files 3.0.5 (using .../base-files_3.0.6_i386.deb)...
Unpacking replacement base-files ...
Setting up base-files (3.0.6) ...
Configuration file `/etc/profile'
==> Modified (by you or by a script) since installation.
==> Package distributor has shipped an updated version.

What would you like to do about it ? Your options are:

Y or I : install the package maintainer's version
N or O : keep your currently-installed version
D : show the differences between the versions
Z : background this process to examine the situation

The default action is to keep your current version.
*** profile (Y/I/N/O/D/Z) [default=N] ? I

Installing new version of config file /etc/profile ...

Манипулация на файлове от други пакети

Divertions на файлове е начин да се укаже на dpkg(8) да инсталира даден файл или файлове от даден пакет не точно на неговото място, а на друго, с цел добавяне на някаква допълнителна функционалност. Обикновено от maintainer scripts се извиква dpkg-divert(8), така щото файлове от даден пакет да могат да бъдат модифицирани при инсталирането или премахването на този пакет. Това например се наблюдава при инсталирането и премахването на пакета dpkg-cross. Нека преди да инсталираме dpkg-cross да направим следната проверка, т.е. с кой пакет идва скрипта /usr/bin/dpkg-buildpackage:

# dpkg -S /usr/bin/dpkg-buildpackage
dpkg-dev: /usr/bin/dpkg-buildpackage

Нека сега да инсталираме dpkg-cross и да наблюдаваме неговото поведение:

# apt-get install dpkg-cross
Reading Package Lists... Done
Building Dependency Tree... Done
The following NEW packages will be installed:
dpkg-cross
0 packages upgraded, 1 newly installed, 0 to remove and 19 not upgraded.        
Need to get 43.7kB of archives. After unpacking 205kB will be used.
Get:1 ftp://ftp.de.debian.org stable/main dpkg-cross 1.13.1 [43.7kB]
Fetched 43.7kB in 27s (1607B/s)
Selecting previously deselected package dpkg-cross.
(Reading database ... 154258 files and directories currently installed.)
Unpacking dpkg-cross (from .../dpkg-cross_1.13.1_all.deb) ...
Adding `diversion of /usr/bin/dpkg-buildpackage to
/usr/bin/dpkg-buildpackage.orig by dpkg-cross'
Adding `diversion of /usr/bin/dpkg-shlibdeps to
/usr/bin/dpkg-shlibdeps.orig by dpkg-cross'
Setting up dpkg-cross (1.13.1) ...
Updating Debian Packages of System Configurations.

Обърнете внимание какво ни се съобщава с реда Adding diversion.... Файлът /usr/bin/dpkg-buildpackage е бил преименуван на /usr/bin/dpkg-buildpackage.orig, т.е. заместен с друга версия на този файл, идваща с пакета dpkg-cross. Това се прави от неговия postinst-скрипт, който освен в директория debian в сорс пакета можете да намерите и в /var/lib/dpkg/info/dpkg-cross.postinst, след неговото инсталиране, разбира се. Този файл ще бъде върнат в предишното си състояние при премахването на пакета dpkg-cross. Това се прави от неговия prerm-скрипт. Този diversion, извършван от dpkg-cross, в случая е необходим, за да се модифицира скрипта dpkg-buildpackage, така че да може да поддържа крос-компилиране. За повече детайли вижте документацията на dpkg-cross. Забележете, че dpkg-cross изисква наличието на пакета dpkg-dev, в който се съдържа оригиналния скрипт /usr/bin/dpkg-buildpackage и който ще бъде модифициран:

# apt-cache show dpkg-cross | grep Depends
Depends: dpkg-dev, perl5 | perl

След като сме инсталирали dpkg-cross, проверяваме какво ще ни каже dpkg -S за /usr/bin/dpkg-buildpackage:

# dpkg -S /usr/bin/dpkg-buildpackage
diversion by dpkg-cross from: /usr/bin/dpkg-buildpackage
diversion by dpkg-cross to: /usr/bin/dpkg-buildpackage.orig
dpkg-cross, dpkg-dev: /usr/bin/dpkg-buildpackage

Т.е. вече е регистриран факта за модификацията на оригиналния скрипт /usr/bin/dpkg-buildpackage и потребителя се информира за това, когато попита с dpkg -S.

Нека сега премахнем пакета dpkg-cross и пак да наблюдаваме какво става:

# apt-get --purge remove dpkg-cross
Reading Package Lists... Done
Building Dependency Tree... Done
The following packages will be REMOVED:
dpkg-cross*
0 packages upgraded, 0 newly installed, 1 to remove and 19 not upgraded.
Need to get 0B of archives. After unpacking 205kB will be freed.
Do you want to continue? [Y/n]
(Reading database ... 154276 files and directories currently installed.)
Removing dpkg-cross ...
Removing `diversion of /usr/bin/dpkg-buildpackage to
/usr/bin/dpkg-buildpackage.orig by dpkg-cross'
Removing `diversion of /usr/bin/dpkg-shlibdeps to
/usr/bin/dpkg-shlibdeps.orig by dpkg-cross'

Purging configuration files for dpkg-cross ...
Updating Debian Packages of System Configurations.

Обърнете внимание, че вече ни се съобщава за Removing diversion .... Т.е. нещата се връщат наистина в изходна позиция. Естествено, пак ще попитаме:

# dpkg -S /usr/bin/dpkg-buildpackage        
dpkg-dev: /usr/bin/dpkg-buildpackage

Вече се съобщава само за dpkg-dev и нямаме наличието на diversion, която беше добавена от dpkg-cross. Т.е. след тези гимнастики имаме чисто премахване, въпреки промените и по файлове от чужди пакети, осъществавяни от dpkg-cross.

Реализацията с код на това не е сложна, разбира се. Важното е, че е предвиден и подобен начин на модификация на файловете, идващи с пакетите.


Nikola Antonov 2004-10-31