Сразу к делу: базы pacman лежат в каталоге /var/lib/pacman. Внутри два подкаталога: local с информацией об установленных пакетах и sync с индексами репозиториев (core.db, extra.db, multilib.db). Sync-базы пересоздаются за минуту: удали файлы из sync/ и выполни pacman -Syy. Local-база официально не пересоздаётся, её восстанавливают из резервной копии или переустановкой пакетов.
Всё, что pacman знает о системе, хранится в одном месте:
/var/lib/pacman/
├── local/ # база установленных пакетов
│ └── <пакет>-<версия>/
│ ├── desc
│ ├── files
│ ├── mtree
│ └── install
├── sync/ # индексы репозиториев
│ ├── core.db
│ ├── core.files
│ ├── extra.db
│ ├── extra.files
│ └── multilib.db
└── db.lck # файл блокировки
local отвечает на вопрос «что установлено», sync отвечает на вопрос «что есть в репозиториях». db.lck появляется на время работы pacman и исчезает после. Файлы баз не стоит трогать руками, пока pacman работает, для этого и существует блокировка.
Каталог /var/lib/pacman принадлежит root. Если владелец или права сбиты, pacman не сможет создать db.lck и откажется работать. Проверка:
ls -ld /var/lib/pacman
Ожидаемый вывод: drwxr-xr-x root root. Если владелец другой, верни root:
chown root:root /var/lib/pacman
Базы живут на корневом разделе. Если корень забит под завязку, pacman может не суметь записать обновлённые файлы. Следи за свободным местом:
df -h /
Если удалить весь каталог /var/lib/pacman целиком, pacman при следующем запуске создаст структуру заново: каталоги local и sync появятся пустыми. Только учти, что пустая local-база означает «ничего не установлено», поэтому pacman -Syu попытается поставить всю систему заново. Такой фокус годится только для экспериментов в виртуалке.
local это база установленных пакетов. На каждый установленный пакет заводится каталог с именем <имя>-<версия>, внутри четыре файла:
desc содержит описание пакета: имя, версию, зависимости, группы, архитектуру.files хранит полный список файлов пакета.mtree хранит контрольные суммы, размеры и права файлов. По нему pacman -Qkk сверяет файлы на диске.install содержит скрипты установки и удаления, если они есть.Отсюда pacman берёт информацию для pacman -Q, pacman -Qs, pacman -Qi. Если удалить каталог одного пакета из local, pacman перестанет считать его установленным, хотя файлы останутся на диске.
Посмотреть, что лежит в базе, можно и через сам pacman:
pacman -Qi linux
Вывод собран из desc и install соответствующего каталога в local. Другие команды тоже читают эту базу: pacman -Qo /путь/к/файлу ищет владельца файла, pacman -Qe показывает явно установленные пакеты, pacman -Ql выводит список файлов пакета.
Пример: узнать, какому пакету принадлежит /usr/bin/vim:
pacman -Qo /usr/bin/vim
Ответ придёт из local-базы: имя пакета и версия. Если файл никому не принадлежит, pacman ответит «No package owns …».
sync/*.db это индексы репозиториев, скачанные при обновлении. Это не сами пакеты. Пакеты лежат в /var/cache/pacman/pkg, а в sync хранятся только списки: какие пакеты есть в репозитории, их версии, зависимости и описания.
pacman -S ищет пакеты именно по этим базам. Файлы .files рядом с .db содержат списки файлов каждого пакета, по ним работает поиск pacman -F.
Файлы .db это gzip-архивы. Внутрь можно заглянуть без всяких инструментов:
tar -tf /var/lib/pacman/sync/extra.db | head
Увидишь имена пакетов и их версии. Так же устроены .files, только внутри списки файлов.
Если файл базы пропал, pacman скачает его заново при ближайшем pacman -Sy. Поэтому «пересоздание» sync-баз сводится к удалению битых файлов и принудительному обновлению.
Имена файлов в sync совпадают с именами репозиториев из /etc/pacman.conf. Подключил сторонний репозиторий вроде chaotic-aur, и после pacman -Syy рядом с core.db появится его база. Удалил репозиторий из конфига, а его файл в sync останется висеть мёртвым грузом, пока не уберёшь руками.
db.lck это файл блокировки. pacman создаёт его при старте любой операции, меняющей базы (установка, удаление, обновление), и удаляет при завершении. Он не даёт двум процессам pacman писать в базы одновременно. Запусти pacman в двух терминалах сразу, и второй упрётся в блокировку.
Если pacman упал (kill, сбой питания, зависание), db.lck остаётся на месте. Следующий запуск завершится ошибкой:
error: failed to init transaction (unable to lock database)
error: could not lock database: File exists
Лечение простое:
rm /var/lib/pacman/db.lck
Это безопасно: pacman создаст файл заново при следующем запуске. Но сначала убедись, что другой pacman реально не работает:
pgrep -a pacman
Если вывод пустой, можно удалять. Если pacman ещё выполняется, дождись его завершения, иначе рискуешь повредить базы. Запросы pacman -Q блокировку не берут, они только читают базы.
Сам файл пустой, весит ноль байт. Его наличие или отсутствие и есть признак блокировки. Проверить можно так:
ls -l /var/lib/pacman/db.lck
Если файл есть, а pacman не запущен, значит, прошлый процесс завершился некорректно.
Самый простой способ: удалить файлы баз и скачать их заново.
rm /var/lib/pacman/sync/*.db /var/lib/pacman/sync/*.files
pacman -Syy
pacman -Syy принудительно обновляет все базы, даже если сервер не сообщает об изменениях. При частичном повреждении одного -Syy может хватить: pacman перезапишет файлы. Но при сильном повреждении (битые файлы, ошибки распаковки) удаление надёжнее.
Проверь размеры свежих баз:
ls -lh /var/lib/pacman/sync/
После пересоздания проверь, что поиск работает:
pacman -Ss linux
Если скачивание падает с ошибками сети, проблема скорее в зеркалах, а не в базах. После пересоздания баз полезно сразу обновить систему, чтобы pacman пересчитал версии:
pacman -Syu
Если базы были старые, обновление подтянет свежие версии пакетов.
Local-база не пересоздаётся официально. Инструмента вроде «перегенерировать local» не существует: pacman не может угадать, какие пакеты установлены и какой версии. Повреждение случается редко, обычно после сбоя диска или ручного редактирования.
Симптомы повреждения:
pacman -Q выводит пустоту или ошибки вместо списка пакетов.pacman -Syu пытается переустановить чуть ли не всю систему.pacman -Qkk падает с ошибками чтения базы.Оценить масштаб бедствия можно сравнением двух счётчиков:
ls /var/lib/pacman/local | wc -l
pacman -Q | wc -l
Обе команды должны вывести одно и то же число. Расхождение значит, что часть записей потеряна.
Варианты восстановления:
После любого восстановления прогони проверку целостности.
pacman -D --check (короткая форма pacman -Dk) проверяет зависимости и согласованность local-базы:
pacman -D --check
Если база целая, вывод пустой. Ошибки вроде «missing dependency» покажут расхождения.
Файлы установленных пакетов сверяются по mtree:
pacman -Qkk
Команда сравнит каждый файл с контрольной суммой из базы. Битые файлы будут помечены. Если расхождений нет, вывод пустой.
Одиночный pacman -Qk работает быстрее, но проверяет меньше: он сверяет только наличие файлов. Двойное -Qkk читает контрольные суммы и ловит подменённые или повреждённые файлы.
Перед рискованными операциями (смена диска, эксперименты с пакетами) скопируй весь каталог:
cp -a /var/lib/pacman /root/pacman.bak
Флаг -a сохраняет права и владельца. Копия занимает немного места: базы весят десятки мегабайт. Делай копию, когда pacman не запущен, иначе в бэкап попадут полузаписанные файлы.
Восстановление из копии:
rm -rf /var/lib/pacman/local
cp -a /root/pacman.bak/local /var/lib/pacman/
Перед этим убедись, что pacman не запущен. После восстановления проверь систему:
pacman -Qkk
pacman -D --check
Если пакеты не совпадают с базой (например, после частичного обновления), переустанови проблемные. Список пакетов возьми из копии базы, а сами пакеты из кеша или репозитория. Если повреждены и sync-базы, восстанови их так же из копии или перекачай заново.
Копия всего каталога, а не только local, удобнее: при восстановлении вернёшь и sync-базы, и не придётся перекачивать их заново. Достаточно заменить каталог целиком:
rm -rf /var/lib/pacman
cp -a /root/pacman.bak /var/lib/pacman
После этого pacman -Qkk покажет, какие пакеты изменились с момента копии.
Эта ошибка появляется при проверке подписи sync-базы:
error: core.db: signature from "..." is unknown trust
error: failed to update core (invalid or corrupted database (PGP signature))
Базы репозиториев подписаны, pacman проверяет подписи ключами из связки pacman-key. Если подпись не проходит, сначала перекачай базы:
rm /var/lib/pacman/sync/*.db /var/lib/pacman/sync/*.files
pacman -Syy
Если ошибка осталась, проблема в ключах. Обнови связку:
pacman-key --refresh-keys
Если связка совсем разъехалась, сбрось её и собери заново:
rm -rf /etc/pacman.d/gnupg
pacman-key --init
pacman-key --populate archlinux
После этого повтори pacman -Syy. Разбор в статье «Ошибка gpg: unknown public key при pacman-key».
Можно, но pacman перестанет видеть пакеты в репозиториях: pacman -S и pacman -Ss не будут работать. Установленные пакеты при этом не пострадают, local-база от sync не зависит. Просто выполни pacman -Syy, когда понадобится.
Проверь права: файл должен удаляться от root. Если rm ругается на «Operation not permitted», смотри атрибуты:
lsattr /var/lib/pacman/db.lck
Атрибут i (immutable) снимается командой chattr -i. Такое встречается после экспериментов с защитой файлов.
Нет. Обновление меняет базу атомарно: pacman пишет во временный файл и переименовывает его. Риск появляется только при сбое питания или kill в момент записи. Поэтому перед обновлением не помешает копия каталога.
-Sy обновляет базы, только если сервер сообщает об изменениях. -Syy принудительно скачивает всё заново. После удаления файлов из sync/ нужен именно -Syy, иначе pacman может не заметить, что базы пропали.
Достаточно перед рискованными операциями: смена диска, перенос системы, эксперименты с пакетами. Для обычных обновлений хватит того, что pacman пишет базы атомарно.
Базы pacman живут в /var/lib/pacman: local описывает установленные пакеты, sync хранит индексы репозиториев, db.lck защищает их от одновременного доступа. Sync-базы пересоздаются удалением файлов и pacman -Syy. Local-база не пересоздаётся, поэтому держи копию каталога перед рискованными операциями. Зависший db.lck лечится одной командой rm, а ошибки подписей решаются перекачкой баз или починкой ключей.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии