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

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

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

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

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

Можно ли переписать файл со статусом-старшим?
1
задан 29 April 2015 в 02:31

7 ответов

Вы должны иметь возможность работать с предыдущим известным файлом состояния и обновлять оттуда. Каждый раз, когда вы выполняете установку или обновление, файл состояния сохраняется в резервной копии с копией в / 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. Выполнение / var / backups * в каталоге показывает:

-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

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

либо

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

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

16
ответ дан 26 May 2018 в 01:15
  • 1
    Я не знал о файлах статуса, хранящихся в / var / backups. Это хорошая информация, если это произойдет снова. Спасибо, Джим. – Ramón 5 October 2010 в 22:41
  • 2
    Но можно ли использовать старую версию? Я имею в виду, конечно, что это не просто автозаполнение, которое использует этот файл, а использование старой версии с более старой информацией о пакете собирается прикручивать другие, гораздо более важные вещи ... например, apt. – Oli♦ 6 October 2010 в 13:45
  • 3
    @ Oli Я не уверен. Мне нужно было это сделать только один раз. Я думаю, мне пришлось переустановить приложение, которое вызывало проблему, но в будущем это сработало. Как и все советы в Интернете (или, по крайней мере, советы от меня в Интернете), это сработало для меня. Это не значит, что это обязательно сработает для вас. Я предлагаю его без гарантии и без явного знания того, как он будет вести себя в вашей системе. Ваш пробег может отличаться. Попробуйте на свой страх и риск. – Jim 7 October 2010 в 01:38
  • 4
    По-видимому, это решение устранило мои проблемы. Я буду обновлять, если возникнут какие-либо проблемы при использовании старого файла состояния. – Matthew Pirocchi 21 August 2012 в 00:51

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

apt-cache show libssl0.9.8
apt-cache show udev
4
ответ дан 26 May 2018 в 01:15

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

sudo dpkg -r handbrake-cli

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

4
ответ дан 26 May 2018 в 01:15
  • 1
    Большое вам спасибо за это, и на самом деле это правильный подход. Спасибо. – user2671192 18 December 2014 в 00:31

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

4
ответ дан 26 May 2018 в 01:15

Это ошибка (предполагается, что она исправлена): Launchpad Bug 613018

Upstream: Ошибка пусковой установки 613018

Это должно быть обходным путем ( backup, "fix"):

cp /var/lib/dpkg/status ~/dpkg-status.back
sudo sed -i "s/56127_Ubuntu_karmic/56127Ubuntukarmic/" /var/lib/dpkg/status
3
ответ дан 26 May 2018 в 01:15

Сын a ...

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

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

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

1
ответ дан 26 May 2018 в 01:15

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

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

(как root)

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: tab восьмеричный 12: linefeed восьмеричный 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
0
ответ дан 26 May 2018 в 01:15

Другие вопросы по тегам:

Похожие вопросы: