Как пересоздать /var/lib/dpkg/status?

Как пересоздать /var/lib/dpkg/status?

Я удалил некоторые файлы /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.

Насколько я понимаюФХС, файлы, расположенные в /varне должны быть критическими для системы. Скорее всего, это временные файлы, журналы, кэши и т. п.

Есть ли способ восстановить удаленные файлы?

решение1

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

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

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

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

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

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

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

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

решение2

Файлы, расположенные в , /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. Вероятно, есть несколько исключений.

Не просите никакой помощи по управлению пакетами в этой системе. Восстановление после удаления критически важных для системы файлов — это не точная наука. Если вы не можете восстановиться из резервных копий, вам следует как можно скорее установить новую, чистую систему.

решение3

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

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

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

решение4

Если кто-то в итоге уничтожит "/var/lib/dpkg":

sudo mkdir -p /var/lib/dpkg/updates
sudo mkdir -p /var/lib/dpkg/info
sudo mkdir -p /var/lib/dpkg/alternatives

sudo cp /var/backups/dpkg.status.0 /var/lib/dpkg/status
sudo cp /var/backups/dpkg.statoverride.0 /var/lib/dpkg/statoverride
sudo cp /var/backups/dpkg.diversions.0 /var/lib/dpkg/diversions
sudo cp /var/backups/dpkg.arch.0 /var/lib/dpkg/arch

sudo dpkg --clear-avail
sudo apt update
sudo apt upgrade # If needed.

Связанный контент