Сразу к делу: warning: local is newer than core появляется, когда установленный у тебя пакет новее, чем версия в репозитории. Pacman видит, что зеркало предлагает более старую сборку, и пропускает «обновление», чтобы не откатывать пакет. Причина почти всегда одна — рассинхрон зеркала с основными репозиториями Arch. Лечится принудительным обновлением баз командой pacman -Syy и повторным pacman -Syu.
Pacman сравнивает версии пакетов по схеме epoch:pkgver-pkgrel. Сначала сравнивается epoch, потом pkgver, потом pkgrel. Если локальная версия выше хотя бы по одному из полей, pacman считает пакет «новее» и не ставит версию из репозитория. Вместо установки он печатает предупреждение и пропускает пакет.
Разберём на примере. У тебя установлен mesa 24.2.8-1, а зеркало предлагает 24.2.7-1. Pacman сравнивает pkgver: 24.2.8 против 24.2.7, видит, что локальная версия выше, и пропускает пакет. Тот же результат, если отличается только pkgrel — например, 24.2.8-2 против 24.2.8-1. А вот epoch важнее всего: если у репозитория epoch выше, pacman обновит пакет, даже когда pkgver ниже.
Это защита от отката. По умолчанию pacman не понижает версии пакетов, и warning: local is newer than core — штатное поведение, а не ошибка. Система продолжает работать с локальной версией пакета.
Опасность не в самом предупреждении, а в его причине. Если зеркало отстаёт, ты не получаешь настоящие обновления, а часть пакетов может «пропасть» из репозитория. Поэтому предупреждение — повод проверить зеркала, а не игнорировать его.
Зеркала Arch синхронизируются с главного сервера не мгновенно. Между появлением пакета на архиве и его копией на конкретном зеркале проходит время. В этот промежуток возможны два состояния:
repo.db на зеркале уже свежий, а сами пакеты ещё старые. Pacman видит новые версии в базе, но при скачивании получает старые файлы.repo.db ещё нет. Pacman не видит новых версий вовсе и считает локальные пакеты «новее».Оба состояния дают warning: local is newer than core или ошибку «target not found».
Зеркала синхронизируются с главного сервера по расписанию, у каждого своего. Часть зеркал тянет файлы напрямую, часть — с других зеркал, поэтому отставание у всех разное. В любой момент времени часть зеркал свежая, а часть отстаёт на несколько часов. Именно поэтому одна и та же команда на разных зеркалах даёт разные результаты.
Ещё одна причина — частичное обновление. Если ты обновлял систему не полностью, часть пакетов осталась старых версий. При следующем полном обновлении pacman может посчитать их «новее» репозитория. Подробнее — в статье «Частичное обновление в Arch Linux».
Иногда пакет не пропал, а переименован или разбит на несколько. Например, пакет разделили на основной и дополнительные, и старое имя больше не существует. В этом случае pacman тоже пишет, что пакет не найден, хотя с зеркалом всё в порядке.
Вторая частая жалоба — пакеты lib32-* внезапно перестают находиться. Например, lib32-mesa или lib32-vulkan-* исчезают из поиска или не обновляются. Причины:
/etc/pacman.conf.repo.db на зеркале взят из другого снимка, и пакет в нём ещё не появился.Типичная картина: вчера lib32-* обновлялись, сегодня pacman -Syu их не видит, а pacman -Ss lib32-mesa возвращает пустоту. При этом 64-битные пакеты обновляются нормально. Это почти всегда зеркало: multilib на нём либо не синхронизируется вовсе, либо синхронизируется реже, чем core и extra.
Проверь, включён ли multilib:
grep -A2 '^\[multilib\]' /etc/pacman.conf
Должно быть:
[multilib]
Include = /etc/pacman.d/mirrorlist
Если секции нет или она закомментирована — раскомментируй и обнови базы:
sudo pacman -Syy
Сначала посмотри, в каком репозитории лежит пакет:
pacman -Si lib32-mesa
В выводе поле Repository покажет, откуда берётся пакет. Если пакета нет в базе, pacman -Si вернёт ошибку «target not found».
Сравни установленную версию с версией в репозитории:
pacman -Qi lib32-mesa
pacman -Si lib32-mesa
Поля Version в обоих выводах должны совпадать. Если локальная версия выше — зеркало отстаёт.
Принудительно скачай свежие базы со всех зеркал:
sudo pacman -Syy
Ключ -yy заставляет pacman скачать repo.db заново, даже если файл уже есть. Обычный pacman -Sy пропускает загрузку, когда база на месте, и при рассинхроне не помогает.
Узнать, с какого зеркала pacman скачивает базы, можно по выводу pacman -Syy — в начале каждой строки стоит адрес зеркала. Если адрес один и тот же для всех репозиториев — работает одно зеркало, и его состояние определяет всё.
На странице статуса зеркал на archlinux.org видно, когда каждое зеркало синхронизировалось в последний раз. Если зеркало отстаёт на несколько часов или дней — оно в списке рассинхронизированных, и от него стоит отказаться.
Свежесть базы можно проверить и локально. Файлы repo.db лежат в /var/lib/pacman/sync/:
ls -l /var/lib/pacman/sync/
Дата изменения файла показывает, когда база скачана в последний раз. Если core.db старше нескольких часов, а обновления в репозитории выходят регулярно — зеркало отстаёт. Свежая база — необходимое условие, но не достаточное: сам файл мог обновиться, а пакеты на зеркале ещё нет. Поэтому после проверки базы всегда сверяй версии через pacman -Si и pacman -Qi.
После pacman -Syy выполни полное обновление:
sudo pacman -Syu
Если предупреждение исчезло — зеркало просто отставало. Если нет — смени зеркало. Поставь в начало /etc/pacman.d/mirrorlist зеркало с гео-балансировкой:
Server = https://geo.mirror.pkgbuild.com/$repo/os/$arch
Оно автоматически направляет на ближайшее синхронизированное зеркало. Как выбрать и проверить зеркала — в статье «Медленные зеркала и reflector».
Если хочешь автоматизировать выбор зеркал — используй reflector. Он опрашивает зеркала, сортирует по скорости и записывает свежий список:
sudo reflector --latest 10 --protocol https --sort rate --save /etc/pacman.d/mirrorlist
После этого снова выполни pacman -Syy и pacman -Syu.
После смены зеркала проверь, что все три репозитория — core, extra и multilib — обновились. Вывод pacman -Syy должен показать загрузку всех трёх баз. Если multilib в списке нет — секция в /etc/pacman.conf отключена, вернись к разделу про multilib.
Иногда достаточно подождать. Синхронизация зеркал занимает от нескольких минут до получаса. Если пакет пропал из-за рассинхрона, через полчаса он обычно появляется снова.
Соблазн поставить пакет в обход предупреждения понятен, но обходные пути опасны.
pacman -S <пакет> --ignore=... не решает проблему. --ignore исключает пакет из обновления, а не ставит нужную версию. Использовать его для «починки» рассинхрона — значит замаскировать симптом. Это рабочий инструмент, когда нужно осознанно заморозить версию пакета, но для лечения рассинхрона он бесполезен: пакет останется старым, а предупреждение вернётся при следующем обновлении.
Установка локального пакета через pacman -U с более старой версией — это откат. Если пакет тянет зависимости, pacman может потребовать откатить и их, а это уже частичное обновление со всеми его последствиями. Правильный способ откатить пакет — через архив Arch Linux, об этом отдельная статья «Откат пакетов через архив Arch Linux».
Пример: зеркало отстаёт по lib32-mesa, и ты ставишь старую версию через pacman -U. Если старая версия требует старый mesa, pacman предложит откатить и его. Дальше — цепочка откатов, и система уходит в частичное обновление. Чинить это потом сложнее, чем подождать полчаса.
В большинстве случаев «local is newer» лечится ожиданием или сменой зеркала, а не принудительной установкой.
После смены зеркала или ожидания:
sudo pacman -Syy
sudo pacman -Syu
Затем сверь версии:
pacman -Qi <пакет>
pacman -Si <пакет>
Если Version совпадают и предупреждений нет — всё в порядке. Полный разбор команд pacman — в статье «Pacman от А до Я».
Нет. Система продолжает работать с локальной версией пакета. Опасен не сам отказ от обновления, а причина: рассинхронизированное зеркало может скрывать настоящие обновления. Если предупреждение повторяется для многих пакетов сразу — зеркало отстаёт системно, меняй его.
Обычный pacman -Sy скачивает базы, только если файл repo.db изменился. При рассинхроне зеркало может отдавать тот же файл, поэтому нужен pacman -Syy — он принудительно скачивает базы заново.
Нет. Чаще всего зеркало просто не синхронизировало multilib. Проверь /etc/pacman.conf, выполни pacman -Syy и при необходимости смени зеркало на то, которое несёт multilib. Узнать, какие репозитории поддерживает зеркало, можно на странице статуса зеркал на archlinux.org.
Можно, но не нужно. pacman -U с локальным файлом или --ignore маскируют проблему и могут привести к частичному обновлению. Правильный путь — дождаться синхронизации или сменить зеркало. Исключение — осознанный откат через архив Arch Linux, но это отдельная операция, а не способ обойти предупреждение.
Сравни вывод pacman -Si со старым именем и поищи новое имя в базе. Если пакет переименован, в PKGBUILD обычно указано поле replaces. Проверить можно через pacman -Ss <ключевое слово>.
warning: local is newer than core — сигнал рассинхрона зеркала, а не поломки системы. Pacman отказывается откатывать пакет, и это правильно. Лечение простое: pacman -Syy, затем pacman -Syu, при необходимости — смена зеркала. Пропавшие пакеты из multilib почти всегда возвращаются после принудительного обновления баз или перехода на зеркало, которое синхронизирует multilib. Не форсируй установку в обход предупреждения — дождись синхронизации или смени зеркало. Тогда обновления снова пойдут ровно, без предупреждений и пропавших пакетов.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии