понедельник, 9 февраля 2009 г.

Маленькие хитрости dpkg

Содержание

* 1 Обновление системы из папки с новыми .deb пакетами
* 2 Поиск пакета, которому принадлежит конкретный файл
* 3 Удаление группы пакетов по признаку в названии
* 4 Прочие вкусности

Обновление системы из папки с новыми .deb пакетами

У меня дома выход в Сеть очень дорогой (GPRS), а иметь свежую систему хочется. Для этого я регулярно приношу с работы домой кеш новых пакетов на DVD. Далее сливаю все это в одну папочку и даю команду:

dpkg -i -R -G -E --abort-after=10000 /путь/к/пакетам/, здесь:

-i - установить пакет;
-R - делать это рекурсивно, начиная с указанного пути;
-G - не устанавливать более старую версию пакета, чем стоит в системе;
-E - не устанавливать пакет той же версии, что и в системе;
--abort-after=10000 - прервать выполнение команды после 10000 ошибок.

Часто получается что в кеше существует несколько версий одного и того же пакета. И если все они новее, чем в системе, то все они будут установлены в порядке возрастания. Но иногда случается что этим пакетам нужны разные версии других пакетов. Или устанавливливаются конфликтующие пакеты. Все это и порождает ошибки, а abort-after по дефолту равно 50 и этого не всегда достаточно.

После выполнения данной команды иногда приходится запустить еще несколько раз команду:

dpkg --configure -a --abort-after=10000, здесь:

--configure - сконфигурировать распакованный пакет;
-a - сделать это для всех распакованных, но еще не сконфигуренных пакетов;
--abort-after=10000 - прервать выполнение команды после 10000 ошибок.

Если ошибки остаются, то приходится уже ручками исправлять чего не нравится dpkg (удалить конфликтующий пакет или установить конкретную версию нужного пакета).
Поиск пакета, которому принадлежит конкретный файл

Иногда не понятно какому пакету принадлежит данный файл в системе. Будь то исполняемый файл, библиотека и тп.

Для этого существует команда dpkg -S чего_ищем, но здесь есть маленькая хитрость:

Если указать просто имя програмки (к примеру ssh), то выдастся много ненужного мусора. Чтобы этого не происходило, нужно указывать полный путь к данной программе:

$ which ssh /usr/bin/ssh $ dpkg -S /usr/bin/ssh openssh-client: /usr/bin/ssh

или проще:

$ dpkg -S `which ssh` openssh-client: /usr/bin/ssh

Здесь видно что программа ssh входит в пакет openssh-client.
Удаление группы пакетов по признаку в названии

Иногда хочется удалить группу пакетов содержащих что-то общее в названии (к примеру kde или x-server).

Для этого поможет команда dpkg -l 'чего_ищем' - показывает все пакеты удовлетворяющие запросу.

К примеру: удалить все что содержит kde:

dpkg -P `dpkg -l '*kde*' | awk '{ print $2 }' | sed '1,6d'`, здесь конвеер в подоболочке:

* dpkg -P пакет(ы) - удалить пакет(ы) вместе с конфигурационными файлами
* dpkg -l '*kde*' - показать все пакеты содержащие слово kde в любой части слова
* awk '{ print $2 }' - печатать только второй столбик (содержащий имена пакетов)
* sed '1,6d' - удалить первые 6 строк (мусор)

У данного конвеера есть маленький недочет: dpkg пытается удалить даже не установленные пакеты в системе. Скриптик работающий более правильно пусть будет домашним заданием! ;-)

Прочие вкусности

* dpkg -P имя_пакета - удалить пакет вместе с конфигурационными файлами;
* dpkg -s имя_пакета - показать подробную информацию о пакете;
* dpkg -L имя_пакета - показать список файлов содержащихся в пакете.

Комментариев нет:

Отправить комментарий