/ var / lib / dpkg / status를 다시 만드는 방법?


10

주변의 일부 파일을 삭제했습니다 /var/lib/dpkg/.

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

데비안은이 파일을 사용하여 설치된 패키지에 대한 정보를 유지한다는 것을 알고 있습니다. 이제 내가 할 때 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
Braiam의 답변으로 상태 파일을 다시 얻을 수 있습니다. 하지만 삭제 한 내용 /var/lib/dpkg/info도 매우 중요합니다. FHS를 잘못 이해했으며 AFAIK의 유일한 복구 경로는 (a) 백업에서 복원 또는 (b) 재설치입니다.
derobert

답변:


13

Filesystem Hierarchy Standard에 주어진대로 / var목적 을 살펴보면 다음과 같습니다.

/var가변 데이터 파일을 포함합니다. 여기에는 스풀 디렉토리 및 파일, 관리 및 로깅 데이터, 임시 및 임시 파일이 포함됩니다.

"일시적 및 임시"파일은 파일에 포함 된 것 중 하나 일뿐 입니다. "스풀 디렉토리 및 파일"과 "관리 및 로깅 데이터"도 포함합니다. 중요한 "관리 데이터"를 삭제했습니다.

계속 /var존재 하는 이유를 설명 합니다.

/var/usr읽기 전용 으로 마운트 할 수 있도록 여기에 지정되어 있습니다 . /usr설치 및 소프트웨어 유지 관리와 달리 시스템 작동 중에 쓰여진 모든 내용은에 있어야합니다 /var.

그것이 중요한 것입니다 /var: /usr소프트웨어의 추가 / 제거 / 업데이트시에만 변경되는 데이터와 달리 데이터가 변경됩니다.

추가 섹션에서는 다양한 하위 디렉토리에 대해 설명합니다 /var. 예를 들어, /var/lib삭제 한 파일이 라이브에 사용 된 위치에는 "프로그램이나 프로그램이 실행되는 동안 수정하고 하나의 특정 호스트와 관련된 데이터"로 정의 된 "응용 프로그램 또는 시스템과 관련된 상태 정보"가 있습니다.

당신은 정말 특정 파일가 무엇인지 모른 채 파일을 삭제하지 않아야합니다. 이러한 파일의 백업을하지 않는 한, 삭제 된 파일과 함께, 나는 유일한 백업 취 할 왼쪽 생각 /home, /etc등을 다시 설치합니다. 그렇게 할 때까지 dpkg(및 APT 등) 을 사용할 수 없습니다 . 그 외에는 시스템이 계속 작동해야합니다.


다른 컴퓨터에서 파일을 복사 할 수 있습니까, 아니면 컴퓨터마다 다른 것입니까?
Martin Vegter

1
@MartinVegter status는이 특정 컴퓨터에 설치된 패키지를 나열합니다. 정확히 동일한 패키지 상태 (설치된 것이 아니라 제거되었지만 제거되지 않은) 의 컴퓨터에서 복사 할 수 있습니다. apt-get update다시 사용할 수 있다고 생각합니다. 정보 / 물건은 설치된 각 패키지에서 나왔지만, 적어도 오래된 conf 파일에 대한 히스토리도 반영합니다. 그러나 아마도 정확히 같은 패키지 머신에서 복사하면 벗어날 수 있습니다.)
derobert

현재 문서는 " /var/lib상태 정보. 데이터베이스, 패키징 시스템 메타 데이터 등과 같이 프로그램이 실행될 때 수정 된 영구 데이터 "라고 선언 합니다.
Mikko Rantalainen

8

/var/lib/dpkg/status명령을 실행한다는 의미에서 "재 작성"할 수 없으며 파일이 마술처럼 나타납니다. 아니요. 파일 백업을 사용해야하며 /var/lib디렉토리를 삭제하지 않는 방법을 배우십시오 .

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

이것은 당신에게 전날의 패키지 상태를 줄 것입니다. 다른 것을 깨뜨리지 말고기도를 시작하십시오.


또한 /var/backups여러 사본이 있습니다을 참조하십시오 .
derobert

@Braiam-나는 구식이 아니며 / var / backups에 아무것도 없습니다. 다른 컴퓨터에서 파일을 복사 할 수 있습니까, 아니면 컴퓨터마다 다른 것입니까?
Martin Vegter

1
@MartinVegter 아니요, 작동하지 않습니다. 가장 빠른 방법은 중요한 파일을 백업하고 시스템을 다시 설치하는 것입니다. BTW, 심지어 /var/backups/dpkg.status.0?
Braiam

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데비안 패키지와 함께 제공되는 파일이 들어 있습니다. 패키지를 다시 설치하면 이러한 파일을 간단히 복원 할 수 있습니다. 물론 설치된 패키지 목록이 필요합니다. 복원 한 경우 /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는 적어도 dpkg직접 APT를 사용하여 패키지를 설치 한 적이있는 경우입니다 ( /var/lib/dpkg/status위의 명령 대신 int 대신 해당 파일 사용) . 그것도 삭제했다면 $(cd /usr/share/doc && ls), 대부분의 패키지는에 항목을 생성하기 때문에 대략적인 패키지 목록을 다시 작성할 수 있습니다 /usr/share/doc. 아마도 몇 가지 예외가있을 것입니다.

이 시스템의 패키지 관리에 대한 도움을 요청하지 마십시오. 시스템 핵심 파일 삭제에서 복구하는 것은 정확한 과학이 아닙니다. 백업에서 복원 할 수없는 경우 가능한 빨리 새롭고 깨끗한 시스템을 설치해야합니다.


역사적 문제와 해결 방법을 설명하는 것으로 시작 하는 한 그러한 시스템의 패키지에 대한 지원을 요청하는 것은 괜찮 습니다 . 때때로 이러한 시스템을 수리하면 일부 패키지 관리 프로세스의 보안 취약점과 같은 통지가 가능할 수 있으며 이러한 시스템을 다루는 것이 어렵다는 사실에도 불구하고 가치가있을 수 있습니다.
Mikko Rantalainen 19

5

/var/lib/dpkg/available위해서 apt 데이터에서 재현 할 수 있습니다. 내가 사용 dselect하고 업데이트를 선택 하는 가장 쉬운 방법 . 업데이트 방법으로 선택한 경우에만 작동합니다. 다음과 같은 것 같습니다 dselect:

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

데비안 sarge 이후로 상황이 변경되었을 수 있습니다.

/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"라는 빈 파일을 작성하는 것이 었습니다.

그런 다음 Update Manager를 실행했습니다.

그것은 나를 위해 일했다 :-)


0

'roo'이외의 다른 사용자 계정이 있다면 그 중 하나에서 apt-get dist-upgrade를 시도 할 수 있습니다. Apt는 아카이브를 다운로드하지만 / var /에 디렉토리가 누락되어 설치를 중단합니다. 디렉토리가 표시됩니다. 그것들을 만들고 apt-get dist-upgrade를 새로 실행하십시오. 대체 계정 로그에서 루트 n으로 다시 작성하는 데 실패한 경우 여기에서 dirs를 작성한 후 apt를 다시 실행하십시오. logrotate 구성에 대한 프롬프트가 표시되고 Y n을 입력하는 몇 가지 다른 구성은 끝까지 진행 한 다음 apt dist-upgrade가 완료되면 재부팅합니다. 이제 모든 것이 정상으로 돌아 왔습니다.


0

지연 돼서 죄송합니다. Briam에서 dirs와 파일을 수동으로 다시 작성한 후 repos ( mkdirtouch표시된 오류에 따라 필요에 따라) 를 업데이트 하고를 사용하십시오 dpkg --configure -a.

시스템은 정상적으로 작동하지만 손상되지 않도록 다시 설치해야합니다. 이전은 재설치 일정을 잡는 데 시간이 걸리고 /var/lib/*파일 삭제를 처리 하는 것입니다.


-2

라즈베리 파이 3을 구입했는데 문제가 발생하여 "/ var / lib / dpkg / status 파일을 열 수 없거나 구문을 열 수 없습니다"라는 오류가 발생하면 다음과 같은 해결 방법이 있습니다.

"/ var / lib / dpkg / status"파일을 재생성하는 방법, 이것이 쓸모없는 파일이 아니기 때문에, 이것은 설치 한 패키지에 대한 정보를 라스 비안 OS에 보관하는 매우 중요한 파일입니다. :

  1. Raspbian 시스템 내에서 wget을 수행하십시오.

    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
    

안녕! 링크가 아닌 답변의 일부로 코드를 게시하십시오.
dhag 2019

경고 : 이미 괜찮다면 테스트하지 않고 recover1.sh전류 /var/lib/dpkg/status를 파괴합니다 . 그런 다음 약간의 트릭을 실행하여 다소 작동하는 버전을 다시 작성하려고합니다. / var / lib / dpkg / status 파일이 완전히 누락되지 않은 이상 위의 스크립트를 실행하지 마십시오. 그렇지 않으면 strings /var/lib/dpkg/status손상된 파일을 다시 작성하는 더 좋은 방법 일 수 있습니다.
Mikko Rantalainen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.