Форум программистов, компьютерный форум, киберфорум
Наши страницы
Debian, Kali Linux, Raspbian
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
NeoMatrix
Модератор
Эксперт NIX
3736 / 1114 / 86
Регистрация: 24.05.2011
Сообщений: 10,294
Записей в блоге: 2
1

Удаление пакета без учёта зависимостей

25.10.2017, 01:54. Просмотров 1313. Ответов 3

Имеем Debian 9 с Gnome 3.22.3
Вместе с гномом в систему устанавливается пакет Caribou - виртуальная клавиатура этой оболочки по умолчанию.
В данной ситуации эта виртуальная клавиатура оказалась не нужна, т.к. требовалась другая - OnBoard.
Проблема была в том, что Caribou вылезала там, где не нужно и блокировала ввод с OnBoard. Требовалось Caribou либо отключить совсем, либо вообще удалить.
Но это всё так - исходные условия.

Проблема, по сути в том, что
Bash
1
apt-get remove caribou
или
Bash
1
apt-get purge caribou
по зависимостям удаляют и gnome-core вместе со всем рабочим окружением Gnome3, что в данном случае совершенно неприемлемо.

Теперь о том, как это сделать так, чтобы удалить Caribou и при этом оставить gnome-core.

Для начала, небольшое повествование, что есть такое зависимости в Linux и зачем они вообще нужны

Зависимости пакетов приложений в линуксах вообще нужны для того, чтобы вы, при установке какого-либо пакета приложения не выискивали все необходимые для его функционирования компоненты вручную, а выполняя одну короткую команду
Bash
1
apt-get install packagename
получали всё необходимое сразу.
Так же зависимостями управляются пакеты и при удалении: если данным пакетом больше ни одна программа не пользуется, то зачем ему занимать место на диске и вообще засорять систему?
Вообще - зависимости, за исключением некоторых гиковских дистрибутивов, это то, что, в первую очередь, отличает линуксы от виндовсов.
Ведь, именно благодаря зависимостям, решаются такие фичи линухов, как совместное использование разделяемых библиотек, совместимость версий пакетов, совместное обновление используемого ПО и многие прочие задачи.
Если коротко, то функциональность пакетных менеджеров основана как раз на удовлетворении зависимостей пакетов. И, если часть установленных в системе пакетов имеет неудовлетворённые зависимости, то система в целом более подвержена сбоям, снижается её безопасность и целостность, накапливается программный мусор и прочие проблемы. То есть, благодаря зависимостям пакетов и взаимодействию с ними пакетных менеджеров ваша система остаётся удобной, стабильной и быстрой.
Это, если коротко.
Более подробно о зависимостях, вы, конечно, можете самостоятельно нагуглить в интернетах, но я вам скажу просто: зависимости - это очень удобный и полезный функционал пакетных менеджеров, который просто так, не разбираясь в вопросе и не владея предметом, игнорировать однозначно не стоит. Поэтому, прежде чем выполнять нижеизложенные действия, подумайте и не делайте этого, если вы не вполне понимаете, что вы делаете.


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

Итак, мы уже методом
Bash
1
apt remove caribou
выяснили, что он тянет за собой и gnome-core, который тянет за собой вообще всю gnome-shell.
Исходя из того, что все ПМ в Debian (и его форках и потомках) в конечном итоге для управления пакетами (для непосредственного действия с пакетами) юзают dpkg, делаем вот что:

1.
Bash
1
dpkg --force-depends -r packagename
Но в данном случае (возможно, это зависит от версии самого dpkg) он у меня ругнулся и удалять карибу не захотел (дебиан вообще славится своей стабильностью именно благодаря сильной связанности пакетов зависимостями и вероятно поэтому выпиленной этой опцией в данной версии).
Как вариант, можно попробовать
Bash
1
dpkg --ignore-depends=packagename -r packagename
Но, у меня не сработало и это.
Итак, было решено уже выпиливать неугодный пакет вручную (до первого apt update && apt upgrade).
Но всё-таки, я хотел провести операцию более цивилизованным образом.

2. У dpkg где-то записаны все установленные пакеты и их зависимости в одном месте. Нам нужно выяснить путь и имя этого конфига.
Сей конфиг лежит в Debian 9 в пути
/var/lib/dpkg/
и называется status
То бишь, если мы отредактируем файл /var/lib/dpkg/status соответствующим образом, то, тем самым мы можем вручную разрешить зависимости любого пакета.
Это действие является весьма грязным хаком и крайне не рекомендуется для применения, в особенности для неопытных пользователей.
Перед началом данной операции обязательно сохраните его копию в то место, где вы его случайно удалить не сможете - создайте из под рута директорию в корне с нестандартным именем и правами только для рута. Кроме того, нам потребуется создать ещё один файлик (далее - tempfile) со списком зависимостей - он может быть в любом удобном вам месте и формате. Лучше, конечно, каждый зависимый пакет писать с новой строки (потом проще читать скриптом).
Этот файл имеет вот такой формат
Package: packagename
Status: install ok installed Статус пакета в системе
Priority: optional
Section: gnome
Installed-Size: 1856 Размер пакета в байтах
Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
Architecture: amd64
Version: 3.22.0-1 Версия пакета
Depends: Тут перечислены зависимости пакета через запятую, прямо вот так: libc6 (>= 2.14), libcairo2 (>= 1.2.4), libfontconfig1 (>= 2.11), libfreetype6 (>= 2.2.1), И так далее... Нам, собственно эта секция и нужна.
Description: character map application
Characters is a simple utility application to find and
insert unusual characters.
Homepage: https://wiki.gnome.org/Design/Apps/PackageName
Выделенного этим цветом в файле нет Там вообще нет нелатиницы.
PackageName - ищем необходимые нам пакеты с этим упоминанием. Регистр имеет значение.

Как удобнее искать?
Проще всего сделать поиск по файлу. Например, в Gedit открываем данный файл, жмякаем Ctrl+F и вводим имя пакета (в моём случае это было 'caribou') - редактор подсветит все упоминания в файле вне зависимости от регистра.
Упоминания будут наверняка не в одном месте.
И тут два варианта: в заголовке или в списке зависимостей.
В первом варианте делаем так: вырезаем из списка зависимостей всё, что вы удалять при удалении ненужного пакета не желаете и вставляете это в tempfile, куда я сказал вам выносить зависимости.
Например, при удалении caribou в libcaribou в зависимостях было упоминание libc6 (>= 2.14), который я удалять не собирался, поэтому я вырезал из секции Depends его упоминание и воткнул в tempfile.
Запутанно, неправда-ли?
Всё просто: то, что хотим удалить одновременно с удалением целевого пакета - оставляем в зависимостях, а остальное - переносим в tempfile
Второй случай: упоминание целевого пакета есть в зависимостях другого нужного нам пакета, который мы оставить хотим.
Тут ещё проще: просто удаляем это упоминание, а имя пакета заносим в наш временный файлик.
Ещё раз повторю: перед началом этого действия создайте его копию в недоступном для детей месте.
После того, как вы отредактировали данный файл (в смысле - 'status', а он весьма объёмистый), его нужно сохранить в том же месте и выполнить в терминале
Bash
1
dpkg -r packagename
И "непокорный" пакет будет удалён.
Но у нас ещё остаётся проблема восстановления удалённого пакета обновлением. Вот тут-то нам и потребуется этот наш временный файлик.
Чтобы порешать эту проблему, нужно выполнить следующее действие со всеми зависимыми от удалённого пакетами:
Bash
1
echo "depends-packagename hold" | sudo dpkg --set-selections
Тем самым "заморозить" эти пакеты и запретить их обновление.
Для автоматизации этого процесса выполним вот такой скриптик:
Bash
1
2
3
4
uniq /path/to/tempfile > ./sorted
_VAR=./sorted
cat "$_VAR" | while read _LINE; do
echo "$_LINE hold" | sudo dpkg --set-selections
И вот теперь мы можем быть уверены, что сей удалённый пакет в системе больше не появится, по крайней мере до тех пор, пока вы не изволите разморозить пакеты, перечисленные в tempfile и обновить их.

Заочно соглашусь, что данное решение может быть не самым правильным, с точки зрения философии ПМов и линухов вообще, но второй вариант у меня сработал.

Если у вас есть лучшие решения - поделитесь, но сильно тапками колотить меня не обязательно.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2017, 01:54
Ответы с готовыми решениями:

Установка notepadqq. Ошибка зависимостей
Ставлю notepadqq под debian 8 gnome 3 При установке notepadqq просил меня...

При установке зависимостей пакета вылазит ошибка "error: Unable to find vcvarsall.bat"
вообщем система win7, python 2.7.3, при установке в virtualenv pillow с помощью...

C# без зависимостей
Как сделать, чтобы программа на c# запускалась без доп. зависимостей на windows...

Компиляция без зависимостей
Добрый день, хотел переписать программу с c# на с++ из-за вечного: там...

Сборка qt без зависимостей
Собирал по этому мануалу, но в каталоге bin не появились необходимые dll....

3
Dmitry
Эксперт по компьютерным сетямЭксперт NIX
10766 / 6092 / 462
Регистрация: 09.09.2009
Сообщений: 24,155
25.10.2017, 09:58 2
сам не пробовал, но тут предлагается метод
1
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26339 / 17670 / 6998
Регистрация: 22.10.2011
Сообщений: 31,085
Записей в блоге: 6
25.10.2017, 10:38 3
Цитата Сообщение от NeoMatrix Посмотреть сообщение
Требовалось Caribou либо отключить совсем, либо вообще удалить.
Ну так отключи: в /usr/share/dbus-1/services/org.gnome.Caribou.Daemon.service закомментируй строчку Exec.
0
NeoMatrix
Модератор
Эксперт NIX
3736 / 1114 / 86
Регистрация: 24.05.2011
Сообщений: 10,294
Записей в блоге: 2
25.10.2017, 22:11  [ТС] 4
Цитата Сообщение от volvo Посмотреть сообщение
Ну так отключи
Помогает частично. В редакторах, в браузере и т.д. не появляется, а при запросах паролей системой - блокирует ввод с onboard.
Пробовал.

Добавлено через 10 часов 40 минут
Цитата Сообщение от Dmitry Посмотреть сообщение
тут предлагается метод
В следующий подобный раз обязательно испробую.
Хороший и правильный, по-идее, метод.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2017, 22:11

Удаление старых зависимостей (или путей)
Доброго дня! Не хотелось начинать общение с глупых вопросов, но ответа так и...

Dll без внешних зависимостей?
Добрый день, Волею судьбы приходится писать программы для C++Builder XE8. К...

Получать из БД запись с ее зависимостями или без зависимостей?
Здравствуйте! К примеру есть класс class Company { public User User ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru