손상된 dpkg 상태 파일을 어떻게 다시 작성합니까?


26

입력 sudo apt-get remove하고 Tab자동 완성을 위해 키를 누를 때마다 다음 메시지가 나타납니다.

grep-status: /var/lib/dpkg/status:15945: expected a colon
.

상태 파일의 15945 행에서 특히 이상한 것을 보지 못했습니다. 모노 라이브러리 패키지의 설명 필드에 점 문자이며 콜론을 삽입해도 도움이되지 않습니다. 점이 포함 된 줄을 제거해도 작동하지 않았습니다. 상태가 오래된 파일을 덮어 쓰면 같은 메시지가 나타납니다.

상태 파일을 다시 작성하는 방법이 있습니까?


3
status파일을 완전히 다시 작성할 수 있다고 생각하지 않습니다. 파일은 기본 정보 소스이며 많은 파일이 중복되어 있지만 전부는 아닙니다. 그러나 파일을 수동으로 복구 할 수 있습니다. Package:15945 행 전후의 최소 한 줄을 포함하여 20-40 줄과 같이 문제가있는 줄 주위에 파일을 게시합니다.
Gilles 'SO-stop

이후 모노를 제거하려고 시도했지만 오류로보고되는 줄 번호를 변경하기 만했습니다. 붙여 넣기 링크를 따라 가면 문제의 줄 번호는 25입니다. "섹션 : python" paste.ubuntu.com/501929
Ramón

라몬 그래서 @ apt-get, dpkg친구는 여전히 제대로 작동하고 자동 완성 기능은 무엇인지 erroring입니다?
Riccardo Murri

옳은. 자동 완성을 사용할 때 상태 파일을 구문 분석하는 데 문제가있는 것 같습니다. 명백한 오류없이 패키지를 설치하고 제거 할 수 있습니다.
Ramón

같은 문제가 발생합니다. 나는 맹목적으로 고정에 관계없이 그것의 여기 옳은 일을 APT의 데이터베이스가 이전 버전입니다 사용하여 생각하지 않습니다 문제를.
Oli

답변:


7

나는 마침내 내 시스템을 고쳤다. 오랫동안 문제가있어 상태 파일의 백업을 복원해도 작동하지 않았습니다. 모든 백업에 있습니다.

이 수정에는 실제 서식 나누기를 제거하고 수동으로 수정하는 작업이 포함됩니다. 소리만큼 어렵지는 않습니다.

http://thepcspy.com/read/fixing-dpkg-status-corruption/


솔루션을 찾았 게되어 기쁘고 Oli와 공유해 주셔서 감사합니다. 필자의 경우 문제가있는 Lexmark deb 외에도 Webmin deb의 설명이 잘못되었지만 자동 완성을 수행 할 때 구문 분석 문제가 발생하지 않았습니다. 기묘한.
Ramón

3
@Oli 당신은 라이센스의 소유자입니까? 여기에 쓸 수 있습니까?
브라이 암

이것은 사실입니다. 나는 당신의 게시물을 읽었습니다. 나는 a를 가지고 있었고, missing package name이상한 이유 때문에 발견하는 데 시간을 낭비하지 않는 것이 좋았습니다. Packaga: landscape-common직교 적으로 고정되어 있고 문제가 해결 된 줄 이있었습니다. 문제는이 파일을 건드리지 않았으며 다른 사람도 없었습니다. 컴퓨터가 철자 실수를 어떻게 엉망으로 만들 수 있습니까?
Severo Raz

링크 전용 답변이되지 않도록 실제 답변도 여기에 있어야합니다. "오류가"패키지 : "앞에 오지 않는 빈 줄에서 발생한 경우 해당 빈 줄에 a .를 추가하십시오" .
Xen2050

20

이전에 알려진 정상 상태 파일을 사용하여 작업하고 업데이트 할 수 있어야합니다. 설치 또는 업데이트를 수행 할 때마다 상태 파일은 / var / backups 의 gzipped 백업에 저장 됩니다 . 디렉토리에서 ls -l dpkg *를 수행하면 다음이 표시됩니다.

-rw-r--r-- 1 root root   2266732 2010-09-30 08:35 dpkg.status.0
-rw-r--r-- 1 root root    624182 2010-09-29 08:49 dpkg.status.1.gz
-rw-r--r-- 1 root root    623844 2010-09-28 08:55 dpkg.status.2.gz
-rw-r--r-- 1 root root    620358 2010-09-24 11:04 dpkg.status.3.gz
-rw-r--r-- 1 root root    619021 2010-09-23 15:34 dpkg.status.4.gz
-rw-r--r-- 1 root root    619013 2010-09-23 08:03 dpkg.status.5.gz
-rw-r--r-- 1 root root    618968 2010-09-21 08:33 dpkg.status.6.gz

status-old라는 / var / lib / dpkg / 디렉토리에 생성 된 파일의 백업도 있습니다. 디렉토리에서 ls -l status *를 수행하면 다음이 표시됩니다.

-rw-r--r-- 1 root root 2266732 2010-09-30 08:35 status
-rw-r--r-- 1 root root 2267191 2010-09-30 08:35 status-old

따라서 손상으로부터 복구하려면 다음을 수행 할 수 있어야합니다.

1. 손상된 상태 파일을 백업하십시오 .

mv /var/lib/dpkg/status /var/lib/dpkg/status_bkup

2. 최근의 dpkg 상태 파일을 위 소스 중 하나에서 복사하십시오.

어느 한 쪽

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

또는

cp /var/backups/dpkg.status.#.gz /var/lib/dpkg/
gunzip -d /var/lib/dpkg/dpkg.status.#.gz 
mv /var/lib/dpkg/dpkg.status.# /var/lib/dpkg/status

그런 다음 apt-get update를 실행하십시오.

sudo apt-get update

그렇게해야합니다.


2
/ var / backups에 보관 된 상태 파일에 대해 몰랐습니다. 다시 발생할 수있는 좋은 정보입니다. 고마워요, 짐
Ramón

그러나 이전 버전을 사용하는 것이 안전합니까? 확실히이 파일을 사용하는 것은 자동 완성 기능뿐만 아니라 이전 패키지 정보가 포함 된 이전 버전을 사용하면 apt 자체와 같이 훨씬 더 중요한 다른 것들을 망칠 것입니다.
Oli

@Oli 확실하지 않습니다. 이 작업은 한 번만 수행하면됩니다. 문제를 일으킨 앱을 다시 설치해야한다고 생각했지만 앞으로는 효과가있었습니다. 인터넷에 대한 모든 조언 (또는 적어도 인터넷에 대한 조언)과 마찬가지로 이것은 나를 위해 일했습니다. 그렇다고 반드시 효과가 있다는 것을 의미하지는 않습니다. 보증 및 시스템에서의 작동 방식에 대한 명시적인 지식없이 제공합니다. 귀하의 마일리지가 다를 수 있습니다. 자신의 위험을 감수하십시오.
Jim

이 솔루션은 문제를 해결 한 것으로 보입니다. 이전 상태 파일을 사용하여 문제가 발생하면 업데이트하겠습니다.
Matthew

이전 파일에는 시스템에 수행 된 일부 패키지 변경 사항이 누락되었을 수 있지만 대부분 괜찮습니다. 이렇게 sudo apt update && sudo apt dist-upgrade된 것이 대부분의 문제를 해결해야 status파일이 발생할 수 있습니다. 시스템이 더 엉망인 경우 sudo aptitude dist-upgrade대신 sudo apt ...파손을 해결하는 더 좋은 방법을 제안 할 수 있습니다.
Mikko Rantalainen

6

상태 파일의 항목을 손상시킨 패키지를 제거하여이 문제를 해결할 수있었습니다.

sudo dpkg -r handbrake-cli

pcregrep을 통한 승인 된 솔루션이 작동하지 않습니다 (pcregrep가 아무것도 찾지 못했습니다).


감사합니다. 그것이 저에게 효과적이며 실제로 올바른 접근법입니다. Thanks
user2671192

6

문제가있는 패키지에 대해 "dpkg -P"를 시도하십시오. 로컬 저장소에서 제거하여 모든 추적을 제거합니다. 내 시스템에서는 해당 오류를 발생시키는 제거되었지만 아직 제거되지 않은 패키지에 대한 수정이었습니다.


5

이 경우 손상된 /var/lib/dpkg/status파일을 백업 한 다음 다음 정보를 사용하여 수동으로 (1888 및 9550 행 주위) 파일을 수정합니다.

apt-cache show libssl0.9.8
apt-cache show udev

알았어요 . apt-get은 이제 매끄럽게 실행됩니다.
ændrük


2

아들의 ...

약 700 줄이 더 줄었다 고보고되었지만 실제 오류는 15266 행에있었습니다. 상태 파일에 문제가있는 항목은 오래 전에 Lexmark 프린터가 작동하도록 설치된 deb로 인해 발생했습니다. 패키지에 대한 항목 lexmark-inkjet-08-driver입니다. 설명 필드 .에는 줄 바꿈 대신에 가 없습니다 . 이로 인해 구문 분석 오류가 발생했습니다.

이를 찾기 위해 산탄 총 문제 해결 방법을 사용하여 거의 무작위로 시도했습니다. 나의 구피 시도 중 하나는 grep-status -P ee가 알파벳에서 가장 일반적인 문자라는 것을 알아 냈습니다. Dumb은 알고 있지만 콜론이 누락되었다고 불평하기 전에 인쇄 된 마지막 상태 기록은 lexmark 패키지에 대한 것이었고 .몇 분 동안 화면을 쳐다 본 후 문자 가 부족하다는 것을 알았습니다 .

가능하다면 앞으로 비슷한 문제가 발생할 경우 이런 종류의 문제를 찾는 더 좋은 방법을 설명 할 수있는 다른 대답을 원합니다. 감사.


grep-status -r -P ^항상 모든 패키지와 일치해야하므로 전체 파일을 구문 분석하고 구문 분석 할 수없는 경우 중단해야합니다.
Mikko Rantalainen

2

내 때문에 상태짜리 도 너무 문제가 있었다 apt-get update,

이것은 나를 위해 아주 잘 작동했습니다.

(루트로서)

cd /var/lib/dpkg 

cp -avf status status.corrupt

tr -cd '\11\12\15\40-\176' < status.corrupt > status

이 명령은 -c 및 -d 인수를 tr 명령에 사용하여 작은 따옴표 사이에 표시되는 ASCII 8 진 값 이외의 입력 스트림에서 모든 문자를 제거합니다. 이 명령은 특히 다음 문자가이 Unix 필터를 통과 할 수 있도록합니다.

8 월 11 일 : 탭

8 진 12 : 줄 바꿈

8 월 15 일 : 캐리지 리턴

8 진수 40-8 진수 176 : 모든 "좋은"키보드 문자

파일의 "쓰레기"문자 인 다른 모든 이진 문자는이 변환 과정에서 제거됩니다.

크레딧 : http://alvinalexander.com/blog/post/linux-unix/how-remove-non-printable-ascii-characters-file-unix

변경된 사항이나 손상이 어디인지 궁금한 경우 : (아마도 긴)

diff /var/lib/dpkg/{status-old,status} |less
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.