Как воссоздать / 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 единственными путями восстановления являются (а) восстановление из резервной копии или (б) переустановка.
Дероберт

Ответы:

13

Если вы посмотрите на назначение / var как указано в стандарте иерархии файловой системы , оно говорит:

/varсодержит переменные файлы данных. Это включает в себя каталоги и файлы спула, административные данные и данные журналов, а также временные и временные файлы.

Обратите внимание, что «временные и временные» файлы являются лишь одной из вещей, которые он содержит. Он также содержит «каталоги и файлы спула» и «административные данные и данные журналов». Вы удалили критические «административные данные».

Далее объясняется, почему /varсуществует:

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

Это ключевой момент /var: данные в нем изменяются, в отличие от /usr(который изменяется только при добавлении / удалении / обновлении программного обеспечения).

Дальнейшие разделы объясняют различные подкаталоги /var ; например, /var/lib(где файлы, которые вы удалили, использовали для хранения) содержит «информацию о состоянии, относящуюся к приложению или системе», определяемую как «данные, которые программы изменяют во время работы, и которые относятся к одному конкретному хосту».

Вы действительно не должны удалять файлы, не зная, для чего предназначен конкретный файл. С файлами , удаляемых, если у вас нет резервной копии этих файлов, я думаю , единственное , что осталось сделать , это сделать резервную копию /home, и /etcт.д. , и переустановке. Пока вы не сделаете это, вы не сможете использовать dpkg(и APT, и т. Д.). Помимо этого, система должна продолжать функционировать.

derobert
источник
Могу ли я скопировать файлы с другого компьютера или они зависят от компьютера?
Мартин Вегтер
1
@MartinVegter показывает, какие пакеты установлены на данном компьютере. Вы можете скопировать его с компьютера с точно такими же состояниями пакета (не только установленного, но и удаленного, но не очищенного). apt-get updateбуду перестраивать имеющиеся, я верю. Информация / материал поступает из каждого установленного пакета, но она также отражает историю, по крайней мере, для старых файлов conf ... но вы, вероятно, можете избежать копирования с той же самой машины пакетов)
derobert
В текущей документации объявляется « /var/libИнформация о состоянии. Постоянные данные, изменяемые программами по мере их запуска, например, базы данных, метаданные системы упаковки и т. Д.»
Микко Ранталайнен
8

Вы не можете «воссоздать» /var/lib/dpkg/statusв смысле простого запуска команды, и файл волшебным образом появляется. Нет. Вам нужно использовать резервную копию файла и учиться никогда не ходить, удаляя вещи из /var/libкаталога:

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

Это даст вам статус пакета накануне. Начни молиться, чтобы это не сломало что-то еще.

Braiam
источник
также видите /var/backups, там есть несколько копий.
Дероберт
@Braiam - у меня нет статуса старый, и у меня нет ничего в / var / backups. Могу ли я скопировать файлы с другого компьютера или они зависят от компьютера?
Мартин Вегтер
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/statusint в приведенной выше команде. Если вы тоже это удалили, вы можете перестроить примерный список пакетов с помощью $(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 sarge.

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

Крис Гибсон
источник
1

Ну, я полагаю, вы могли бы воссоздать файл пустым, а затем выполнить длинный список установки apt-get, предполагая, что вы знаете, что устанавливали в первый раз.

У меня есть древний скрипт, который делает это в основном из самого маленького набора пакетов, которые могут запускать apt-get. При его использовании я заканчивал тем, что сообщал о десятках необъявленных зависимостей.

Если вы не знаете всего, что вы установили, переустановите систему.

Джошуа
источник
0

В Linux Mint 17 я столкнулся с похожей проблемой звучания. Я был увлечен удалением файлов и оказался там, где «Администрирование -> Менеджер обновлений» просто не выглядел счастливым .......

Решение, которое работало для меня, состояло в том, чтобы создать каталог с именем "dpkg" согласно сообщению об ошибке, и в нем создать пустой файл с именем "status".

Затем я запустил диспетчер обновлений.

Это сработало для меня :-)

Bluegerbil
источник
0

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

Тот самый
источник
0

Извините за задержку. Briam, заново создайте каталоги и файлы вручную, а затем обновите репозитории ( mkdirи touch, как того требует отображаемая ошибка), и используйте dpkg --configure -a.

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

Даниэль Оспития
источник
-2

Если вы купили raspberry pi 3 и столкнулись с проблемой и получили сообщение об ошибке «не удалось открыть файл / var / lib / dpkg / status проанализирован или открыт», это обходной путь, который мне помог:

Как воссоздать файл "/ var / lib / dpkg / status"? Просто потому, что это не бесполезный файл, это очень важный файл, в котором хранится некоторая информация об установленных пакетах в вашей raspbian ОС, так что вот как я был воссоздан :

  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
    
Dog Labs Corporation
источник
Здравствуй! Пожалуйста, отправьте код как часть ваших ответов, а не как ссылки.
дхаг
Внимание: recover1.shуничтожит ваш ток /var/lib/dpkg/statusбез тестирования, если он уже в порядке. Затем он выполнит смешанный пакет трюков, чтобы попытаться восстановить несколько рабочую версию. Никогда не запускайте вышеуказанный скрипт, если вы полностью не пропустите файл / var / lib / dpkg / status. В противном случае strings /var/lib/dpkg/statusможет быть лучший способ начать восстановление поврежденного файла.
Микко Ранталайнен