Как восстановить поврежденный файл статуса dpkg?

26

Всякий раз, когда я печатаю sudo apt-get removeи затем нажимаю Tabклавишу для автозаполнения, я получаю следующее сообщение:

grep-status: /var/lib/dpkg/status:15945: expected a colon
.

Я не вижу ничего особенно странного в строке 15945 в файле состояния. Это точечный символ в поле описания пакета моно библиотеки, и вставка двоеточия не помогла. Удаление строки, содержащей точку, тоже не сработало. Перезапись файла со статусом old привела к тому же самому сообщению.

Есть ли способ восстановить файл состояния?

Рамона
источник
3
Я не думаю, что вы можете полностью перестроить statusфайл: это основной источник информации, и хотя большая его часть избыточна, но не вся. Однако возможно восстановить файл вручную. Поместите кусок файла вокруг проблемной строки, скажем, 20–40 строк, включая как минимум одну Package:строку до и после строки 15945.
Жиль: «Стоп быть злым»
С тех пор я попытался удалить моно, но все, что он сделал, это изменил номер строки, которая сообщается как ошибка. Если вы перейдете по ссылке вставки, номер ошибочной
Рамон
@ Рамона Итак, apt-get, dpkgи друзья все еще работают правильно, а что erroring из является автозаполнение?
Риккардо Мурри
Правильный. Кажется, возникают проблемы только с анализом файла состояния при использовании автозаполнения. В противном случае я могу устанавливать и удалять пакеты без каких-либо явных ошибок.
Рамон
Получение той же проблемы. Я не думаю, что слепо использовать старую версию базы данных apt - это то, что нужно делать независимо от того, как это исправить эту проблему.
Оли

Ответы:

7

Я наконец исправил свою систему этого. Восстановление резервной копии файла состояния не работало, так как у меня была проблема так долго, это во всех моих резервных копиях.

Исправление включает в себя поиск фактических разрывов форматирования и исправление их вручную. Это не так сложно, как кажется.

http://thepcspy.com/read/fixing-dpkg-status-corruption/

Оли
источник
Рад, что вы нашли решение, Оли и спасибо, что поделились. В моем случае, в дополнение к проблемному deb-документу Lexmark, у deb-файла Webmin также было некорректное описание, но в этом случае он не вызывал проблем с синтаксическим анализом при автозаполнении. Weird.
Рамон
3
@ Оли ты владелец лицензии? Вы можете написать это здесь?
Брайам
Это правда, хорошо, что я прочитал ваш пост. У меня был, missing package nameи я узнал, что по какой-то странной причине мне лучше не тратить свое время на выяснение, у меня была линия, Packaga: landscape-commonкоторая была исправлена ​​ортографически, и проблема была решена. Дело в том, что я никогда не трогал этот файл, как и никто другой. Как компьютер может испортить орфографическую ошибку?
Северо Раз
Фактический ответ также должен быть здесь, чтобы он не был ответом только на ссылку [если ошибка возникла из пустой строки, которая не предшествует «Package:», то добавьте .к этой пустой строке].
Xen2050
20

Вы должны быть в состоянии работать с предыдущим известным файлом состояния и обновлять его оттуда. Каждый раз, когда вы выполняете установку или обновление, файл состояния сохраняется в резервную копию gzip в / var / backups . Выполнение команды ls -l dpkg * в каталоге показывает:

-rw-r--r-- 1 root root   2266732 2010-09-30 08:35 dpkg.status.0
-rw-r--r-- 1 root root    624182 2010-09-29 08:49 dpkg.status.1.gz
-rw-r--r-- 1 root root    623844 2010-09-28 08:55 dpkg.status.2.gz
-rw-r--r-- 1 root root    620358 2010-09-24 11:04 dpkg.status.3.gz
-rw-r--r-- 1 root root    619021 2010-09-23 15:34 dpkg.status.4.gz
-rw-r--r-- 1 root root    619013 2010-09-23 08:03 dpkg.status.5.gz
-rw-r--r-- 1 root root    618968 2010-09-21 08:33 dpkg.status.6.gz

Также есть резервная копия файла, созданного в каталоге / var / lib / dpkg / с именем status-old. Выполнение статуса ls -l * в каталоге показывает:

-rw-r--r-- 1 root root 2266732 2010-09-30 08:35 status
-rw-r--r-- 1 root root 2267191 2010-09-30 08:35 status-old

Итак, чтобы восстановиться после повреждения, вы должны сделать следующее:

1. Сделайте резервную копию поврежденного файла состояния :

mv /var/lib/dpkg/status /var/lib/dpkg/status_bkup

2. Скопируйте недавний файл статуса dpkg на место из любого из приведенных выше источников:

или

cp /var/lib/dpkg/status-old /var/lib/dpkg/status

или

cp /var/backups/dpkg.status.#.gz /var/lib/dpkg/
gunzip -d /var/lib/dpkg/dpkg.status.#.gz 
mv /var/lib/dpkg/dpkg.status.# /var/lib/dpkg/status

3. Затем запустите apt-get update:

sudo apt-get update

Это должно сделать это.

Джим
источник
2
Я не знал о файлах состояния, которые хранятся в / var / backups. Это хорошая информация на случай, если это случится снова. Спасибо, Джим.
Рамон
Но безопасно ли использовать старую версию? Я имею в виду, конечно, что этот файл использует не только автозаполнение, и использование старой версии с более старой информацией о пакете может испортить другие, гораздо более важные вещи ... например, сам apt.
Оли
@ Оли, я не уверен. Я должен был сделать это только один раз. Я думаю, что мне пришлось переустановить приложение, которое вызывало проблему, но в дальнейшем это работало. Как со всеми советами в Интернете (или, по крайней мере, советами от меня в Интернете), это работало для меня. Это не значит, что это обязательно сработает для вас. Я предлагаю это без гарантии и без явных знаний о том, как это будет вести себя в вашей системе. Ваш пробег может варьироваться. Попробуйте на свой страх и риск.
Джим
Это решение, похоже, исправило мои проблемы. Я буду обновлять, если какие-либо проблемы возникают из-за использования старого файла состояния.
Мэтью
В старом файле могут отсутствовать некоторые изменения пакета, которые сделали с системой, но в основном все будет в порядке. Это sudo apt update && sudo apt dist-upgradeдолжно исправить большинство проблем, которые statusможет вызвать старый файл. Если ваша система имеет больший беспорядок, sudo aptitude dist-upgradeвместо этого sudo apt ...иногда могут предложить лучшие способы исправить поломку.
Микко Ранталайнен
6

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

sudo dpkg -r handbrake-cli

Принятое решение через pcregrep не сработало (pcregrep ничего не нашел).

разрыв
источник
Большое вам спасибо, это работает для меня, и на самом деле это правильный подход. Спасибо
user2671192
6

Попробуйте "dpkg -P" для оскорбительного пакета. Это очистит его от локального хранилища, удалив все следы. В моей системе это было исправлением для удаленных (но еще не очищенных) пакетов, которые вызывали эту ошибку.

ordually
источник
5

В этом случае я бы сделал резервную копию поврежденного /var/lib/dpkg/statusфайла, а затем исправил его вручную (по строкам 1888 и 9550), используя информацию из

apt-cache show libssl0.9.8
apt-cache show udev
организовать
источник
Понял . apt-get теперь работает без сбоев.
ændrük
3

Это ошибка (должна быть исправлена): ошибка панели запуска 613018

Вверх по течению: Debian Bug 590885

Это должен быть обходной путь (резервная копия, строка с исправлением):

cp /var/lib/dpkg/status ~/dpkg-status.back
sudo sed -i "s/56127_Ubuntu_karmic/56127Ubuntukarmic/" /var/lib/dpkg/status
htorque
источник
2

Сын...

Хорошо, фактическая ошибка была в строке 15266, несмотря на то, что о ней сообщалось примерно на 700 строк ниже. Проблемная запись в файле состояния была вызвана установкой, которую я установил, чтобы заставить мой принтер Lexmark работать давно. Запись была для пакета lexmark-inkjet-08-driver. Поле описания не было .в месте разрыва строки. Это вызвало ошибку разбора.

Чтобы найти это, я прибег к методу устранения неполадок с дробовиком и начал пробовать что-то случайное. Одна из моих глупых попыток заключалась в том, чтобы grep-status -P eпонять, что буква e была самой распространенной в алфавите. Глупо, я знаю, но последняя запись состояния, напечатанная до того, как она жаловалась на отсутствующее двоеточие, была для пакета lexmark, и я заметил отсутствие .персонажа после нескольких минут просмотра экрана.

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

Рамона
источник
grep-status -r -P ^должен всегда соответствовать любому пакету, поэтому он должен анализировать весь файл и прерывать работу, если он не может его проанализировать.
Микко Ранталайнен
2

Потому что мой статус-старый был слишком проблематично даже с apt-get update,

Это сработало очень хорошо для меня:

(как корень)

cd /var/lib/dpkg 

cp -avf status status.corrupt

tr -cd '\11\12\15\40-\176' < status.corrupt > status

Эта команда использует аргументы -c и -d команды tr для удаления всех символов из входного потока, кроме восьмеричных значений ASCII, которые отображаются в одинарных кавычках. Эта команда специально позволяет следующим символам проходить через этот фильтр Unix:

восьмеричное 11: вкладка

восьмеричное 12: перевод строки

восьмеричное 15: возврат каретки

восьмеричные от 40 до восьмеричные 176: все «хорошие» символы клавиатуры

Все остальные двоичные символы - «мусорные» символы в вашем файле - удаляются во время этого процесса перевода.

КРЕДИТ: http://alvinalexander.com/blog/post/linux-unix/how-remove-non-printable-ascii-characters-file-unix

Если вам интересно, что изменилось или где будет ущерб: (возможно долго)

diff /var/lib/dpkg/{status-old,status} |less
Marcos
источник