Автор Тема: Удаление хвостов удаляемых пакетов по признаку ненужности другим пакетам  (Прочитано 2866 раз)

Оффлайн ASte

  • Мастер
  • ***
  • Сообщений: 1 550
А какой командой можно получить список зависимостей пакета в виде пригодном "скармливанию" apt-get?
$rpm --requires -q libxfce4panel
libc.so.6(GLIBC_2.2.5)(64bit) 
libcairo.so.2()(64bit) >= set:mkD6GauO0
rpmlib(SetVersions) 
libgdk-x11-2.0.so.0()(64bit) >= set:njp6C4Zj8Ha17Am557GQNBmIi7DZh1
libgdk_pixbuf-2.0.so.0()(64bit) >= set:linL2Bb9v8sVmBaq
libglib-2.0.so.0()(64bit) >= set:ojfwK7kQNFOXV1Mq3YniHOwA9622IfL2x5VMvRRpYlYZbht9nEFKxAJutHyAuyHCJAs4Ab10
libgobject-2.0.so.0()(64bit) >= set:mg9fAxLyAZAD72jCUeREehcK5CLsi5vfREqyCl5UqDaK2uBZ9DNA5ETKCG7QxbbRZw5YfDgb2TTeZcxYgOeKxakoVqpgzH6hafuqpzwHxSydXHWQm1l1TUTeHU1FhksT0WIKrvfWb8rF56oC7
libgtk-x11-2.0.so.0()(64bit) >= set:piD5OrwceZpRnb14zZydDXjTzxzdw6EFNHSHqRdNstA2WAPFZgBRjDZoLeygFY2KqctbednzDlNq6Ia2eMC3hCgqk1wk821pFNIhyCpqSzve9M7TZvhN5nMtN64PaxI2uZlYI5Ev0O1kMWBzjKgybebWLi9B9WbnxT3VvF5yjUexvADvJr67W4fkaz53BMFJmxWC4KfZHbEezet6Zlce9MuZtNDbVdYXuQoMUDA1dzFVJTDXzij5
libm.so.6(GLIBC_2.2.5)(64bit) 
libxfce4util.so.7()(64bit) >= set:jh3gDZF5
rtld(GNU_HASH) 
rpmlib(PayloadIsLzma)
выдает временами что-то странное....

Оффлайн ASte

  • Мастер
  • ***
  • Сообщений: 1 550
apt-cache тоже ведет себя как-то странно...
$ apt-cache depends libxfce4panel
libxfce4panel-4.12.1-alt1
  Требует: <libc.so.6(GLIBC_2.2.5)(64bit)>
    glibc-core-6:2.23-alt3
  Требует: <libcairo.so.2()(64bit)>
    libcairo-1:1.14.4-alt1
  Требует: <libgdk-x11-2.0.so.0()(64bit)>
    libgtk+2-2.24.31-alt1
  Требует: <libgdk_pixbuf-2.0.so.0()(64bit)>
    libgdk-pixbuf-2.36.5-alt0.M80P.1
  Требует: <libglib-2.0.so.0()(64bit)>
    glib2-2.50.3-alt0.M80P.1
  Требует: <libgobject-2.0.so.0()(64bit)>
    glib2-2.50.3-alt0.M80P.1
  Требует: <libgtk-x11-2.0.so.0()(64bit)>
    libgtk+2-2.24.31-alt1
  Требует: <libm.so.6(GLIBC_2.2.5)(64bit)>
    glibc-core-6:2.23-alt3
  Требует: <libxfce4util.so.7()(64bit)>
    libxfce4util-4.12.1-alt1
  Требует: <rtld(GNU_HASH)>
    glibc-core-6:2.23-alt3
$ apt-cache show glibc-core-6:2.23-alt3
W: Невозможно найти пакет glibc-core-6:2.23-alt3
E: Не найдено ни одного пакета
$ apt-cache show glibc-core-6
W: Невозможно найти пакет glibc-core-6
E: Не найдено ни одного пакета

Оффлайн stranger573

  • Мастер
  • ***
  • Сообщений: 1 451
    • Email
А какой командой можно получить список зависимостей пакета в виде пригодном "скармливанию" apt-get?
Исходя из зависимостей — никакой. Не реализовано оно изначально и по сейчас. Этот список можно выдернуть только из лога установки, в случае если он есть.
У нас есть свои программеры, которые очень сильно удивляются (каждый раз), когда узнают что софт не только устанавливать надо, но и удалять. Это достаточно распростанённое явление.
« Последнее редактирование: 16.03.2017 18:50:04 от stranger573 »

Оффлайн ASte

  • Мастер
  • ***
  • Сообщений: 1 550
Можно попробовать сделать скрипт очистки по такому алгоритму:
-определяем все зависимости удаляемого пакета - это кандидаты на удаление
-берем полный список установленных пакетов
-далее проверяем по порядку каждый пакет из списка "кандидатов" - если на него есть зависимость хотя-бы у одного пакета не входящего в список "кандидатов" - этот пакет и все пакеты от которых он зависит мы из списка "кандидатов" вычеркиваем.
Распечатываем список оставшихся пакетов  в формате пригодном "скармливанию" apt-get.
Если в результат попали пакеты которые мы хотим все равно оставить то передаем список таких пакетов в качестве параметра "исключения" и повторяем алгоритм снова.

Полученный список пакетов скармливаем apt-get.  Вроде-бы ничего лишнего при этом не должно быть вынесено из системы.. И все "ненужное" притянутое по зависимостям должно почиститься.
Или я не прав и чего-то в алгоритме не учел?
 
stranger573
Оно должно как-то из списка зависимостей выдергиваться, ведь apt-get при установке пакета как-то выдергивает из зависимостей "правильные" имена пакетов которые нужно доустановить вместе с запрошенным пакетом...
« Последнее редактирование: 16.03.2017 18:59:26 от ASte »

Оффлайн ASte

  • Мастер
  • ***
  • Сообщений: 1 550
Я видимо не совсем точно сформулировал вопрос.
М apt-cache и rpm иногда возвращают "правильные" имена пакетов, а иногда нечто странное со скобками, что при скармливании имени пакета тому-же rpm приводит к ошибке "пакет не установлен". Аналогично у apt-cache - название пакета выводится в списке зависимостей, а по apt-cache show имя-пакета этот пакет не находится.
« Последнее редактирование: 16.03.2017 19:06:26 от ASte »

Оффлайн stranger573

  • Мастер
  • ***
  • Сообщений: 1 451
    • Email
stranger573
Оно должно как-то из списка зависимостей выдергиваться,
Должно то должно... Но нету этого. Не сделали.

ведь apt-get при установке пакета как-то выдергивает из зависимостей "правильные" имена пакетов которые нужно доустановить вместе с запрошенным пакетом...
Тут не всё так просто. Это не делается по принципу — этот пакет зависит от таких-то, всё это ставим.
Получается как? Устанавливаемый пакет зависит от каких-то нескольких, те в свою очередь зависят от ещё каких-то, а те тоже ... и т.д. В результате получается весьма, подчас, разлапистое дерево. Вот это всё и ставится.
Для удаления это тоже вполне возможно, с выводом списка на проверку перед применением. И перестройкой всего дерева, если вы решили какие-то пакеты оставить. Но сколько помню всегда говорили, что непонятно чего удалять — и ничего не делали.

Оффлайн stranger573

  • Мастер
  • ***
  • Сообщений: 1 451
    • Email
Можно попробовать сделать скрипт очистки по такому алгоритму:
-определяем все зависимости удаляемого пакета - это кандидаты на удаление
-берем полный список установленных пакетов
-далее проверяем по порядку каждый пакет из списка "кандидатов" - если на него есть зависимость хотя-бы у одного пакета не входящего в список "кандидатов" - этот пакет и все пакеты от которых он зависит мы из списка "кандидатов" вычеркиваем.
Распечатываем список оставшихся пакетов  в формате пригодном "скармливанию" apt-get.
Если в результат попали пакеты которые мы хотим все равно оставить то передаем список таких пакетов в качестве параметра "исключения" и повторяем алгоритм снова.

Полученный список пакетов скармливаем apt-get.  Вроде-бы ничего лишнего при этом не должно быть вынесено из системы.. И все "ненужное" притянутое по зависимостям должно почиститься.
Или я не прав и чего-то в алгоритме не учел?
Примерно так. Только структура графа будет многоярусной. От кандидатов на удаление потянутся ещё те от которых зависят кандидаты, а от тех ещё и т.д. Т.е. получаем опять целое дерево, как и при установке (но только строим его от обратного). Анализируем, редактируем (если требуется), исполняем.
Не слишком просто, но вполне реализуемо.

Оффлайн ASte

  • Мастер
  • ***
  • Сообщений: 1 550
Именно такое дерево я и имел в виду. Сначала рекурсивно идем "вниз" по зависимостям пока не дойдем до пакета без зависимостей и набираем "список кандидатов". Потом вычеркиваем из этого списка тех, на кого есть зависимости со стороны установленных пакетов в этот список не попавших.

Вопрос в том как получить в ответе на запрос  списка зависимостей пакета у rpm или apt-cache наименования пакетов в виде пригодном для того чтобы имя пакета из ответа снова подставить в  rpm или apt-get и запросить уже его зависимости (прямые или "обратные"). Чтобы полученные имена пакетов (строки) можно было бы сравнивать между собой, и чтобы потом apt-get remove нашел бы эти пакеты.


Потому как когда я попробовал пройтись по зависимостям в ряде случаев получил в ответах названия пакетов по которым невозможно найти сам пакет.
« Последнее редактирование: 16.03.2017 19:32:02 от ASte »

Оффлайн stranger573

  • Мастер
  • ***
  • Сообщений: 1 451
    • Email
Вопрос в том как получить в ответе на запрос  списка зависимостей пакета у rpm или apt-cache наименования пакетов в виде пригодном
Ну, тут надо сообразить как выкусить из строки только нужное, например с помощью awk.

Я, когда особенно сильно доставал хлам, делал это копипастой, ручками. Однако, это мучительно долго и трудоёмко.
« Последнее редактирование: 16.03.2017 19:42:53 от stranger573 »

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 19 926
    • Домашняя страница
    • Email
О, Господи!
Было на http://altlinux.org/Tips
и rpm -q --qf '%{name}' pkg-version
Андрей Черепанов (cas@)

Оффлайн stranger573

  • Мастер
  • ***
  • Сообщений: 1 451
    • Email
to Skull, а можно простыми словами что такое 6: в glibc-core-6:2.23-alt3?

Оффлайн ASte

  • Мастер
  • ***
  • Сообщений: 1 550
Skull, спасибо. Список всех установленных пакетов с такими опциями rpm выводит правильно. А вот на зависимости оно почему-то не влияет:
Например для make:
$ rpm -q make  -R
/lib64/ld-linux-x86-64.so.2 
libc.so.6(GLIBC_2.14)(64bit) 
libc.so.6(GLIBC_2.17)(64bit) 
libc.so.6(GLIBC_2.2.5)(64bit) 
libc.so.6(GLIBC_2.3)(64bit) 
libc.so.6(GLIBC_2.3.4)(64bit) 
libc.so.6(GLIBC_2.4)(64bit) 
rtld(GNU_HASH) 
rpmlib(PayloadIsLzma) 
и так тоже:
$ rpm -q make --qf '%{name}\n' -R
make
/lib64/ld-linux-x86-64.so.2 
libc.so.6(GLIBC_2.14)(64bit) 
libc.so.6(GLIBC_2.17)(64bit) 
libc.so.6(GLIBC_2.2.5)(64bit) 
libc.so.6(GLIBC_2.3)(64bit) 
libc.so.6(GLIBC_2.3.4)(64bit) 
libc.so.6(GLIBC_2.4)(64bit) 
rtld(GNU_HASH) 
rpmlib(PayloadIsLzma) 

--qf '%{name}\n'  добавляет имя самого пакета с make.,.

Так тоже не срабатывает:
$ rpm  --qf '%{REQUIRENAME}' -R -q make
/lib64/ld-linux-x86-64.so.2/lib64/ld-linux-x86-64.so.2 
libc.so.6(GLIBC_2.14)(64bit) 
libc.so.6(GLIBC_2.17)(64bit) 
libc.so.6(GLIBC_2.2.5)(64bit) 
libc.so.6(GLIBC_2.3)(64bit) 
libc.so.6(GLIBC_2.3.4)(64bit) 
libc.so.6(GLIBC_2.4)(64bit) 
rtld(GNU_HASH) 
rpmlib(PayloadIsLzma)

Но зависимости  у пакета в разделе depends так и лежит:
$apt-cache show make
.....
Depends: /lib64/ld-linux-x86-64.so.2, libc.so.6(GLIBC_2.14)(64bit), libc.so.6(GLIBC_2.17)(64bit), libc.so.6(GLIBC_2.2.5)(64bit), libc.so.6(GLIBC_2.3)(64bit), libc.so.6(GLIBC_2.3.4)(64bit), libc.so.6(GLIBC_2.4)(64bit), rtld(GNU_HASH)
....

Или если обнаружены скобки в названии пакета - то это что-то служебное и удаляться из системы в любом случае не должно?


Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 19 926
    • Домашняя страница
    • Email
2 stranger573: это эпоха. Увеличение эпохи позволяет уменьшить номер версии. То есть 2.0 < 1:1.0.
Андрей Черепанов (cas@)

Оффлайн stranger573

  • Мастер
  • ***
  • Сообщений: 1 451
    • Email

Оффлайн stranger573

  • Мастер
  • ***
  • Сообщений: 1 451
    • Email
Накостылил чего-то. Не уверен, что правильно, но вроде как.
На машинке с p6, но это, думаю, не принципиально.

Выдача apt-cache для medit:
$ apt-cache depends medit
medit-1.1.0-alt0.M60P.1
  Требует: </lib/ld-linux.so.2>
    glibc-core-6:2.11.3-alt8.M60P.5
  Требует: <libICE.so.6>
    libICE-1.0.7-alt2
  Требует: <libSM.so.6>
    libSM-1.2.0-alt3
  Требует: <libX11.so.6>
    libX11-3:1.4.99.1-alt0.M60P.1
  Требует: <libatk-1.0.so.0>
    libatk-2.2.0-alt0.M60P.1
  Требует: <libc.so.6(GLIBC_2.0)>
    glibc-core-6:2.11.3-alt8.M60P.5
  Требует: <libc.so.6(GLIBC_2.1)>
    glibc-core-6:2.11.3-alt8.M60P.5
  Требует: <libc.so.6(GLIBC_2.1.3)>
    glibc-core-6:2.11.3-alt8.M60P.5
  Требует: <libc.so.6(GLIBC_2.2)>
    glibc-core-6:2.11.3-alt8.M60P.5
  Требует: <libc.so.6(GLIBC_2.2.3)>
    glibc-core-6:2.11.3-alt8.M60P.5
  Требует: <libc.so.6(GLIBC_2.3)>
    glibc-core-6:2.11.3-alt8.M60P.5
  Требует: <libc.so.6(GLIBC_2.3.4)>
    glibc-core-6:2.11.3-alt8.M60P.5
  Требует: <libc.so.6(GLIBC_2.4)>
    glibc-core-6:2.11.3-alt8.M60P.5
  Требует: <libcairo.so.2>
    libcairo-1:1.10.2-alt7
  Требует: <libdl.so.2(GLIBC_2.0)>
    glibc-core-6:2.11.3-alt8.M60P.5
  Требует: <libdl.so.2(GLIBC_2.1)>
    glibc-core-6:2.11.3-alt8.M60P.5
  Требует: <libgcc_s.so.1(GCC_3.0)>
    libgcc1-4.5.4-alt1.M60P.1
  Требует: <libgdk-x11-2.0.so.0>
    libgtk+2-2.24.10-alt0.M60P.1
  Требует: <libgdk_pixbuf-2.0.so.0>
    libgdk-pixbuf-2.24.1-alt0.M60P.1
  Требует: <libgio-2.0.so.0>
    libgio-2.32.3-alt0.M60P.1
  Требует: <libglib-2.0.so.0>
    glib2-2.32.3-alt0.M60P.1
  Требует: <libgmodule-2.0.so.0>
    glib2-2.32.3-alt0.M60P.1
  Требует: <libgobject-2.0.so.0>
    glib2-2.32.3-alt0.M60P.1
  Требует: <libgthread-2.0.so.0>
    glib2-2.32.3-alt0.M60P.1
  Требует: <libgtk-x11-2.0.so.0>
    libgtk+2-2.24.10-alt0.M60P.1
  Требует: <libm.so.6(GLIBC_2.0)>
    glibc-core-6:2.11.3-alt8.M60P.5
  Требует: <libpango-1.0.so.0>
    libpango-1.29.4-alt1.M60P.1
  Требует: <libpangocairo-1.0.so.0>
    libpango-1.29.4-alt1.M60P.1
  Требует: <libpthread.so.0(GLIBC_2.0)>
    glibc-pthread-6:2.11.3-alt8.M60P.5
  Требует: <libpython2.6.so.1.0>
    python-base-2.6.6-alt4
  Требует: <libstdc++.so.6(CXXABI_1.3)>
    libstdc++6-4.5.4-alt1.M60P.1
  Требует: <libstdc++.so.6(GLIBCXX_3.4)>
    libstdc++6-4.5.4-alt1.M60P.1
  Требует: <libxml2.so.2>
    libxml2-1:2.8.0-alt0.M60P.1
  Требует: <libxml2.so.2(LIBXML2_2.4.30)>
    libxml2-1:2.8.0-alt0.M60P.1
  Требует: <libxml2.so.2(LIBXML2_2.5.0)>
    libxml2-1:2.8.0-alt0.M60P.1
  Требует: <libxml2.so.2(LIBXML2_2.5.7)>
    libxml2-1:2.8.0-alt0.M60P.1
  Требует: <libxml2.so.2(LIBXML2_2.6.0)>
    libxml2-1:2.8.0-alt0.M60P.1
  Требует: <libxml2.so.2(LIBXML2_2.6.6)>
    libxml2-1:2.8.0-alt0.M60P.1
  Требует: <python2.6(code)>
    python-modules-compiler-2.6.6-alt4
  Требует: <python2.6(gobject)>
    python-module-pygobject-2.28.4-alt1
  Требует: <python2.6(gtk)>
    python-module-pygtk-2.24.0-alt3
  Требует: <python2.6(keyword)>
    python-modules-compiler-2.6.6-alt4
  Требует: <python2.6(os)>
    python-base-2.6.6-alt4
  Требует: <python2.6(pango)>
    python-module-pygtk-2.24.0-alt3
  Требует: <python2.6(re)>
    python-base-2.6.6-alt4
  Требует: <python2.6(time)>
    python-base-2.6.6-alt4
  Требует: <rtld(GNU_HASH)>
    glibc-core-6:2.11.3-alt8.M60P.5
  Требует: xml-utils

С таким вот костылём, получаем список уникальных имён пакетов без разбора на библиотеки:
$ apt-cache depends medit | grep -v '<' | sort | uniq | sed 's/^.* //g;s/[0-9]*://g'
glib2-2.32.3-alt0.M60P.1
glibc-core-2.11.3-alt8.M60P.5
glibc-pthread-2.11.3-alt8.M60P.5
libatk-2.2.0-alt0.M60P.1
libcairo-1.10.2-alt7
libgcc1-4.5.4-alt1.M60P.1
libgdk-pixbuf-2.24.1-alt0.M60P.1
libgio-2.32.3-alt0.M60P.1
libgtk+2-2.24.10-alt0.M60P.1
libICE-1.0.7-alt2
libpango-1.29.4-alt1.M60P.1
libSM-1.2.0-alt3
libstdc++6-4.5.4-alt1.M60P.1
libX11-1.4.99.1-alt0.M60P.1
libxml2-2.8.0-alt0.M60P.1
medit-1.1.0-alt0.M60P.1
python-base-2.6.6-alt4
python-module-pygobject-2.28.4-alt1
python-module-pygtk-2.24.0-alt3
python-modules-compiler-2.6.6-alt4
xml-utils
« Последнее редактирование: 17.03.2017 00:47:40 от stranger573 »