Làm cách nào để tạo lại tệp trạng thái dpkg bị hỏng?


26

Bất cứ khi nào tôi gõ sudo apt-get removevà sau đó nhấn Tabphím để tự động hoàn thành, tôi nhận được thông báo sau:

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

Tôi không thấy bất cứ điều gì đặc biệt lạ ở dòng 15945 trong tệp trạng thái. Đó là một ký tự dấu chấm trong trường mô tả của gói thư viện đơn âm và chèn dấu hai chấm không giúp ích gì. Xóa dòng chứa dấu chấm cũng không hoạt động. Ghi đè tập tin với trạng thái cũ dẫn đến cùng một thông báo.

Có cách nào để xây dựng lại tập tin trạng thái?


3
Tôi không nghĩ rằng bạn có thể xây dựng lại hoàn toàn statustệp: đó là nguồn thông tin chính và trong khi rất nhiều trong số đó là dư thừa, thì không phải tất cả đều như vậy. Tuy nhiên, có thể sửa chữa tệp bằng tay. Đăng một đoạn của tập tin xung quanh dòng có vấn đề, giả sử 20 Package:dòng4040 bao gồm ít nhất một dòng trước và sau dòng 15945.
Gilles 'SO- ngừng trở nên xấu xa'

Tôi đã thử gỡ cài đặt mono nhưng tất cả những gì đã làm là thay đổi số dòng được báo cáo là lỗi. Nếu bạn theo liên kết dán, số dòng vi phạm là 25, "Mục: python" paste.ub Ubuntu.com/501929
Ramón

@ Ramón Vì vậy, apt-get, dpkgvà bạn bè vẫn làm việc một cách chính xác, và những gì đang erroring ra tự động hoàn thành là?
Riccardo Murri

Chính xác. Dường như chỉ gặp sự cố khi phân tích tệp trạng thái khi sử dụng tự động hoàn thành. Tôi có thể cài đặt và gỡ bỏ các gói mà không có lỗi rõ ràng.
Ramón

Bắt cùng một vấn đề. Tôi không nghĩ mù quáng sử dụng một phiên bản cũ của cơ sở dữ liệu apt là điều nên làm ở đây bất kể nó khắc phục vấn đề này .
Oli

Câu trả lời:


7

Tôi cuối cùng đã sửa chữa hệ thống của tôi về điều này. Khôi phục bản sao lưu của tệp trạng thái không hoạt động vì tôi đã gặp sự cố quá lâu, đó là trong tất cả các bản sao lưu của tôi.

Việc khắc phục liên quan đến việc grepping cho các ngắt định dạng thực tế và sửa chúng bằng tay. Nó không khó như âm thanh.

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


Vui mừng bạn đã tìm thấy một giải pháp, Oli và cảm ơn vì đã chia sẻ. Trong trường hợp của tôi, ngoài cuộc tranh luận tại Nether có vấn đề, một cuộc tranh luận về Webmin cũng có mô tả không đúng nhưng trong trường hợp đó, nó không gây ra bất kỳ vấn đề phân tích cú pháp nào khi thực hiện tự động hoàn tất. Kỳ dị.
Ramón

3
@Oli bạn có phải là người giữ giấy phép không? Bạn có thể viết nó ở đây?
Braiam

Đây là sự thật, tốt mà tôi đọc bài viết của bạn. Tôi đã có một missing package namevà tôi phát hiện ra rằng, vì một số lý do kỳ lạ, tốt hơn hết là tôi không lãng phí thời gian để tìm hiểu, tôi đã có một dòng Packaga: landscape-commonđược sửa chữa bằng phương pháp nội soi và bam, vấn đề đã được giải quyết. Vấn đề là, tôi chưa bao giờ chạm vào tập tin này, cũng không có ai khác. Làm thế nào một máy tính có thể gây rối với một lỗi chính tả?
Severo Raz

Câu trả lời thực tế cũng phải có ở đây, để tránh nó là câu trả lời chỉ liên kết [nếu lỗi xuất phát từ một dòng trống không có trước "Gói:" thì hãy thêm một .dòng trống đó].
Xen2050

20

Bạn sẽ có thể làm việc với một tệp trạng thái tốt đã biết trước đó và cập nhật từ đó. Mỗi khi bạn thực hiện cài đặt hoặc cập nhật, tệp trạng thái sẽ được lưu vào bản sao lưu được nén bằng / var / backup . Thực hiện một ls -l dpkg * trên thư mục hiển thị:

-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

Ngoài ra còn có một bản sao lưu của tệp được tạo trong thư mục / var / lib / dpkg / có tên status-old. Thực hiện trạng thái ls -l * trên thư mục hiển thị:

-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

Vì vậy, để phục hồi sau khi tham nhũng, bạn có thể làm như sau:

1. Tạo một bản sao lưu của tệp trạng thái bị hỏng :

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

2. Sao chép tệp trạng thái dpkg gần đây vào vị trí từ một trong các nguồn trên:

hoặc

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

hoặc là

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

3. Sau đó chạy cập nhật apt-get:

sudo apt-get update

Nên làm vậy.


2
Tôi không biết về các tệp trạng thái được giữ trong / var / backup. Đây là thông tin tốt để có trong trường hợp nó xảy ra một lần nữa. Cảm ơn, Jim.
Ramón

Nhưng nó có an toàn để sử dụng một phiên bản cũ? Ý tôi là, chắc chắn không chỉ tự động hoàn thành sử dụng tệp này và sử dụng phiên bản cũ với thông tin gói cũ hơn sẽ làm hỏng việc khác, những điều quan trọng hơn nhiều ... như chính apt.
Oli

@Oli tôi không chắc. Tôi chỉ phải làm điều này một lần. Tôi nghĩ rằng tôi đã phải cài đặt lại ứng dụng gây ra sự cố, nhưng về phía trước nó đã hoạt động. Như với tất cả các lời khuyên trên Internet (hoặc ít nhất là lời khuyên từ tôi trên Internet), điều này làm việc cho tôi. Điều đó không có nghĩa là nó nhất thiết sẽ làm việc cho bạn. Tôi cung cấp nó mà không có bảo hành và không có kiến ​​thức rõ ràng về cách nó sẽ hoạt động trên hệ thống của bạn. Số dặm của bạn có thể thay đổi. Hãy tự chịu rủi ro.
Jim

Giải pháp này dường như đã khắc phục vấn đề của tôi. Tôi sẽ cập nhật nếu có vấn đề phát sinh từ việc sử dụng tệp trạng thái cũ.
Matthew

Tập tin cũ có thể thiếu một số thay đổi gói đã thực hiện cho hệ thống nhưng chủ yếu là nó sẽ ổn. Làm sudo apt update && sudo apt dist-upgradenên khắc phục hầu hết các vấn đề mà statustập tin cũ có thể gây ra. Nếu hệ thống của bạn có một mớ hỗn độn lớn hơn, sudo aptitude dist-upgradethay vì sudo apt ...đôi khi có thể gợi ý những cách tốt hơn để sửa chữa vỡ.
Mikko Rantalainen

6

Tôi đã có thể khắc phục sự cố này bằng cách xóa các gói đã bị hỏng các mục trong tệp trạng thái.

sudo dpkg -r handbrake-cli

Giải pháp được chấp nhận qua pcregrep không hoạt động (pcregrep không tìm thấy gì).


Cảm ơn bạn rất nhiều vì nó hiệu quả với tôi và thực tế đó là cách tiếp cận phù hợp Cảm ơn
user2671192 17/12/14

6

Hãy thử "dpkg -P" cho gói vi phạm. Điều đó sẽ thanh lọc nó khỏi kho lưu trữ cục bộ, loại bỏ tất cả dấu vết. Trên hệ thống của tôi, đó là bản sửa lỗi cho các gói đã bị xóa (nhưng chưa bị xóa) tạo ra lỗi đó.


5

Trong trường hợp này, tôi sẽ sao lưu /var/lib/dpkg/statustệp bị hỏng và sau đó sửa nó bằng tay (xung quanh các dòng 1888 và 9550) bằng cách sử dụng thông tin từ

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

Đã nhận nó . apt-get hiện đang chạy trơn tru.
ændrük

3

Đây là một lỗi (được cho là đã được sửa): Launchpad Bug 613018

Thượng nguồn: Debian Bug 590885

Đây phải là một cách giải quyết (sao lưu, chuỗi phiên bản "sửa chữa"):

cp /var/lib/dpkg/status ~/dpkg-status.back
sudo sed -i "s/56127_Ubuntu_karmic/56127Ubuntukarmic/" /var/lib/dpkg/status

2

Con trai của ...

Được rồi, lỗi thực tế là trên dòng 15266 mặc dù nó được báo cáo khoảng 700 dòng tiếp theo. Mục nhập có vấn đề trong tệp trạng thái là do một lỗi tôi đã cài đặt để máy in Nether của tôi hoạt động cách đây rất lâu. Các mục là cho gói lexmark-inkjet-08-driver. Trường Mô tả không có dấu .ngắt dòng. Điều này gây ra lỗi phân tích cú pháp.

Để tìm ra điều này, tôi đã sử dụng một phương pháp khắc phục sự cố shotgun và bắt đầu thử mọi thứ khá ngẫu nhiên. Một trong những nỗ lực ngớ ngẩn của tôi là nhận grep-status -P era rằng e là chữ cái phổ biến nhất trong bảng chữ cái. Tôi câm, tôi biết, nhưng bản ghi trạng thái cuối cùng được in ra trước khi nó phàn nàn về một dấu hai chấm bị mất là cho gói lexmark và tôi nhận thấy thiếu một .ký tự sau vài phút nhìn chằm chằm vào màn hình.

Nếu có thể, tôi muốn một câu trả lời khác có thể mô tả một phương pháp tốt hơn để tìm ra loại vấn đề này trong trường hợp ai đó gặp phải vấn đề tương tự trong tương lai. Cảm ơn.


grep-status -r -P ^phải luôn luôn khớp với bất kỳ gói nào để nó phân tích toàn bộ tệp và hủy bỏ nếu nó không thể phân tích cú pháp.
Mikko Rantalainen

2

Bởi vì tình trạng cũ của tôi quá rắc rối ngay cả với apt-get update,

Điều này làm việc khá tốt cho tôi:

(là gốc)

cd /var/lib/dpkg 

cp -avf status status.corrupt

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

Lệnh này sử dụng các đối số -c và -d cho lệnh tr để xóa tất cả các ký tự khỏi luồng đầu vào khác với các giá trị bát phân ASCII được hiển thị giữa các dấu ngoặc đơn. Lệnh này đặc biệt cho phép các ký tự sau đi qua bộ lọc Unix này:

bát phân 11: tab

bát phân 12: linefeed

bát phân 15: trở về xe ngựa

bát phân 40 đến bát phân 176: tất cả các ký tự bàn phím "tốt"

Tất cả các ký tự nhị phân khác - các ký tự "rác" trong tệp của bạn - sẽ bị loại bỏ trong quá trình dịch thuật này.

CREDIT: http://alvinalexander.com/blog/post/linux-unix/how-remove-non-printable-ascii-char character-file-unix

Nếu bạn tò mò điều gì đã thay đổi hoặc nơi nào sẽ là thiệt hại: (có thể lâu dài)

diff /var/lib/dpkg/{status-old,status} |less
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.