Як відновити пошкоджений файл статусу dpkg?


26

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

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

Я не бачу нічого особливо дивного в рядку 15945 у файлі статусу. Це точковий символ у полі опису монобібліотечного пакету та вставлення двокрапки не допомогло. Видалення рядка, що містить крапку, також не працювало. Перезапис файлу зі статусом старого дав те саме повідомлення.

Чи є спосіб відновити файл статусу?


3
Я не думаю, що ви можете повністю відновити statusфайл: він є основним джерелом інформації, і хоча багато його є зайвим, не все це є. Однак, можливо, файл можна відремонтувати вручну. Розмістіть фрагмент файлу навколо проблемної лінії, скажімо, 20–40 рядків, включаючи принаймні один Package:рядок до і після рядка 15945.
'SO- перестаньте бути злим'

З тих пір я намагався видалити моно, але все, що було, було змінити номер рядка, який повідомляється про помилку. Якщо ви перейдете за посиланням вставити, номер рядка, що порушує право, становить 25, "Розділ: python" paste.ubuntu.com/501929
Ramón,

@ Рамона Отже, apt-get, dpkgі друзі все ще працюють правильно, а що erroring з є автозаповнення?
Ріккардо Муррі

Правильно. Здається, виникають проблеми лише з розбором файла статусу під час використання автоматичного завершення. Я в іншому випадку можу встановлювати та видаляти пакети без явних помилок.
Рамон

Отримати ту ж проблему. Я не думаю, що сліпо використовувати стару версію бази даних apt - це правильна річ тут, незалежно від того, чи вона вирішує цю проблему.
Олі

Відповіді:


7

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

Виправлення передбачає прив'язку до фактичних перерв форматування та їх виправлення вручну. Це не так складно, як це звучить.

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


Радий, що знайшов рішення, Олі і дякую за те, що поділився. У моєму випадку, крім проблемного дебюту Lexmark, у дебюту Webmin також опис був неправильним, але в цьому випадку він не викликав проблем з розбором під час автозаповнення. Дивно.
Рамон

3
@Oli Ви є власником ліцензії? Ви можете це написати тут?
Брайам

Це правда, добре, що я прочитав ваш пост. У мене було, missing package nameі я з'ясував, що з якихось дивних причин я краще не витрачаю час на пошук, у мене була лінія, Packaga: landscape-commonяка була зафіксована ортографічно та бам, проблема вирішена. Справа в тому, що я ніколи не торкався цього файлу, ні когось іншого. Як комп’ютер може зіпсуватись з орфографічною помилкою?
Северо Роз

Тут також має бути фактична відповідь, щоб не було відповіді лише для посилання [якщо помилка є порожнім рядком, який не передує "Пакет:", тоді додайте .до цього порожнього рядка].
Xen2050

20

Ви повинні мати можливість працювати з попереднім відомим файлом хорошого стану та оновлюватись звідти. Кожен раз, коли ви робите встановлення чи оновлення, файл статусу зберігається в gzipped резервну копію під / var / backup . Виконання 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 status * у каталозі показує:

-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:

sudo apt-get update

Це повинно це робити.


2
Я не знав про файли статусу, які зберігаються в / var / backup. Це гарна інформація, якщо вона повториться. Спасибі, Джіме.
Рамон

Але чи безпечно використовувати стару версію? Я маю на увазі, напевно, це не лише автоматичне заповнення, яке використовує цей файл, і використання старої версії зі старішою інформацією про пакет збирається накручувати інші, набагато важливіші речі ... як, наприклад, сам 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" для правопорушного пакету. Це очистить його з локального сховища, видаливши всі сліди. У моїй системі це було виправленням видалених (але ще не очищених) пакетів, які спричинили цю помилку.


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

2

Сину ...

Гаразд, фактична помилка була на лінії 15266, незважаючи на те, що повідомлялося про 700 рядків далі. Проблемний запис у файл статусу був викликаний дебютом, який я встановив, щоб принтер Lexmark працював давно. Запис був для пакета lexmark-inkjet-08-driver. У полі Опис не було .місця на місці розриву рядка. Це спричинило помилку розбору.

Щоб знайти це, я вдався до способу усунення несправностей із рушницями та почав спробувати речі досить випадково. Однією з моїх спроб гуфі було grep-status -P 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: лінійний податок

восьмінадцять: повернення вагона

восьмерична від 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.