Автор Тема: Ручная правка базы rpm => file size not a multiple of the pagesize  (Прочитано 298 раз)

Оффлайн kevin

  • Начинающий
  • *
  • Сообщений: 4
"Случайно" подредактировал базу rpm пакетов /var/lib/rpm/Packages и
получил неразрешимую для меня на данный момент проблему, есть шанс на восстановление?
Система оказалась неожиданно хрупкой и сеть не выдает рабочих решений.

# rpm --rebuilddb
ошибка: rpmdb: /var/lib/rpm/Packages: file size not a multiple of the pagesize
ошибка: cannot open Packages index using db4 - Недопустимый аргумент (22)
 
# stat -c"%s" /var/lib/rpm/Packages
36769768

# cd /var/lib/rpm/
# cp Packages Packages.broken_by_hands

# db_dump Packages.broken_by_hands
db_dump: Packages: unsupported hash version number 9
db_dump: Packages: Invalid argument

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 19 908
    • Домашняя страница
    • Email
cd /var/lib/rpm
mv Packages Package.orig
db_dump Package.orig | db_load Packages
rpm --rebuilddb -vv
Андрей Черепанов (cas@)

Оффлайн kevin

  • Начинающий
  • *
  • Сообщений: 4
Увы, но рецепт с db_dump не работает.

Цитировать
# db_dump Packages.broken_by_hands
db_dump: Packages: unsupported hash version number 9
db_dump: Packages: Invalid argument

Оффлайн Speccyfighter

  • Мастер
  • ***
  • Сообщений: 10 259
Увы, но рецепт с db_dump не работает.

Попробуйте воспользоваться рецептом полной переинсталляции пакетов:
RPM Database Recovery
https://rpm.org/user_doc/db_recovery.html

Пакет rpm, в /var/lib/rpm/* содержит пустые файлы.
Скорее всего 'rpm -qa | sort' работать не будет по причине повреждённого Packages.
rpm хранит лог установки пакетов в /var/log/rpm* в формате:
<имя-инсталлированного-пакета>-<версия>-<индекс.архитектура>.rpm

Установка пакетов из списка, описана здесь:
https://forum.altlinux.org/index.php?topic=32361.msg234696#msg234696

Бэкапить и содержимое /var/lib/rpm/* и лог /var/log/rpm*. Т.е. всё что будет изменяться.

Лог rpm содержит и имена пакетов не из репозитория.
Также содержит и все инсталлированные ядра с модулями. И это тоже нужно учитывать.

Из лога rpm, имена пакетов, парсить проще реверсом:
В имени rpm-пакета, минус - разделитель полей. Счёт полей с конца имени файла. Поэтому проще реверс:
Реверс - парсить третье поле и дальше - реверс.

Т.е. сделать так, как будто система устанавливается с нуля. Возможно потребуется воспользоваться архивом репозитория, по дате последнего выполненного dist-upgrade.

Если ядро будет устанавливаться/переустанавливаться списком через apt-get, а не через update-kernel, то при необходимости сгенерировать ram-диск инициализации для этого ядра.
« Последнее редактирование: 06.12.2021 19:03:07 от Speccyfighter »