LINUX.ORG.RU

OpenSUSE: zypper и удаление ненужных зависимостей

 ,


1

5

Не троллинга ради, а ради расширения кругозора. C одной стороны, немного избитая тема, с другой - zypper постоянно чем-то дополняют, поэтому хотелось бы уточнить у его пользователей (сам я его не использую). Долго пытался гуглить и искать в официальной документации, но всё равно ничего не понял.

Если удалять пакет командой zypper remove -u pkg_name (она же zypper remove --clean-deps pkg_name), то всё понятно и хорошо: неиспользуемые зависимости сразу удаляются вместе с пакетом. Если просто выполнить zypper remove pkg_name, то оставшиеся «осиротевшие» зависимости остаются в системе.

Если был удалён репозиторий из которого первоначально устанавливался удалённый пакет, то начиная с openSUSE 13.1 ненужные зависимости можно удалить командой zypper packages --orphaned (zypper packages -o). В отдельных случаях ссылаются на команду zypper pa -n (zypper packages -n), но описание ключа "-n" для «zypper packages» мне найти не удалось. Что делает эта команда? Даже ссылаются на комбинацию этих ключей zypper pa -no.

Иногда для удаления оставшихся зависимостей советуют использовать «rpmorphan», но с осторожностью, так как он может насобирать лишнего.

Как всё же удалить ненужные зависимости из системы без отключения репозитория из которого был установлен исходный пакет?

★★★★★

Раз никто не ответил, то пришлось скачать образ и загрузить opensuse в виртуалбокс, чтобы удовлетворить своё любопытство. Будет много букв :(

Можно попытаться вспомнить какие пакеты удалялись без параметра "-u", снова их установить и сразу же удалить с параметром "-u". Но этот вариант не всегда подходит.

В справке zypper с параметром packages (pa), там есть несколько новых (а может и старых опций), не имеющих короткой записи, как в примерах исходной темы, которые мне попадались:

packages (pa) [options] [repository] ...
              List  all  available  packages or all packages from specified repositories (similar to zypper search -s -t package).  
	      Also allows the options --orphaned, --suggested, --recommended and --unneeded to get corresponding lists of packages.

       -r, --repo <alias|name|#|URI>
              Just another means to specify repositories.

       -i, --installed-only
              Show only installed packages.

       -u, --uninstalled-only
              Show only packages which are not installed.

       --orphaned
              Show packages which are orphaned (without repository).

       --suggested
              Show packages which are suggested.

       --recommended
              Show packages which are recommeded.

       --unneeded
              Show packages which are unneeded.

Меня заинтересовала опция "--unneeded", поэтому, выполнил zypper pa --unneeded на свежезагруженном livecd-gnome:

# zypper pa --unneeded
Loading repository data...
Reading installed packages...
S | Repository        | Name               | Version                | Arch  
--+-------------------+--------------------+------------------------+-------
i | openSUSE-13.2-Oss | hdjmod-kmp-desktop | 1.28_k3.16.6_2-18.2.12 | x86_64
i | openSUSE-13.2-Oss | ipset-kmp-desktop  | 6.23_k3.16.6_2-1.10    | x86_64
i | openSUSE-13.2-Oss | spice-vdagent      | 0.15.0-5.1.4           | x86_64
i | openSUSE-13.2-Oss | xen-kmp-desktop    | 4.4.1_06_k3.16.6_2-3.3 | x86_64
i | openSUSE-13.2-Oss | xf86-video-trident | 1.3.6-8.1.4            | x86_64
Странно, конечно, что ещё ничего не ставилось, а ненужные пакеты уже есть, ну да ладно, возможно косяк официальной сборки.

Для теста поставил и сразу удалил darktable. Он тянет за собой 5 пакетов: gtk2-engine-clearlooks, gtk2-theme-clearlooks, libGraphicsMagick-Q16-3, libGraphicsMagick3-config, libflickcurl0 . Соответственно, после удаления darktable без параметра "-u" вывод zypper pa --unneeded был таким:

# zypper pa --unneeded
Loading repository data...
Reading installed packages...
S | Repository           | Name                    | Version                | Arch  
--+----------------------+-------------------------+------------------------+-------
i | openSUSE-13.2-Oss    | gtk2-engine-clearlooks  | 2.20.2-18.1.4          | x86_64
i | openSUSE-13.2-Oss    | hdjmod-kmp-desktop      | 1.28_k3.16.6_2-18.2.12 | x86_64
i | openSUSE-13.2-Oss    | ipset-kmp-desktop       | 6.23_k3.16.6_2-1.10    | x86_64
i | openSUSE-13.2-Oss    | libGraphicsMagick-Q16-3 | 1.3.20-1.6             | x86_64
i | openSUSE-13.2-Update | libflickcurl0           | 1.26-2.4.1             | x86_64
i | openSUSE-13.2-Oss    | spice-vdagent           | 0.15.0-5.1.4           | x86_64
i | openSUSE-13.2-Oss    | xen-kmp-desktop         | 4.4.1_06_k3.16.6_2-3.3 | x86_64
i | openSUSE-13.2-Oss    | xf86-video-trident      | 1.3.6-8.1.4            | x86_64
Можно заметить, что из зависимостей darktable в списке всего 3 шт. Ещё два пакета (один из них рекомендованный) являются зависимостями 2 из этих трёх.

Не знаю, нужны ли системе те пакеты, которые выводились "zypper pa --unneeded" до удаления darktable. Будем считать, что нет. Тогда для удаления всего списка пакетов с их зависимостями нужно из вывода команды убрать первые 4 строки (начать с 5-й), вывести только названия пакетов и передать этот список команде zypper rm -u. Следует обратить внимание, что в этот раз при удалении обязательно нужен параметр "-u", иначе вызов нижеописанной команды придётся повторить ещё раз. Используя команды cut, tail, xarg запишем команду zypper pa --unneeded | tail -n +5 | cut -d \| -f 3 | xargs zypper rm -u, при выполнении которой получим:

# zypper pa --unneeded | tail -n +5 | cut -d \| -f 3 | xargs zypper rm -u
Loading repository data...
Reading installed packages...
Resolving package dependencies...

The following 10 packages are going to be REMOVED:
  gtk2-engine-clearlooks gtk2-theme-clearlooks hdjmod-kmp-desktop ipset-kmp-desktop libGraphicsMagick-Q16-3 libGraphicsMagick3-config 

libflickcurl0 spice-vdagent xen-kmp-desktop 
  xf86-video-trident 

10 packages to remove.
After the operation, 6.9 MiB will be freed.
Continue? [y/n/? shows all options] (y):
То есть из системы будут удалены все «ненужные» пакеты, список которых выводится командой zypper pa --unneeded

grem ★★★★★
() автор топика

Ещё в файле /etc/zypp/zypp.conf есть параметр solver.cleandepsOnRemove, которому предшествует ПРЕДУПРЕЖДЕНИЕ:

##
## EXPERTS ONLY: Cleanup when deleting packages. Whether the solver should
## per default try to remove packages exclusively required by the ones he's
## asked to delete.
##
## This option should be used on a case by case basis, enabled via
## command line options or switches the applications offer. Changing
## the global default on a system where unattended actions are performed,
## may easily damage your system.
##
## CHANGING THE DEFAULT IS NOT RECOMMENDED.
##
## Valid values:  boolean
## Default value: false
##
# solver.cleandepsOnRemove = false
Некоторые советуют сразу же раскомментировать строчку с ним и перевести его в режим true. В этом случае для всех удаляемых командой zypper rm имя_пакета пакетов, автоматически будут удаляться и зависимости, как при выполнении команды zypper rm -u имя_пакета. По всей видимости, удаление пакета без удаления его зависимостей в этом случае должно происходить посредством выполнения команды zypper rm -U имя_пакета (вместо строчной «u» - прописная «U»).

grem ★★★★★
() автор топика
Ответ на: комментарий от Novell-ch

Конечно же хорошо, что есть и опция, и ключи. Меня несколько удивило, что в такой древней линейке дистрибутивов нет средства очистки неиспользующихся зависимостей после удаления пакета. По крайней мере, во всех руководствах (даже официальных) по управлению пакетами этот вопрос обходят стороной. А ключ "--unneeded" так вообще только в версии 13.1 появился.

В чём-то похожая ситуация в линейке RedHat: В официальном System Administration Guide от Fedora ни слова о ключе yum «autoremove», который скорее всего недавно появился, так как в сторонних руководствах, которые мне попадались, в лучшем случае рекомендуют использоваться package-cleanup из yum-utils.

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

grem ★★★★★
() автор топика
Ответ на: комментарий от grem

какого фейла? о_О

Последняя версия у них явно не удалась. Вот 13.1 была хороша. Много мелких и не очень недочетов. zypper так и не научился автокомплиту, много там было еще сейчас и не вспомню. В итоге поплевался и удалил.

через 2 месяца новый релиз обещают, версию 42.1

42.1

Ооо, надо потыкать. Похоже они сам поняли что последний релиз не очень удался и решили кардинально все поменять.

Zodd ★★★★★
()
Ответ на: комментарий от supreme

Возможно уже научился, посмотрю.

Еще вспомнил, что на десктопе оно загружается лишь в режиме noapic, хотя с другими дистрибами такого нет.

Zodd ★★★★★
()
Ответ на: комментарий от Zodd

Думаю, тут дело не в дистрибутиве, а конкретной версии ядра.

supreme
()
Ответ на: комментарий от Zodd

Я совсем запутался, что они там затеяли: мне казалось, что opensuse - в некотором роде основа для SLES, а теперь они заявляют, что переходят на кодовую базу SLES и какие-то ещё их наработки. Поменяется, похоже, действительно многое.

grem ★★★★★
() автор топика
9 мая 2016 г.
Ответ на: комментарий от grem

Я немного добавлю. Сам гентушник. Но заинтересовался опенсусей. Хочется дома иметь систему, где можно будет использовать софт с работы. В генте есть emerge --depclean, который анализирует _все_ пакеты системы с зависимостями и удаляет ненужное.

В виртуалке поставил openSuse 42.1

сделал zypper in owncloud / поставило 29 пакетов

сделал zypper rm --clean-deps owncloud / предложил удалить 29 пакетов

вместе с установленным owncloud поставил phpmyadmin - подтянулось еще 5 пакетов.

после этого сделал zypper rm --clean-deps owncloud / и вот тут мне предложили удалить 10 пакетов.

при этом после zypper rm phpmyadmin owncloud (когда в системе осталось 28+4 лишних пакетов) я сделал zypper pa --unneeded мне было предложено удалить ВСЕГО лишь 8 пакетов.

получается нет адекватной команды для очистки системы? только удалять каждый раз с очисткой ненужных зависимостей? (ну конечно, можно поставить флаг solver.cleandepsOnRemove, но 16й год на дворе. неужели нет нормальной команды очистки?!)

yarra
()
Ответ на: комментарий от grem

Вот тут: https://wiki.archlinux.org/index.php/Pacman/Rosetta

Есть сводка команд. Если верить ей, то по команде zypper rm -u у меня должны удалиться все неиспользуемые зависимости по аналогии с emerge --depclean.

Но в 42.1 почему-то этот вариант не работает.

yarra
()
Ответ на: комментарий от yarra

При использовании zypper rm -u pkg_name будут удаляться использующиеся зависимости пакета pkg_name, но эту опцию, как уже указывалось выше, нужно использовать во время удаления самого пакета.

В шпаргалке вики арча Скорее всего в вики арча для данной команды просто неверно поняли значение ключа и как его использовать . Я пытался составить похожую шпаргалку для нескольких дистрибутивов, но никак её не доделаю. Помимо чтения документации пришлось в VirtualBox ставить пару дистрибутивов, чтобы некоторые вещи посмотреть как работают на самом деле и проверить команды.

grem ★★★★★
() автор топика
Ответ на: комментарий от grem

Да, про

zypper rn -u[.code] я понял.

Судя по всему так.

К слову в CentOs 7 

yum autoremove

, судя по всему работает. На сколько точно пока не могу сказать.

yarra
()
19 июля 2016 г.
Ответ на: комментарий от grem

Шпаргалка по командам для всех систем давно составлена в виде команды epm: http://wiki.etersoft.ru/Epm

Например, удаление ненужных пакетов на всех системах выполняется командой

# epm autoremove

vitlav
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.