пʼятницю, 8 березня 2013 р.

Керування пакетами в OpenSUSE за допомогою zypper

Для керування пакетами в різних версіях OpenSUSE як високорівневий засіб використовується Yast, який насправді використовує zypper (а якщо ще точніше, то його бібліотеку libzypp). Zypper — засіб для керування пакетами в текстовому режимі. Також zypper досить універсальний в плані підключення різних репозиторіїв — він розуміє:
  • «Рідний» формат репозиторіїв yast;
  • репозиторії yum (rpm repo-md);
  • iso-образи репозиторіїв;
  • локальний каталог з rpm-пакетами;
  • те, що писати вже практично не обов'язково — різні мережеві джерела репозиторіїв — http, ftp, nfs.
З версії openSUSE 11.2 в zypper нарешті була додана опція, яка давно в нього просилася, а саме, опція попереднього викачування пакетів при оновленні. Раніше zypper працював так. Наприклад, потрібно оновити з десяток пакетів. Zypper викачував їх всі і встановлював по одному. В принципі, нічого страшного. Якщо канал в мережу хороший і надійний. А це в наших широтах не завжди зустрічається. В основному конфігураційному файлі /etc/zypp/zypp.conf дана поведінка описується опцією commit.download.mode (опція закоментована за замовчуванням), яка має наступні варіанти:
  • DownloadOnly — опція, яка легко замінюється ключем — dry-run, тобто звантаження всіх необхідних пакетів для поновлення без їх встановлення.
  • DownloadInAdvance — спочатку звантажити всі пакети, що вимагають відновлення, потім почати процес їх встановлення.
  • DownloadInHeaps — опція аналогічна попередній, але в даному випадку звантаження та встановлення пакетів виконується «порціями», не порушуючи цілісність системи. Приблизно також поводиться пакетний менеджер в Mandriva.
  • DownloadAsNeeded — традиційна поведінка. Звантаження та встановлення здійснюється по одному пакету.
Наступною цікавою можливістю zypper є скорочений варіант його опцій, тобто для встановлення пакета можна написати zypper install foopackage, а можна zypper in foopackage. Далі я буду приводити саме скорочений варіант опцій, а повний варіант писати в дужках.

Пошук пакетів

Для того, щоб знайти потрібний пакет в підключених репозиторіях використовується наступна команда:

zypper se foopackage — виконати пошук (se — search) пакета foopackage.

Якщо ви хочете знайти якусь програму, але не знаєте в якому пакеті її шукати, можна зробити так:
# zypper wp vi
Loading repository data...
Reading installed packages...
S | Name | Type | Version | Arch | Repository
--+--------------+---------+----------+------+------------------
| gvim | package | 7.2-16.7 | i586 | openSUSE-11.2-Oss
i | vim | package | 7.2-16.7 | i586 | openSUSE-11.2-Oss
| vim-enhanced | package | 7.2-16.7 | i586 | openSUSE-11.2-Oss
Опція wp (what-provides) дозволяє шукати пакет з будь-якого можливого параметру: ім'я виконуваного файлу, шлях до виконуваного файлу, набір символів з ​​опису пакета. В даному випадку я попросив знайти пакет, що містить редактор vi.

Спробуємо пошукати в якому пакеті у нас знаходиться бібліотека libpng:
# zypper wp libpng
Loading repository data...
Reading installed packages...
S | Name | Type | Version | Arch | Repository
--+------------+---------+------------+--------+------------------
i | libpng12-0 | package | 1.2.39-2.2 | x86_64 | openSUSE-11.2-Oss
v | libpng12-0 | package | 1.2.39-2.2 | i586 | openSUSE-11.2-Oss

Цікаво, а в якому пакеті знаходиться файл /bin/bash?
# zypper wp /bin/bash
Loading repository data...
Reading installed packages...
S | Name | Type | Version | Arch | Repository
--+------+---------+------------+--------+----------------------------
i | bash | package | 4.0-18.4.1 | x86_64 | Updates for openSUSE 11.2-0
v | bash | package | 4.0-18.4.1 | i586 | Updates for openSUSE 11.2-0
v | bash | package | 4.0-18.3 | x86_64 | openSUSE-11.2-Oss
v | bash | package | 4.0-18.3 | i586 | openSUSE-11.2-Oss 
Перший стовпчик показує статус пакета, де «i» означає — встановлений.
Переглянути інформацію про пакет можна командою zypper info <назва пакунка>.

Встановлення і видалення пакетів

Встановлення пакетів з підключених репозиторіїв виконується командою:
zypper in foopackage
Дана команда (in — install) встановлює пакет foopackage з усіма його залежностями.

Для видалення пакетів використовується опція rm (remove):
zypper rm foopackage
Дана команда видалить пакет foopackage з вашої системи.

Для перевірки цілісності системи на предмет задоволення залежностей існує команда verify:
zypper ve
Якщо чогось не буде вистачати — zypper запропонує доустановити пакети (або навіть видалити непотрібні).

Також є ще два ключа, які не є обов'язковими, але можуть дуже допомогти, якщо ви викликаєте zypper з скриптів. Перший ключ «-y» змушує пакетний менеджер відповідати на всі питання «так»/«yes». Другий ключ «-l» (маленька L) — має схоже значення, він змушує zypper погоджуватися з ліцензійними угодами окремих пакетів (наприклад, таких як Adobe Flash).

Оновлення

Виконувати оновлення системи zypper дозволяє двома способами — на основі патчів і на основі пакетів. Перший спосіб рекомендується для серверів. В даному випадку проводиться тільки накладення патчів, виправляються помилки безпеки на встановлене програмне забезпечення, причому цей спосіб оновлень повинен підтримуватися тими, хто веде репозиторій, з якого ви оновлюється. Стандартні репозиторії openSUSE підтримують даний спосіб.
Другий спосіб виконує встановлення нових пакетів в систему. Стандартні репозиторії openSUSE «заморожують» номери версій програм, так що в принципі ці два способи рівноцінні (але тільки для них). Це все була теорія. Тепер трохи практики.
Оновити метадані репозиторію можна командою:
zypper ref
Це необхідно робити щоразу перед виконанням оновлення (або включити autorefresh для всіх репозиторіїв — див.нижче).

Переглянути список доступних патчів (list-patches) можна командою:
zypper lp

Переглянути інформацію про конкретний патч можна командою (про опцію-t нижче):
zypper info -t patch foopatch

Встановити патчі можна командою:
zypper patch

Оновлення системи на основі пакетів виконується командою:
zypper up [ім'я пакета]
Дана команда (up/update) виконує оновлення або зазначеного пакунка, або всієї системи.

Друга команда призначається для оновлення системи між релізами (dist-upgrade):
zypper dup
Остання команда має кілька цікавих ефектів. Як відомо всі пакети rpm мають поле Vendor, в якому вказаний збирач пакета. Пакети зі стандартних репозиторіїв мають в даному полі openSUSE (або просто SUSE для ентерпрайзових версій). Пакети зібрані на openSUSE Build Service мають в даному полі слово obs із зазначенням виду репозиторію. Так от команда zypper up виконує оновлення таким чином, щоб поле Vendor не мінялося при оновленні. zypper dup, навпаки, може віддати перевагу змінити вендора пакета при оновленні.

Наступна цікава можливість стосується тих, хто як я любить поекспериментувати з системою. Припустимо, ви хочете поставити останню версію KDE, підключаєте репозиторій (про це нижче) KDE4: Factory (даний репозиторій для розробників і тестерів), виконуєте zypper dup (при цьому Vendor змінюється з openSUSE на щось подібне obs://build.opensuse.org/KDE/KDE4: Factory) і отримуєте її. Але потім, ви виявляєте, що в ній ще купа помилок і ви хотіли б повернутися назад. Що ж робити? Невже нічого не можна поправити?! А нічого страшного! Прибираєте даний репозиторій (видаляєте файл з його описом чи просто вимикаєте його) і знову виконуєте zypper dup. При цьому zypper вам запропонує виконати downgrade всіх оновлених раніше пакетів. Тобто zypper dup виконує оновлення системи таким чином, щоб вона завжди відповідала підключеним репозиторіям. Заради справедливості, варто відзначити, що downgrade не завжди проходить гладко. Іноді, при несприятливому положенні зірок і планет, в системі залишаються бібліотеки від нових репозиторіїв, які можуть перешкодити роботі програм. Так що можливо, доведеться потім позайматися таким «захоплюючим» заняттям, як troubleshooting.

Управління репозиторіями

Як зазначалося вище zypper універсальний в плані можливих репозиторіїв. Подивитися що ж у вас підключено в даний момент можна наступною командою:
zypper lr
У першій колонці наведено порядковий номер репозиторію, у другій і третій його назву і опис. Четверта і п'ята колонки показують включений даний репозиторій і чи включено його автооновлення (autorefresh). Якщо остання можливість включена, то при кожному своєму запуску zypper буде перевіряти чи потрібно оновлення метаданих репозиторію і, якщо потрібно, виконувати його. В іншому випадку, вам потрібно буде робити це власноруч командою zypper ref (refresh).

Додати репозиторій можна командою zypper ar URI alias, де — URI ідентифікатор репозиторію, alias — це зрозуміле вам ім'я репозиторію, що дозволяє ідентифікувати його та відрізнити від інших, ar — скорочений варіант addrepo. Приклад команди:
zypper ar nfs://192.168.0.254/srv/ftp/sles11 sles11
Adding repository 'sles11' [done]
Repository 'sles11' successfully added
Enabled: Yes
Autorefresh: No
URI: nfs://192.168.0.254/srv/ftp/sles11

Видалити репозиторій можна командою zypper rr. Наприклад:
zypper rr 13
Removing repository 'sles11' [done]
Repository 'sles11' has been removed.
Тут я видалив репозиторій, вказавши його ID (тобто номер). Його можна побачити у виводі команди zypper lr. Аналогічного ефекту я б добився, вказавши zypper rr sles11. Тобто в даному випадку вказувати потрібно або ID репозиторію, або його псевдонім.

Модифікація параметрів репозиторію виконується командою: zypper mr [options]. Список опцій можна отримати наступним чином:
zypper mr
Alias or an aggregate option is required.
modifyrepo (mr) ...
modifyrepo (mr) <--all data-blogger-escaped-local="" data-blogger-escaped-medium-type="" data-blogger-escaped-remote="">

Modify properties of repositories specified by alias, number, or URI, or by the
'--all, --remote, --local, --medium-type' aggregate options.

Command options:
-d, --disable Disable the repository (but don't remove it).
-e, --enable Enable a disabled repository.
-r, --refresh Enable auto-refresh of the repository.
-R, --no-refresh Disable auto-refresh of the repository.
-n, --name Set a descriptive name for the repository.
-p, --priority Set priority of the repository.
-k, --keep-packages Enable RPM files caching.
-K, --no-keep-packages Disable RPM files caching.

-a, --all Apply changes to all repositories.
-l, --local Apply changes to all local repositories.
-t, --remote Apply changes to all remote repositories.
-m, --medium-type Apply changes to repositories of specified type. 
Наприклад, наступна команда включить параметр autorefresh для всіх репозиторіїв:
zypper mr -ra
Опція -r ввімкне автооновлення для репозиторіїв (а -R вимкне його), а опція -a говорить застосувати це до всіх репозиторіїв.

Сховища можуть мати пріоритети, які можуть додатково вказувати zypper ваші уподобання (менше значення — більший пріоритет). Робота з пріоритетами аналогічна тому, що відбувається в yum. Тільки тут не потрібно ставити ніяких додаткових плагінів. Щоб задати пріоритет репозиторію можна скористатися командою zypper mr, але на мій погляд, набагато простіше відкрити файл .repo репозиторію і дописати в ньому, наприклад, такий рядок — priority = 100. Стандартні репозиторії openSUSE мають пріоритет 90, а репозиторій Updates пріоритет 20. Майте це на увазі, коли будете задавати власні пріоритети. Після зміни пріоритетів обов'язково необхідно запустити, спочатку zypper ref (якщо не обрано autorefresh для репозиторіїв), а потім zypper dup, для того, щоб zypper встановив пакети відповідно до висловлених вами вподобань.

Але, по-моєму, набагато зручніше для управління репозиторіями використовувати відповідний модуль yast:
yast repositories
Шанувальники графічного інтерфейсу Yast можуть скористатися його графічним меню, або набравши в консолі:
yast2 repositories

Ну і найпростіший спосіб підключення репозиторіїв — це звантажити файл з його описом звідси. У кожному з репозиторіїв є текстовий .repo файл, який потрібно помістити в каталог /etc/zypp/repos.d/ і підредагувати на предмет пріоритетів, якщо це потрібно.

Типи пакетів

Ну і найцікавіша можливість zypper в тому, що він дозволяє використовувати різні типи «пакетів» при встановленні. В даному випадку під «пакетами» розуміємо:
  • власне, пакети (і якщо нічого не вказувати спеціально, то маються на увазі саме вони);
  • патчі (patch) (сховища можуть містити просто патчі, а не пакети з оновленнями);
  • шаблони (pattern) — групи пакетів, що встановлюють ту чи іншу функціональність;
  • продукти (product) — це групи пакетів для роботи того чи іншого продукту;

Тип пакета вказується опцією -t. Наприклад, отримати список доступних шаблонів можна командою zypper patterns. І поставити той, що потрібен, командою:
zypper in-t pattern x11
Тут pattern це тип встановлюваного пакету, тобто ми вказуємо, що маємо на увазі саме шаблон. x11 — ім'я встановлюваного шаблону. Найгірше при використанні шаблонів це те, що видаляти пакети шаблонами zypper поки не вміє.

Немає коментарів:

Дописати коментар