Во время выполнения обновлений в Arch Linux и производных дистрибутивах (Manjaro, BlackArch), перед непосредственной установкой новых версий пакетов выполняется несколько проверок:
- проверка, имеются ли все необходимые зависимости
- проверка имеются ли конфликтующие пакеты
Предыдущие две проверки выполняются ещё до загрузки установочных файлов.
Сразу после загрузки установочных файлов (но, естественно, ещё до их установки) выполняется ещё ряд проверок:
- проверка ключей в keyring
- проверка целостности скаченных пакетов
- проверка имеющегося места на диске — если места на диске не хватит для установки пакетов, то обновление (или установка) будут прерваны
- выполняется проверка на конфликтующие файлы. Конфликтующие файлы: это файлы в вашей Linux, которые располагаются в тех же директориях и имеют то же имя что и файлы в установочных пакетах, но при этом не принадлежат старым версиям пакетов.
Все эти проверки проходят автоматически и обычно не вызывают никаких проблем. Но бывают исключения. Например, команда для полного обновления операционной системы Arch Linux:
pacman -Syu
На моей операционной системе вызвала следующую ошибку:
:: Synchronizing package databases... core 128.5 KiB 489 KiB/s 00:00 [######################] 100% extra 8.3 MiB 14.9 MiB/s 00:01 [######################] 100% community 45.0 B 803 B/s 00:00 [######################] 100% multilib 143.6 KiB 2.00 MiB/s 00:00 [######################] 100% blackarch is up to date :: Starting full system upgrade... resolving dependencies... looking for conflicting packages... Packages (4) boost-libs-1.83.0-2 python-appdirs-1.4.4-9 python-argparse-1.4.0-15 python-jaraco.functools-3.9.0-1 Total Download Size: 2.32 MiB Total Installed Size: 8.50 MiB Net Upgrade Size: -0.19 MiB :: Proceed with installation? [Y/n] :: Retrieving packages... boost-libs-1.83.... 2.3 MiB 14.2 MiB/s 00:00 [######################] 100% python-argparse-... 22.0 KiB 173 KiB/s 00:00 [######################] 100% python-appdirs-1... 17.3 KiB 309 KiB/s 00:00 [######################] 100% python-jaraco.fu... 16.6 KiB 276 KiB/s 00:00 [######################] 100% Total (4/4) 2.3 MiB 3.65 MiB/s 00:01 [######################] 100% (4/4) checking keys in keyring [######################] 100% (4/4) checking package integrity [######################] 100% (4/4) loading package files [######################] 100% (4/4) checking for file conflicts [######################] 100% error: failed to commit transaction (conflicting files) python-argparse: /usr/lib/python3.11/site-packages/argparse-1.4.0.dist-info/INSTALLER exists in filesystem python-argparse: /usr/lib/python3.11/site-packages/argparse-1.4.0.dist-info/METADATA exists in filesystem python-argparse: /usr/lib/python3.11/site-packages/argparse-1.4.0.dist-info/RECORD exists in filesystem python-argparse: /usr/lib/python3.11/site-packages/argparse-1.4.0.dist-info/WHEEL exists in filesystem python-argparse: /usr/lib/python3.11/site-packages/argparse-1.4.0.dist-info/top_level.txt exists in filesystem Errors occurred, no packages were upgraded.
В последней строке сказано:
Errors occurred, no packages were upgraded.
То есть пакеты не были обновлены из-за ошибки.
Но основное сообщение, которое поможет нам разобраться в проблеме, содержится выше, а именно в строке:
error: failed to commit transaction (conflicting files)
То есть главной причиной является конфликт файлов.
Последующие строки уточняют, какие пакеты конфликтуют с какими файлами. Вначале строки идёт имя пакета для установки, а затем через двоеточие указывается файл, который уже содержится в файловой системе и который препятствует установке пакета, поскольку в этом пакете имеется файл с точно таким же расположением. Необходимо отметить, что файлы в старых версиях пакетов не вызывают этой ошибки, поскольку удаляются автоматически.
Обычно конфликт файлов вызывают пакеты Python установленные с помощью PIP. Например, вы установили пакет Python командой pip3, поскольку без него не работало то или иное приложение. А впоследствии этот пакет стал зависимостью для другого, уже установленного в системе приложения. В результате при очередном обновлении данный пакет система пытается установить в качестве зависимости, но файлы с такими же названиями уже существуют.
Самым правильным решением в этом случае является удаление пакета с помощью команды pip3, например:
pip3 uninstall PACKAGE
Довольно часто имя пакета PIP совпадает с именем пакета Python в репозитории, если из этого имени убрать строку «python-».
Но это работает не всегда, например, некоторые пакеты имеют в названии прописные (заглавные) буквы, а в репозиториях все имена пакетов пишутся строчными буквами. Бывают и другие особенности наименования пакетов.
Чтобы вывести полный список пакетов, которые установлены программой PIP, выполните следующую команду:
pip list
Смотрите также:
В этом списке вы можете найти проблемный пакет и удалить его с помощью команды вида:
pip3 uninstall PACKAGE
Для меня это срабатывало десятки раз. Но однажды я столкнулся с тем, что данный метод не сработал. ОС считала, что пакет, которому принадлежит проблемный файл, не установлен и, следовательно, удалять нечего.
Если вы столкнулись с такой же патовой ситуацией, то одним из вариантов её решения является переписать проблемный файл. То есть уже существующий в ОС файл будет заменён файлом из устанавливаемого пакета.
Это можно сделать командой вида:
sudo pacman -S --overwrite '/*' PACKAGE
В этой команде вместо PACKAGE укажите пакет, который вы не можете установить из-за конфликтующих файлов. В результате пакет будет установлен, а конфликтующие файлы будут принудительно перезаписаны.
К примеру, в моём случае помогла следующая команда:
sudo pacman -S --overwrite '/*' python-argparse
Сразу после установки проблемного пакета, удалось выполнить полное обновление операционной системы.
Смотрите также: Аналог опции --force в pacman
Заключение
Ошибка с одним из установочных пакетов (например, конфликтующие файлы) препятствует обновлению как этого пакета, так и всех остальных.
При возникновении проблемы конфликта файлов попытайтесь выяснить причину проблемы и добейтесь удаления файла теми же средствами, которыми он был установлен — например, с помощью другого менеджера пакетов. Это крайне желательно, поскольку если один и тот же пакет будет обновляться разными менеджерами пакетов, то это может привести как к неработоспособности пакета, так и к появлению аналогичных ошибок в будущем.
И только если ничего не помогло и вы действительно понимаете что делаете, то установите проблемный пакет запустив pacman с опцией --overwrite.
Близкие статьи
- Автоматическая установка и обновление пакетов AUR (100%)
- Как в Arch Linux (BlackArch, Manjaro) посмотреть информацию о пакете (100%)
- Как скачать пакет без установки в Arch Linux и Manjaro. Как скачать исходный код пакета AUR (100%)
- Как установить и использовать pikaur и makepkg на сервере (100%)
- Ошибка «ModuleNotFoundError: No module named 'pikaur'» (РЕШЕНО) (90.6%)
- Ошибка «error: GPGME error: No data. error: failed to synchronize all databases (unexpected error)» (РЕШЕНО) (RANDOM - 70.6%)