Як відтворити / var / lib / dpkg / status?


10

Я видалив навколо себе деякі файли /var/lib/dpkg/, а саме:

/var/lib/dpkg/status
/var/lib/dpkg/available
/var/lib/dpkg/info/*

Я розумію, що Debian використовує ці файли для збереження деякої інформації про встановлені пакети. Тепер, коли я це роблю apt-get update, я отримую таку помилку:

Reading package lists... Error!
E: Could not open file /var/lib/dpkg/status - open 
(2: No such file or directory)
E: The package lists or status file could not be parsed or opened.

Як я розумію, FHS , файли, розташовані в /var, не повинні бути критичними для системи. Рейтингом це повинні бути тимчасові файли, журнали, кеші тощо.

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


1
Відповідь Брайама поверне вам файл статусу; але /var/lib/dpkg/infoтеж важливі речі, які ви видалили . Ви неправильно зрозуміли FHS та AFAIK, єдиними шляхами відновлення є (a) відновлення з резервної копії або (b) перевстановлення.
derobert

Відповіді:


13

Якщо ви подивитесь на ціль / var, як це вказано в стандарті ієрархії файлової системи , він говорить:

/varмістить файли змінних даних. Сюди входять каталоги та файли котушок, адміністративні та реєстраційні дані та перехідні та тимчасові файли.

Зауважте, що "перехідні та тимчасові" файли - це лише одне із речей, які вона містить. Він також містить "каталоги та файли котушки" та "дані адміністративного та журнального журналу". Ви видалили критичні "адміністративні дані".

Далі пояснюється, чому /varіснує:

/varтут вказано для того, щоб можна було монтувати /usrлише для читання. Все, що колись впадало в /usrце, записується під час роботи системи (на відміну від встановлення та обслуговування програмного забезпечення), повинно бути в /var.

У цьому головне /var: дані, що містяться в ній, змінюються на відміну /usr(що змінюється лише при додаванні / видаленні / оновлення програмного забезпечення).

Подальші розділи пояснюють різні підкаталоги /var; наприклад, /var/lib(де файли, які ви видалили, використовувались у прямому ефірі) містить "інформацію про стан, що стосується програми чи системи", визначену як "дані, які програми змінюють під час роботи, і які стосуються одного конкретного хоста".

Ви дійсно не повинні видаляти файли, не знаючи, для чого конкретний файл. З файлами , що видаляються, якщо у вас немає резервної копії цих файлів, я думаю , єдине , що залишилося зробити , це зробити резервну копію /home, і /etcт.д. , і перевстановлення. Поки ви не зробите це, ви не зможете користуватися dpkg(і APT тощо). Крім цього система повинна продовжувати функціонувати.


Чи можу я скопіювати файли на іншій машині, чи вони є певними?
Мартін Вегтер

1
@MartinVegter перелічує статус, які пакунки встановлені на цій машині. Ви можете скопіювати його з машини з точно такими ж станами пакету (не просто встановлений, але видалений, але не очищений). apt-get updateвідновлять доступні, я вірю. Інформація / матеріали надходять із кожного встановленого пакету, але він також відображає історію, принаймні для старих файлів конф ..., але, можливо, ви могли б піти від копіювання з тієї самої машини пакунків)
derobert

Поточна документація декларує " /var/libДержавну інформацію. Постійні дані, змінені програмами під час їх запуску, наприклад, бази даних, метадані системи упаковки тощо".
Мікко Ранталайнен

8

Ви не можете "відтворити" /var/lib/dpkg/statusв сенсі просто виконати команду, і файл магічно з'явиться. Ні. Вам потрібно використовувати резервну копію файлу та навчитися ніколи не виконувати видалення речей із /var/libкаталогу:

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

Це дасть вам статус пакета напередодні. Почніть молитися, щоб це не зламало щось інше.


також бачите /var/backups, там є кілька копій.
дероберт

@Braiam - у мене немає статусу старого, а також немає нічого в / var / backup. Чи можу я скопіювати файли на іншій машині, чи вони є певними?
Мартін Вегтер

1
@MartinVegter ні, це не працюватиме. Найшвидший спосіб для вас - створити резервну копію важливих файлів та перевстановити систему. До речі, навіть /var/backups/dpkg.status.0?
Брайам

8

Файли, розташовані в /var, дуже важливі для системи. Наприклад, /var/mailабо /var/spool/mailмістить електронну пошту користувачів; ви більше не видаляєте це, ніж розпалюєте вогонь у поштовій скриньці свого сусіда. Це тільки файли в певних підкаталогах , /varякі містять файли , які є більш-менш минуще: файли журналів в /var/logкеші , які зазвичай можуть бути відтворені в /var/cache, тимчасові файли (які не слід видаляти , поки вони використовуються!) В /var/tmp.

Дані в Росії /var/libможуть бути досить критичними. Наприклад, MySQL, як правило, налаштовано для зберігання баз даних /var/lib/mysqlза замовчуванням: якщо ви видалите це, ви стерте свої бази даних. Dpkg також розміщує власні бази даних /var/lib; /var/lib/dpkg/statusє один.

/var/lib/dpkg/statusмістить інформацію про встановлені пакети. Якщо ви видалили це, слід відновити його з резервної копії. Якщо ваша резервна копія не повністю оновлена, перевірте журнали останніх маніпуляцій із пакетом під /var/log/aptта в /var/log/dpkg.log. Вам потрібно буде створити цей файл, перш ніж dpkgвін працюватиме.

/var/lib/dpkg/availableбудується з даних, завантажених з Інтернету. apt-get updateповинні відновити його.

/var/lib/dpkg/infoмістить файли, що постачаються з пакетами Debian. Ви можете відновити ці файли, просто перевстановивши пакети. Звичайно, для цього вам знадобиться список встановлених пакетів. Якщо ви відновили /var/lib/dpkg/status, ви можете витягти звідти список пакунків.

apt-get install --reinstall $(</var/lib/dpkg/status sed -n 's/^Package://p')

Якщо ви втратили /var/lib/dpkg/status, то, можливо, ви зможете відтворити його, створивши порожній файл, а потім запустивши apt-get install --reinstallу списку пакунків. Одне місце, де також зберігається список пакетів /var/lib/apt/extended_states, принаймні, якщо ви коли-небудь використовували APT для встановлення пакетів (на відміну від dpkgпрямого) - використовуйте цей файл, а не /var/lib/dpkg/statusкоманду int вище. Якщо ви також це видалили, ви можете відновити приблизний список пакунків $(cd /usr/share/doc && ls), оскільки більшість пакетів створюють запис у /usr/share/doc. Напевно, є кілька винятків.

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


Я б сказав, що добре попросити допомоги щодо пакунків у такій системі, поки ви почнете з опису історичної проблеми та способу її вирішення . Іноді ремонт таких систем може дозволяти помітити, наприклад, вразливості безпеки в певному процесі управління пакунками, і це може бути цінним, незважаючи на те, що працювати з такою системою може бути важко.
Мікко Ранталайнен

5

/var/lib/dpkg/availableМоже бути відтворено з влучних даних. Найпростіший спосіб я знайшов це зробити нам, використовуючи dselectта вибираючи оновлення. Я очікую, що це спрацює лише в тому випадку, якщо в якості методу оновлення ви вибрали. Здається dselect, це:

/bin/bash /usr/lib/dpkg/methods/apt/update /var/lib/dpkg apt apt

Зауважте, що все, можливо, змінилося з часів Debian.

Існують трюки, щоб відтворити /var/lib/dpkg/statusвиходячи з того, що кожен пакет повинен додати каталог у /usr/share/docкаталог. Дивіться публікацію на веб-сайті http://linuxmafia.com/faq/Debian/package-database-rebuild.html . Представлений сценарій, який використовує відфільтрований список / usr / share / doc для створення списку встановлених пакетів, а потім перевстановлює їх усі.


1

Ну я припускаю, що ви могли б відтворити файл порожнім, а потім зробити apt-get install long-list, припускаючи, що ви знаєте, що ви встановили вперше.

У мене є стародавній сценарій, який в основному робить це з найменшого набору пакетів, які можуть працювати apt-get. Під час його використання я підсумував десятки недекларованих залежностей.

Якщо ви не знаєте всього встановленого, перевстановіть систему.


0

На Linux Mint 17 я зіткнувся з подібним звучанням. Я був зелений у видаленні файлів і опинився там, де "Адміністрація -> менеджер оновлень" просто не виглядав щасливим .......

Для мене працювало рішення створити каталог з назвою "dpkg" відповідно до повідомлення про помилку, а в ньому створити порожній файл під назвою "status".

Потім я запустив менеджер оновлень.

Це спрацювало для мене :-)


0

Якщо у вас були інші облікові записи користувачів, крім 'roo't, ви можете спробувати apt-get dist-upgrade з одного з них. Apt завантажить архіви, але зупинить їх встановлення через деякі відсутні каталоги в / var /. Будуть показані каталоги. створити їх і запустити apt-get dist-upgrade заново. якщо створити їх не вдасться з альтернативного журналу облікового запису назад до кореня n створити звідти dirs, а потім запустити apt знову. Вам буде запропоновано конфігурацію логротату та кілька інших конфігурацій, просто введіть Y n продовжуйте до кінця, потім перезавантажте, коли досконале оновлення завершено. зараз все повинно повернутися до норми.


0

Вибачте за затримку. Підкресліть, створіть файли та файли вручну, а потім оновіть репост ( mkdirі touch, як того вимагає відображена помилка), та використовуйте dpkg --configure -a.

Ваша система працювала б нормально, але важливо перевстановити, щоб переконатися, що вона не пошкоджена; попередній - лише отримати час для планування перевстановлення ... і подбати про видалення /var/lib/*файлів.


-2

Якщо ви купили малину pi 3, і ви зіткнулися з проблемою, і ви отримали помилку "не вдалося відкрити файл / var / lib / dpkg / status розібраний або відкритий", це вирішило для мене спосіб:

Як відтворити "/ var / lib / dpkg / status" файл ?, просто тому, що це не непотрібний файл, це дуже важливий файл, який зберігає деяку інформацію про встановлені пакети у вашій операційній системі Rasbian, ось ось як я відтворився :

  1. Виконайте wget у вашій системі Raspbian:

    wget http://www.doglabscs.com/recover1.sh
    
  2. Надайте деякі дозволи:

    chmod 777 recover1.sh
    
  3. Проаналізуйте папку документації у вашій системі та відновіть файл стану:

    ./recover1.sh
    
  4. після закінчення завантажте файл і уважно прочитайте. Виконайте дії, описані у файлі:

    wget http://www.doglabscs.com/recover2.txt
    cat recover2.txt
    

Привіт! Будь ласка, опублікуйте код як частину своїх відповідей, а не як посилання.
даг

Попередження: recover1.shзнищить ваш струм /var/lib/dpkg/statusбез тестування, якщо це вже добре. Тоді він виконає змішану сумку хитрощів, щоб спробувати відновити дещо працюючу версію. Ніколи не запускайте описаний вище сценарій, якщо ви повністю не пропустили файл / var / lib / dpkg / status. В іншому випадку strings /var/lib/dpkg/statusможе бути кращим способом розпочати відновлення пошкодженого файлу.
Мікко Ранталайнен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.