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

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

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

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

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

28
задан 29 April 2015 в 02:31

8 ответов

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

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

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

7
ответ дан 29 April 2015 в 02:31

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

That should do it.

20
ответ дан 29 April 2015 в 02:31

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

6
ответ дан 29 April 2015 в 02:31

Поскольку мой status-old был слишком проблематичным даже с 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: табуляция

восьмеричный 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
2
ответ дан 29 April 2015 в 02:31

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

Вверх по течению: Ошибка Debian 590885

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

cp /var/lib/dpkg/status ~/dpkg-status.back
sudo sed -i "s/56127_Ubuntu_karmic/56127Ubuntukarmic/" /var/lib/dpkg/status
3
ответ дан 29 April 2015 в 02:31

Son of a...

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

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

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

2
ответ дан 29 April 2015 в 02:31

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

sudo dpkg -r handbrake-cli

Принятое решение с помощью pcregrep не сработало (pcregrep ничего не нашла).

6
ответ дан 29 April 2015 в 02:31

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

apt-cache show libssl0.9.8
apt-cache show udev
5
ответ дан 29 April 2015 в 02:31

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

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