Розділ 6. Основи системи управління пакунками Debian

Що таке пакунок Debian?

Пакунок зазвичай містить всі файли, що потрібні для реалізації певних команд чи можливостей. Є два типи пакунків Debian:

  • двійкові пакунки, що містять виконувані і конфігураційні файли, сторінки довідки info/man, інформацію про авторські права та іншу документацію. Ці пакунки поширюються у специфічному для Debian архівному форматі (дивись параграф 6.2); як правило вони відрізняються закінченням .deb (про всяк випадок пригадаю, що закінчення файлу у Linux не виконує такої визначальної ролі, як розширення файлу у Windows - примітка перекладача). Двійкові пакунки можуть бути розпаковані за допомогою спеціального інструменту - dpkg; деталі розписані у його довідці.
  • джерельні пакунки, котрі містять файл .dsc, що описує пакунок (включаючи імена наступних файлів), файл .orig.tar.gz, що містить оригінальний, незмінений джерельний код у форматі tar, стиснутому gzip'ом, та зазвичай diff.gz файл, що містить специфічні для Debian зміни джерельного коду. Утиліта dpkg-source запаковує та розпаковує джерельні архіви Debian; деталі описуються у її довідці.

Встановлення програмного забезпечення за допомогою системи керування пакунками послуговується "залежностями", які старанно формуються поширювачами пакунків. Ці залежності описані у файлі control, що зв'язаний з кожним пакунком. Наприклад, пакунок, що містить компілятор GCU C (gcc) "залежить" від пакунка binutils, котрий включає в себе зв'язувач (linker) та асемблер. Якщо користувач спробує встановити gcc не маючи при цьому встановленого binutils, система керування пакунками (dpkg) надрукує повідомлення про помилку та зупинить установку gcc (проте наполегливий користувач може скорегувати таку поведінку; дивись dpkg(8)). За деталями зверніться до параграфу 6.9.

Пакувальні інструменти Debian можуть вживатись для:

  • маніпуляцій та керування пакунками чи частинами пакунків;
  • допомоги користувачу у разі необхідності розділення пакунків, наприклад для копіювання на дискети;
  • допомоги розробникам у формуванні архівів пакунків, та
  • допомоги користувачам у встановленні пакунків, що розташовані на віддаленому ftp-сайті.

Який формат двійкових пакунків Debian?

Пакунок, або ж архівний файл Debian містить виконувані файли, бібліотеки та документацію, що зв'язані з певним набором програм. Зазвичай такий файл має ім'я, що закінчується на .deb. Нутрощі формату двійкових пакунків описані у сторінці довідки deb(5). Внутрішній формат є предметом змін (між основними версіями Debian GNU/Linux), тому завжди використовуйте dpkg-deb(8) для маніпуляцій з .deb-файлами.

Чому імена пакунків Debian такі довгі?

Ім'я двійкового Debian-пакунку формується по наступній домовленості:

<щось_там>_<НомерВерсії>-<НомерПереглядуВDebian>.deb

Припускається, що "щось_там" насправді є назвою пакунку. Для перевірки ви можете дізнатись ім'я пакунку, поєднаного з архівним файлом Debian одним з двох шляхів:

  • перевірити файл Packages в тому каталозі, в котрому він розміщувався на ftp-сайті Debian. Цей файл містить опис кожного пакунку; в тому числі й формальне ім'я пакунку.
  • за допомогою команди dpkg --info foo_VVV-RRR.deb. Вона відображає, серед іншого, й відповідне ім'я пакунку для даного архіву.

Компонента VVV - це номер версії, що визначається основним розробником. Він не підкоряється жодним стандартам, тому може бути як "19990513" так і "1.3.8pre1".

Компонента RRR - це номер перегляду Debian і він визначається розробником Debian (чи окремим користувачем, якщо він захоче сформувати пакунок самостійно). Цей номер вказує на рівень перевірки пакунку; таким чином новий рівень перевірки як правило означає зміни у Makefile (debian/rules), контролюючому файлі (debian/control), встановлювальному чи видаляючому сценарії, або ж у конфігураційному файлі, що використовується пакунком.

Що то за файл control?

Детальний опис вмісту файлу control пояснюється у Підручнику політики Debian, параграф 5 (дивись параграф 11.1).

Тут ми коротко розглянемо приклад файлу control пакунка hello:

Package: hello
Priority: optional
Section: devel
Installed-Size: 45
Maintainer: Adam Heath <doogie@debian.org>
Architecture: i386
Version: 1.3-16
Depends: libc6 (>= 2.1)
Description: The classic greeting, and a good example
 The GNU hello program produces a familiar, friendly greeting.  It
 allows nonprogrammers to use a classic computer science tool which
 would otherwise be unavailable to them.
 .
 Seriously, though: this is an example of how to do a Debian package.
 It is the Debian version of the GNU Project's `hello world' program
 (which is itself an example for the GNU Project).

У полі Package вказується назва пакунку. Саме за нею пакунком можна маніпулювати за допомогою спеціальних інструментів, і вона як правило (але не обов'язвоко) є такою ж, як і перша частина імені архіву Debian.

У полі Version вказується як версія виробника програми, так і рівень перегляду пакунка, як це описано у параграфі 6.3.

Поле Architecture вказує, для якого чіпсету скомпільований двійковий файл.

У полі Depends перелічуються пакунки, котрі повинні бути встановлені для успішного встановлення даного пакунку.

Поле Installed-Size вказує, скільки дискового простору займе встановлений пакунок. Передбачається, що його будуть використовувати інші програми для того, щоб визначити, чи достатньо на розділі місця для встановлення пакунку.

Рядок Section вказує на розділ, в котрому міститься пакунок на ftp-сайтах Debian. Це - ім'я підкаталогу (всередині одного з основних каталогів - дивись параграф 5.1), де розташовано пакунок. Priority вказує, наскільки даний пакунок важливий при встановленні, то ж напіврозумні програми на кшталт dselect чи console-apt можуть поділити пакунки на категорії по ступеню необхідності їх встановлення. Звернись до параграфу 6.7 за деталями.

В полі Maintainer можна знайти електронну адресу людини, що на даний момент відповідає за поширення пакунку.

В полі Description знаходиться короткий перелік основних функцій пакунку.

За додатковою інформацією про всі можливі поля пакунку зверніться до розділу 5 Підручника стратегії Debian.

Для чого призначений conffile?

У цьому файлі перелічується список конфігураційних файлів (розміщених, як правило, у каталозі /etc), котрі система керування пакунками не буде перезаписувати при оновленні пакунку. Таким чином досягається захист вмісту конфігураційних файлів, що є критичним на працюючій системі.

Щоб взнати, які ж саме файли не будуть затерті при оновленні пакунку, запустіть

dpkg --status package

та перегляньте секцію "Conffiles:".

Що роблять сценарії preinst, postinst, prerm, та postrm?

Це - виконувані сценарії, що запускаються перед чи після встановлення пакунку. Разом з файлом control всі ці файли є частиною секції "control" архівного файлу Debian.

Кожен зокрема вони роблять наступне:

preinst : Цей сценарій запускається перед розпаковуванням пакунку з його Debian-архіву (файлу ".deb"). Багато preinst-сценаріїв зупиняють служби для пакунків, що оновлюються, аж поки їх встановлення чи оновлення не завершаться (з наступним успішним виконанням сценарію 'postinst').

postinst : Цей сценарій як правило завершує необхідні конфігурації пакунку foo коли вже foo був розпакований з архіву. Рідше 'postinst' запитує у користувача якісь дані та/або попереджує його у випадку залишення стандартних щоб він не забув повернутись та переконфігурувати пакунок у разі необхідності. Далі багато сценаріїв виконують команди, необхідні для запуску чи перезапуску різноманітних служб, оскільки пакунок вже встановлено чи оновлено.

prerm : Цей сценарій як правило зупиняє всі демони, що асоційовані з пакунком. Він виконується перед видаленням файлів, що зв'язані з пакунком.

postrm : Цей сценарій змінює відсилачі та інші файли, зв'язані з foo, та/або видаляє файли, створені пакунком (дивись також параграф 6.8).

Що це за пакунки - Essential, Required, Important, Standard, Optional та Extra (Невіддільний, Необхідний, Важливий, Типовий, Необов'язковий та Додатковий)?

Кожному Debian-пакункові поширювачами збірки присвоюється пріоритет, щоб допомогти системі керування пакунками. Такими пріоритетами є:

  • Required (Необхідний): пакунки, що необхідні для правильного функціонування системи.
    Сюди входять всі інструменти, що необхідні для усунення дефектів системи. Ви не повинні видаляти ці пакунки, або ж ваша система буде повністю виведена з ладу і швидше за все ви навіть не зможете використати dpkg щоб встановити їх назад.
    В системах з набором лише необхідних пакунків, швидше за все, не можна працювати, але вони дають системному адміністратору достатньо функціональності, щоб завантажити систему та встановити додаткове програмне забезпечення.

  • Important (Важливі) пакунки повинні бути встановлені на будь-якій Unix-системі.
    Сюди відносяться всі інші пакунки, без яких використання системи буде незручним або маломожливим. Сюди НЕ відносяться Emacs, X11, TeX чи інші великі додатки; ці пакунки лише формують базову інфраструктуру.

  • Standard (Типові) пакунки є стандартом для будь-якої Linux-системи, включаючи але не обмежуючись текстовими системами.
    Сюди входить все те, що встановлюється по замовчуванню, якщо користувач не вибрав що-небудь ще. Це не стосується багатьох великих додатків, але все ж сюди відносяться деякі програми для розробників на кшталт компіляторів GNU C та С++ (gcc, g++), GNU make, а також інтерпретатор мови Python, серверне програмне забезпечення типу OpenSSH, демон друку BSD (lpr) і т.п.

  • Optional (Необов'язкові) пакунки включають в себе все те, що вам є сенс встановити, якщо ви не знаєте, що воно таке, або ж не маєте якихось особливих забаганок.
    Сюди входять Х11, повна збірка ТеХ та багато інших програм.

  • Extra (Додаткові): пакунки, що або конфліктують з іншими, з вищим пріоритетом, або мають сенс до використання, лише коли ви точно знаєте, що воно таке, або ж мають якісь спеціалізовані вимоги, що не дозволили включити їх у "Необов'язкові".

Якщо ви встановлюєте стандартний Debian, всі пакунки з пріоритетом "Стандартний" та вищим будуть встановлені у вашу систему. При виборі наперед визначених програмних модулів ви отримаєте доступ і до пакунків з нижчим пріоритетом.

Додатково деякі пакунки позначені як "Невіддільні", оскільки вони абсолютно необхідні для успішного функціонування системи. Система керування пакунками не зможе їх видалити.

Що таке Віртуальний пакунок?

Віртуальний пакунок - це спільна назва, що дається пакункові, чи групі пакунків, кожен з яких пропонує однакову базову функціональність. Наприклад, обидві програми tin та trn призначені для читання новин, а отже повинні задовольнити залежність іншої програми, що потребує встановленої програми для читання новин у системі. Тому обидві вони включені до віртуального пакунку, що називається news-reader.

Аналогічно, програми smail та sendmail забезпечують функціональність транспортного агента електронної пошти. Тому кажуть, що вони обидві пропонують віртуальний пакунок "mail transport agent". Якщо хоча б одна з них встановлена, будь-яка інша програма, що залежить від пакунку mail-transport-agent, буде задоволена його наявністю.

Debian представляє цей механізм таким чином, що якщо в системі встановлено більше ніж один пакунок з однаковою базовою функціональністю, то системний адміністратор може зробити один із них привілейованим. Відповідна команда, update-alternatives, описується у параграфі 10.10.

Що мається на увазі, коли кажуть, що пакунок залежить, рекомендує, пропонує, конфліктує, замінює або забезпечує (Depends, Recommends, Suggests, Conflicts, Replaces або Provides) інший пакунок?

Система керуваннями пакунків Debian оперує шкалою залежностей, щоб вказати, в який спосіб програма А може оперувати наявністю в системі програми В:

  • пакунок А залежить (depends) від пакунку В, якщо В безумовно повинен бути встановленим у системі щоб запустити програму А. В деяких випадках А залежить не просто від В, але від певної версії В. В такому випадку залежність як правило має нижню межу, в цьому випадку А залежить від будь-якої версії В, що новіша за деяку визначену версію.
  • пакунок А рекомендує (recommends) пакунок В, якщо поширювач пакунку А вважає, що переважній більшості користувачів не потрібен пакунок А без функціональності, що її забезпечує пакунок В.
  • пакунок А пропонує (suggests) пакунок В, якщо В містить файли що зв'язані (та, зазвичай, посилаються) з функціональністю А.
  • пакунок А конфліктує з пакунком В, якщо А не зможе функціонувати при встановленому у системі В. Значно рідше конфлікт виникає із-за того, що А містить файли, відмінні від аналогічних у пакунку В. Часто "конфліктує" поєднується з "замінює".
  • пакунок А замінює (replaces) пакунок В, коли файли, встановлені В видаляються та (в деяких випадках) перезаписуються файлами з А.
  • пакунок А забезпечує (provides) пакунок В, коли всі файли та функціональність В включені в А. Цей механізм дає можливість користувачам з обмеженим дисковим простором встановити лише ту частину пакунку А, котра їм справді необхідна.

Детальніша інформація по кожному з цих термінів знаходиться у підручнику Політики Debian.

Що означає "попередня залежність"?

"Попередня залежність" - це особлива залежність. Для більшості пакунків dpkg розпакує архівний (".deb") файл незалежно від того, чи є в системі файли, від котрих він залежить. Це означає, що dpkg добуде їх з архіву та помістить туди, де вони повинні знаходитись. Якщо ці пакунки залежать від наявності інших пакунків у системі, dpkg відмовиться завершити встановлення (виконуючи дію "configure"), поки інші пакунки не будуть встановлені.

Проте для деяких пакунків dpkg відмовиться провести встановлення ще до розпакування, поки всі залежності не будуть задоволені. Цей механізм називається попередньою залежністю від присутності у системі інших пакунків. Проект Debian пропонує цей механізм для безпечного оновлення системи від формату a.out до ELF, де порядок, у якому розпаковуються пакунки, є критичним. Є й інші випадки значного оновлення, у яких цей механізм є доволі зручним, наприклад пакунки з пріоритетом "необхідний" та їхня залежність від LibC. Як завжди, додаткову інформацію можна знайти у підручнику Політики Debian.

Що мається на увазі, кажучи невідомий, встановлений, видалений, очищений чи зафіксований (unknown, install, remove, purge та hold) про стан пакунку.

Ці прапори вказують, що користувач хотів зробити з пакунком (як вказано або діями користувача в секції "select" програми dselect, або ж прямими викликами dpkg). Вони означають наступне:

  • невідомий (unknown) - користувач ніколи не вказував цей пакунок;
  • встановлений (install) - користувач хотів встановити чи оновити пакунок;
  • видалений (remove) - користувач хотів видалити пакунок, але не хотів видаляти існуючі файли конфігурації;
  • очищений (purge) - користувач хотів видалити пакунок разом з усіма конфігураційними файлами;
  • зафіксований (hold) - користувач не хотів обробляти цей пакунок, тобто він хоче залишити поточну версію з поточним статусом.

Як мені зафіксувати пакунок?

Є три способи зафіксувати пакунок - за допомогою dpkg, aptitude, або ж dselect. Для dpkg вам потрібно експортувати список станів пакунків за допомогою команди

dpkg --get-selections \* > selections.txt

Далі відредагуйте отриманий файл selections.txt, змінивши рядки, що містять назви пакунків, які ви хочете зафіксувати, як наприклад libc6 з ось таких

libc6                                           install

на такі

libc6                                           hold

Збережіть файл та завантажте його назад в базу даних dpkg таким чином:

dpkg --set-selections < selections.txt

У випадку aptitude ви можете зафіксувати пакунок такою командою:

aptitude hold назва_пакунку

та зняти фіксацію командою

aptitude unhold назва_пакунку

Для dselect вам потрібно лише перейти до екрану Select, знайти пакунок, котрий ви хочете зафіксувати, та натиснути клавішу "=" або "Н". Зміни збережуться, як тільки ви покинете екран Select.

Як мені встановити джерельний пакунок?

Джерельні пакунки Debian насправді не можуть бути встановлені, вони лише розпаковуються в той каталог, де ви хочете зібрати двійкові пакунки, котрі вони створюють.

Джерельні пакунки розповсюджуються на більшості тих дзеркал, котрі пропонують двійкові пакунки. Якщо ви налаштуєте sources.list (5) вашого APT таким чином, щоб він включав необхідні рядки "deb-src", ви зможете легко встановлювати будь-які джерельні пакунки командою

apt-get source назва_пакунку

Щоб дійсно допомогти вам компонувати джерельні пакунки, Debian пропонує так званий механізм компонування залежностей. Мається на увазі, що поширювач джерельного пакунку веде список інших пакунків, що потрібні для компонування даного. Щоб побачити, як це зручно, запустіть

apt-get build-dep назва_пакунку

перед компонуванням джерельних кодів.

Як мені скомпонувати двійковий пакунок з джерельного?

Вам потрібні всі файли foo*.dsc, foo.tar.gz та foo_.diff.gz щоб скомпілювати джерельні коди (для деяких пакунків, що є рідними для Debian, немає файлів .diff.gz).

Після того як ви їх отримали (дивись параграф 6.13), якщо у вас встановлено пакунок dpkg-dev, наступна команда

dpkg-source -x foo_version-revision.dsc

вибере пакунок у каталог foo_version.

Якщо ви хочете лише скомпілювати пакунок, ви можете перейти в цей каталог та запустити команду

dpkg-buildpackage -rfakeroot -b

щоб скомпонувати пакунок (зауважте, що при цьому у вас повинен бути встановлений пакунок fakeroot), а потім

dpkg -i ../foo_version-revision_arch.deb

щоб його встановити.

А як я сам можу створювати пакунки Debian?

Для детального опису прочитайте New Maintainers' Guide, доступний у пакунку maint-guide, або на http://www.debian.org/doc/devel-manuals#maint-guide