Все об Arch Linux

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

Базы pacman: где лежат и как пересоздать

Сразу к делу: базы pacman лежат в каталоге /var/lib/pacman. Внутри два подкаталога: local с информацией об установленных пакетах и sync с индексами репозиториев (core.db, extra.db, multilib.db). Sync-базы пересоздаются за минуту: удали файлы из sync/ и выполни pacman -Syy. Local-база официально не пересоздаётся, её восстанавливают из резервной копии или переустановкой пакетов.

Где лежат базы pacman?

Всё, что 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-базе?

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-базы?

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 и почему появляется «unable to lock database»?

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 не запущен, значит, прошлый процесс завершился некорректно.

Как пересоздать sync-базы?

Самый простой способ: удалить файлы баз и скачать их заново.

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-база не пересоздаётся официально. Инструмента вроде «перегенерировать 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 покажет, какие пакеты изменились с момента копии.

Что делать с ошибкой «db file could not be verified»?

Эта ошибка появляется при проверке подписи 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».

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

Можно ли удалить sync-базы и не пересоздавать?

Можно, но pacman перестанет видеть пакеты в репозиториях: pacman -S и pacman -Ss не будут работать. Установленные пакеты при этом не пострадают, local-база от sync не зависит. Просто выполни pacman -Syy, когда понадобится.

Что делать, если db.lck не удаляется?

Проверь права: файл должен удаляться от root. Если rm ругается на «Operation not permitted», смотри атрибуты:

lsattr /var/lib/pacman/db.lck

Атрибут i (immutable) снимается командой chattr -i. Такое встречается после экспериментов с защитой файлов.

Повредится ли local-база при обычном обновлении?

Нет. Обновление меняет базу атомарно: pacman пишет во временный файл и переименовывает его. Риск появляется только при сбое питания или kill в момент записи. Поэтому перед обновлением не помешает копия каталога.

Чем отличается pacman -Sy от pacman -Syy?

-Sy обновляет базы, только если сервер сообщает об изменениях. -Syy принудительно скачивает всё заново. После удаления файлов из sync/ нужен именно -Syy, иначе pacman может не заметить, что базы пропали.

Нужно ли бэкапить базы перед каждым обновлением?

Достаточно перед рискованными операциями: смена диска, перенос системы, эксперименты с пакетами. Для обычных обновлений хватит того, что pacman пишет базы атомарно.

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

Заключение

Базы pacman живут в /var/lib/pacman: local описывает установленные пакеты, sync хранит индексы репозиториев, db.lck защищает их от одновременного доступа. Sync-базы пересоздаются удалением файлов и pacman -Syy. Local-база не пересоздаётся, поэтому держи копию каталога перед рискованными операциями. Зависший db.lck лечится одной командой rm, а ошибки подписей решаются перекачкой баз или починкой ключей.



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

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

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

Комментарии

Загрузка…

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

Telegram Max