Я удалил некоторые файлы /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/status
int команды выше. Если вы удалили и его, вы можете восстановить приблизительный список пакетов с помощью $(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.