Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

"exists in filesystem": причины и когда --overwrite нужен

Сразу к делу: ошибка error: failed to commit transaction (conflicting files) с сообщением <путь> exists in filesystem появляется, когда pacman при установке или обновлении пакета находит на диске файл, который не принадлежит ни одному установленному пакету, но должен быть создан новым пакетом. pacman отказывается перезаписывать такой «чужой» файл, чтобы не уничтожить твои файлы. Лечится это просто: найди владельца файла через pacman -Qo, проверь, что это за файл, и либо перенеси его в сторону командой mv, либо удали, если он точно не нужен. Флаг --overwrite используй только в крайнем случае, когда понимаешь, что именно перезаписываешь.

Что значит ошибка “exists in filesystem”

Разберём вывод pacman по шагам. При обновлении системы:

pacman -Syu

pacman может остановиться с таким текстом:

error: failed to commit transaction (conflicting files)
/usr/share/fonts/opentype/some-font/SomeFont.otf exists in filesystem
Errors occurred, no packages were upgraded.

Первая строка — общий заголовок: транзакция не прошла из-за конфликта файлов. Вторая — конкретика: файл /usr/share/fonts/opentype/some-font/SomeFont.otf уже лежит на диске, но pacman не знает, кому он принадлежит. При этом пакет, который ты обновляешь, хочет создать файл с таким же путём. Возникает противоречие: перезаписать файл pacman не может, потому что он не его, а пропустить нельзя — пакет без файла будет неполным. Поэтому транзакция отменяется целиком, и ни один пакет не обновляется.

Важно: ошибка касается только файлов, которые не отслеживает ни один пакет. Если файл принадлежит другому установленному пакету, pacman спокойно перезапишет его при обновлении — это нормальное поведение. Проблема возникает именно с посторонними файлами.

Не путай эту ошибку с конфликтом двух пакетов. Когда два пакета претендуют на один путь, pacman пишет file owned by X and Y — это другая ситуация, и лечится она иначе: обычно обновлением всех пакетов или удалением лишнего. А вот exists in filesystem всегда означает одно: файл на диске не числится в базе pacman.

Почему pacman отказывается перезаписывать файл

Это защитный механизм. База данных pacman хранит список файлов каждого установленного пакета. Когда пакет обновляется, pacman сверяет файлы на диске с базой. Если файл на диске не числится ни в одном пакете, pacman считает его чужим: возможно, это твоя конфигурация, твои файлы или результат ручной установки. Перезаписать такой файл молча — значит рисковать потерять информацию.

Поэтому pacman останавливается и по сути спрашивает: «на диске лежит файл, который я не создавал. Что с ним делать?». Ответ по умолчанию — ничего, транзакция отменяется. Это безопасное поведение, и ломать его без причины не стоит.

Заметь: pacman не удаляет и не переименовывает посторонний файл сам. Он не знает, насколько он тебе дорог. Возможно, это шрифт, который ты ставил вручную, или конфиг, который правил неделю. Решение всегда остаётся за тобой — pacman лишь честно сообщает о конфликте и ждёт.

Откуда берутся посторонние файлы

Чаще всего конфликт возникает по одной из причин:

  • Пакет из AUR установил файл вручную. Например, PKGBUILD с make install вместо make DESTDIR="$pkgdir" install кладёт файлы прямо в систему, минуя базу pacman. Подробнее про установку из AUR — в статье «Установка пакетов из AUR».
  • Шрифты, бинарники или systemd-юниты, скопированные вручную в /usr/share, /usr/bin или /etc/systemd/system. Классика — ручная установка шрифтов в /usr/share/fonts вместо ~/.local/share/fonts.
  • Пакет переименовали, а старый оставил файлы на диске. Новый пакет хочет создать те же пути, но старые файлы никто не удалил.
  • Остатки конфигурации после удаления пакета без pacman -Rns (без удаления конфигов).
  • Раннее использование --overwrite без разбора: файл перезаписан, но в базу pacman так и не попал.
  • Установка программы другим способом: make install из исходников, скрипт установки, копирование файлов с другого диска.

Во всех случаях картина одна: на диске есть файл, о котором база pacman ничего не знает.

Отдельно про шрифты: это самая частая жалоба. Пользователь скачал красивый шрифт, положил его в /usr/share/fonts, шрифт работает. Потом пакет ttf-... из репозитория хочет поставить файл с тем же именем — и получает конфликт. Правильное место для личных шрифтов — ~/.local/share/fonts, там pacman их не трогает и конфликтов не бывает.

Как безопасно диагностировать конфликт

Не спеши удалять файл. Сначала выясни, кто он такой.

Шаг 1: проверь владельца через pacman -Qo

pacman -Qo /usr/share/fonts/opentype/some-font/SomeFont.otf

Если файл принадлежит какому-то пакету, pacman покажет его имя и версию. Если нет — выведет error: No package owns /usr/share/fonts/opentype/some-font/SomeFont.otf. Это и есть подтверждение: файл посторонний.

Шаг 2: посмотри, что это за файл

ls -l /usr/share/fonts/opentype/some-font/SomeFont.otf
file /usr/share/fonts/opentype/some-font/SomeFont.otf

Сравни с тем, что должен поставить пакет. Если это твоя правленая конфигурация — она тебе нужна. Если это старый дубликат или мусор — можно удалять.

Шаг 3: перенеси файл в сторону, а не удаляй

mv /usr/share/fonts/opentype/some-font/SomeFont.otf /usr/share/fonts/opentype/some-font/SomeFont.otf.bak

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

pacman -Syu

Теперь pacman спокойно создаст файл сам. Если конфликтующих файлов несколько — pacman покажет их все, переноси по одному или скриптом в цикле.

Шаг 4: удаляй только то, что точно не нужно

Если файл — старый дубликат или мусор, удали его:

rm /usr/share/fonts/opentype/some-font/SomeFont.otf

И снова pacman -Syu. Общая методика диагностики таких проблем — в статье «Методика решения проблем в Arch Linux».

Когда –overwrite оправдан

Флаг --overwrite заставляет pacman перезаписать файл, не спрашивая. Команда выглядит так:

pacman -Syu --overwrite '/usr/lib/example/*'

В кавычках — шаблон (glob), которому должны соответствовать конфликтующие файлы. Можно указать и точный путь.

Оправданных случаев немного:

  • Arch Linux News официально рекомендует --overwrite после переименования пакетов, когда файлы переехали из одного пакета в другой. Перед обновлением всегда заглядывай в новости Arch — если там есть инструкция с --overwrite, следуй ей.
  • Пересборка пакета из AUR, когда новый PKGBUILD изменил пути файлов, а старые остались на диске.
  • Несовпадение заголовков ядра и модулей после обновления, когда pacman не может заменить файлы в /usr/lib/modules.

Во всех случаях ты понимаешь, что именно перезаписываешь и почему это безопасно.

Как проверить, что конфликт известный? Открой новости Arch Linux и поищи название пакета из сообщения об ошибке. Если там написано «выполните pacman -Syu --overwrite ...» — это официальная рекомендация, ей можно доверять. Если новостей нет, а конфликт всё равно появился — скорее всего, файл посторонний, и его нужно перенести или удалить, а не перезаписывать.

Когда –overwrite опасен

--overwrite отключает защиту pacman. Он перезапишет файл, даже если это твоя правленая конфигурация. Например, ты вручную правил файл в /etc — при обычном обновлении pacman не трогает изменённые конфиги, а сохраняет их рядом как .pacnew. Но с --overwrite файл будет заменён без предупреждения, и твои правки пропадут.

Поэтому:

  • Не используй --overwrite «на всякий случай» при каждом обновлении.
  • Не применяй --overwrite '*' — это перезапишет всё подряд.
  • Сначала проверь новости Arch и поищи, не известная ли это проблема.
  • Если конфликт касается конфигов — перенеси их в сторону, а не перезаписывай.

Правило простое: --overwrite — инструмент для известных случаев, а не первая реакция на ошибку.

Что делать после разрешения конфликта

После успешного обновления проверь целостность пакета:

pacman -Qkk <имя-пакета>

Команда сверит файлы пакета с базой и покажет расхождения. Если всё в порядке — вывод будет пустым.

Если обновление затронуло службы, посмотри журнал:

journalctl -b -p err

Так ты заметишь проблемы, которые могли возникнуть из-за замены файлов. Полный разбор команд pacman — в статье «pacman от А до Я: команды». А если после обновления pacman ругается на повреждённую базу — смотри «pacman fails to commit: invalid or corrupted».

Частые вопросы

Ошибка “exists in filesystem” — это опасно?

Нет. Это защита pacman от потери данных. Транзакция просто отменяется, система остаётся в прежнем состоянии. Опасно не само сообщение, а неправильная реакция на него — например, бездумный --overwrite.

Что делать, если конфликтующих файлов много?

Переноси их по одному или скриптом в цикле, затем повторяй pacman -Syu. Если файлы однотипные (например, шрифты) и точно не нужны — удаляй. Главное — сначала убедись через pacman -Qo, что ни один пакет их не отслеживает.

Можно ли удалить файл, если pacman -Qo ничего не нашёл?

Можно, если ты уверен, что это не твои файлы. pacman -Qo не нашёл владельца — значит, файл не принадлежит ни одному пакету. Но перед удалением лучше перенести его в .bak и проверить систему после обновления.

–overwrite сломает мои конфиги?

Да, если файл в шаблоне — твоя правленая конфигурация. pacman заменит её версией из пакета, а твои изменения пропадут. Поэтому перед --overwrite проверь, какие файлы попадают под шаблон, и при необходимости сохрани их копии.

Нужно ли перезагружаться после разрешения конфликта?

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

Полезные ресурсы

Заключение

Ошибка “exists in filesystem” — не поломка, а страховка pacman. Она появляется, когда на диске лежит файл, не отслеживаемый ни одним пакетом, а новый пакет хочет создать такой же путь. Действуй по порядку: pacman -Qo — узнай владельца, осмотри файл, перенеси в .bak или удали, повтори pacman -Syu. --overwrite оставь для случаев, когда новости Arch или известная проблема явно требуют его. Так ты обновишь систему без потери файлов и без сюрпризов.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Читайте также

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max