Всякий раз, когда я набираю sudo apt-get remove
, а затем нажимаю клавишу Tab kbd> для автоматического завершения, я получаю следующее сообщение:
grep-status: /var/lib/dpkg/status:15945: expected a colon
.
Я не вижу ничего особенно странного в строка 15945 в файле состояния. Это точечный символ в поле описания пакета моно библиотеки, и вставка двоеточия не помогла. Удаление строки, содержащей точку, тоже не сработало. Перезапись файла со статусом old привела к тому же сообщению.
Есть ли способ перестроить файл состояния?
Я наконец-то исправил эту систему. Восстановление из резервной копии файла состояния не помогло, так как проблема была у меня так долго, она присутствует во всех моих резервных копиях.
Исправление включает в себя поиск фактических разрывов форматирования с помощью grepping и их исправление вручную. Это не так сложно, как кажется.
Вы должны иметь возможность работать с предыдущим известным хорошим статусным файлом и обновляться оттуда. Каждый раз при установке или обновлении файл состояния сохраняется в 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.
Попробуйте "dpkg -P" для пакета-нарушителя. Это удалит его из локального репозитория, удалив все следы. В моей системе это было исправление для удалённых (но ещё не очищенных) пакетов, которое привело к этой ошибке.
Поскольку мой 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
Это была ошибка (предполагается, что она будет исправлена): Ошибка панели запуска 613018
Вверх по течению: Ошибка Debian 590885
Это должно быть временное решение (резервное копирование , строка версии "исправить"):
cp /var/lib/dpkg/status ~/dpkg-status.back
sudo sed -i "s/56127_Ubuntu_karmic/56127Ubuntukarmic/" /var/lib/dpkg/status
Son of a...
Хорошо, фактическая ошибка была на линии 15266, несмотря на то, что было сообщено о примерно 700 строках дальше по линии. Проблемная запись в файле состояния была вызвана дебетовкой, которую я установил, чтобы заставить работать мой принтер Lexmark давным-давно. Запись была для пакета lexmark-inkjet-08-driver
. В поле Description (Описание) не было .
в месте разрыва строки. Это вызвало ошибку при разборе.
Чтобы найти это, я прибегнул к методу поиска неисправностей дробовика и начал пробовать довольно случайно. Одной из моих глупых попыток была grep-status -P e
, которая показала, что e - самая распространенная буква в алфавите. Глупо, я знаю, но последняя распечатанная запись статуса перед тем, как она пожаловалась на отсутствие двоеточия, была для пакета lexmark, и я заметил отсутствие символа .
после нескольких минут взгляда на экран.
Если возможно, я хотел бы получить другой ответ, который мог бы описать лучший метод для нахождения подобной проблемы в случае, если кто-нибудь столкнется с подобной проблемой в будущем. Спасибо.
I смог решить эту проблему, удалив пакеты с поврежденными записями в файле состояния.
sudo dpkg -r handbrake-cli
Принятое решение с помощью pcregrep не сработало (pcregrep ничего не нашла).
В этом случае я бы сделал резервную копию поврежденного файла /var/lib/dpkg/status
, а затем исправил бы его вручную (в районе строк 1888 и 9550), используя информацию из
apt-cache show libssl0.9.8
apt-cache show udev