Làm thế nào để tạo lại / var / lib / dpkg / status?


10

Tôi đã xóa một số tệp xung quanh /var/lib/dpkg/, cụ thể là:

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

Tôi hiểu Debian sử dụng các tệp này để giữ một số thông tin về các gói đã cài đặt. Bây giờ khi tôi làm apt-get update, tôi nhận được lỗi sau:

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.

Theo tôi hiểu FHS , các tệp nằm trong /varkhông được coi là hệ thống quan trọng. Đánh giá chúng phải là các tệp tạm thời, nhật ký, bộ nhớ cache và tương tự.

Do đó, có cách nào để tạo lại các tập tin bị xóa?


1
Câu trả lời của Braiam sẽ giúp bạn lấy lại tập tin trạng thái; nhưng những thứ bạn đã xóa theo /var/lib/dpkg/infocũng khá quan trọng. Bạn đã hiểu nhầm FHS và AFAIK các đường dẫn khôi phục duy nhất là (a) khôi phục từ bản sao lưu hoặc (b) cài đặt lại.
derobert

Câu trả lời:


13

Nếu bạn nhìn vào mục đích của / var như được đưa ra trong Tiêu chuẩn phân cấp hệ thống tập tin , nó sẽ nói:

/varchứa các tệp dữ liệu biến. Điều này bao gồm các thư mục và tệp đệm, dữ liệu quản trị và ghi nhật ký, và các tệp tạm thời và tạm thời.

Lưu ý rằng các tệp "tạm thời và tạm thời" chỉ là một trong những thứ chứa trong đó. Nó cũng chứa "thư mục và tập tin spool" và "dữ liệu quản trị và ghi nhật ký". Bạn đã xóa "dữ liệu hành chính" quan trọng.

Nó tiếp tục để giải thích tại sao /vartồn tại:

/varđược chỉ định ở đây để có thể gắn kết chỉ /usrđọc. Tất cả mọi thứ đã từng đi vào /usrđó được ghi vào trong quá trình vận hành hệ thống (trái ngược với cài đặt và bảo trì phần mềm) phải được đưa vào /var.

Đó là điều quan trọng về /var: dữ liệu trong đó thay đổi, không giống như /usr(chỉ thay đổi khi bạn thêm / xóa / cập nhật phần mềm).

Phần tiếp theo giải thích các thư mục con khác nhau của /var; ví dụ: /var/lib(nơi các tệp bạn đã xóa sử dụng để sống) chứa "thông tin trạng thái liên quan đến một ứng dụng hoặc hệ thống", được định nghĩa là "dữ liệu mà các chương trình sửa đổi trong khi chúng chạy và liên quan đến một máy chủ cụ thể."

Bạn thực sự không nên xóa các tập tin mà không biết các tập tin cụ thể là gì. Với các tệp bạn đã xóa, trừ khi bạn có bản sao lưu của các tệp này, tôi nghĩ rằng điều duy nhất còn lại phải làm là sao lưu /home, /etcv.v. và cài đặt lại. Cho đến khi bạn làm như vậy, bạn sẽ không thể sử dụng dpkg(và APT, v.v.). Ngoài ra, hệ thống nên tiếp tục hoạt động.


Tôi có thể sao chép các tập tin từ một máy khác không, hoặc chúng là máy cụ thể?
Martin Vegter

1
@MartinVegter liệt kê các gói được cài đặt trên máy cụ thể này. Bạn có thể sao chép nó từ một máy có cùng trạng thái gói chính xác (không chỉ được cài đặt mà còn bị xóa nhưng cũng không bị xóa). apt-get updateTôi sẽ xây dựng lại có sẵn, tôi tin. Thông tin / nội dung đến từ mỗi gói được cài đặt, nhưng nó cũng phản ánh lịch sử, ít nhất là đối với các tệp conf cũ ... nhưng bạn có thể thoát khỏi việc sao chép từ chính gói máy đó)
derobert

Tài liệu hiện tại tuyên bố " /var/libThông tin trạng thái. Dữ liệu liên tục được sửa đổi bởi các chương trình khi chúng chạy, ví dụ: cơ sở dữ liệu, siêu dữ liệu hệ thống đóng gói, v.v."
Mikko Rantalainen

8

Bạn không thể "tạo lại" /var/lib/dpkg/statustheo nghĩa chỉ cần chạy một lệnh và tập tin sẽ xuất hiện một cách kỳ diệu. Không. Bạn cần sử dụng bản sao lưu của tệp và tìm hiểu không bao giờ xóa những thứ trong /var/libthư mục:

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

Điều này sẽ cung cấp cho bạn trạng thái gói của ngày hôm trước. Bắt đầu cầu nguyện nó đã không phá vỡ một cái gì đó khác.


cũng thấy /var/backups, có nhiều bản ở đó.
derobert

@Braiam - Tôi không có trạng thái cũ, tôi cũng không có gì trong / var / sao lưu. Tôi có thể sao chép các tập tin từ một máy khác không, hoặc chúng là máy cụ thể?
Martin Vegter

1
@MartinVegter không, nó sẽ không hoạt động. Cách nhanh nhất cho bạn là sao lưu các tệp quan trọng của bạn và cài đặt lại hệ thống. BTW, thậm chí /var/backups/dpkg.status.0không?
Braiam

8

Các tập tin nằm trong /varrất nhiều hệ thống quan trọng. Ví dụ: /var/mailhoặc /var/spool/mailchứa email của người dùng; bạn sẽ không xóa nó nhiều hơn bạn sẽ thắp lửa trong hộp thư của hàng xóm. Đó chỉ là các tệp trong một thư mục con nhất định /varchứa các tệp ít nhất là tạm thời: tệp nhật ký /var/log, bộ nhớ cache thường có thể được tạo lại /var/cache, các tệp tạm thời (mà bạn không nên xóa trong khi sử dụng!) /var/tmp.

Dữ liệu trong /var/libcó thể khá quan trọng. Ví dụ, MySQL thường được cấu hình để lưu trữ cơ sở dữ liệu của nó /var/lib/mysqltheo mặc định: nếu bạn xóa nó, bạn xóa sạch cơ sở dữ liệu của mình. Dpkg cũng đặt cơ sở dữ liệu của riêng mình /var/lib; /var/lib/dpkg/statuslà một.

/var/lib/dpkg/statuschứa thông tin về các gói cài đặt. Nếu bạn đã xóa nó, bạn nên khôi phục nó từ bản sao lưu. Nếu bản sao lưu của bạn không cập nhật đầy đủ, hãy kiểm tra nhật ký của các thao tác gói gần đây bên dưới /var/log/aptvà trong /var/log/dpkg.log. Bạn sẽ cần phải tạo tập tin đó trước khi dpkglàm việc.

/var/lib/dpkg/availableđược xây dựng từ dữ liệu tải xuống từ Internet. apt-get updatenên xây dựng lại nó.

/var/lib/dpkg/infochứa các tệp được gửi cùng với các gói Debian. Bạn có thể khôi phục các tệp này một cách đơn giản bằng cách cài đặt lại các gói. Tất nhiên, bạn sẽ cần một danh sách các gói được cài đặt cho điều đó. Nếu bạn đã khôi phục /var/lib/dpkg/status, thì bạn có thể trích xuất danh sách các gói từ đó.

apt-get install --reinstall $(</var/lib/dpkg/status sed -n 's/^Package://p')

Nếu bạn bị mất /var/lib/dpkg/status, thì bạn có thể tạo lại nó bằng cách tạo một tệp trống, sau đó chạy apt-get install --reinstalltrên danh sách các gói. Một nơi mà danh sách các gói cũng được lưu là /var/lib/apt/extended_states, ít nhất là nếu bạn chỉ sử dụng APT để cài đặt các gói (trái ngược với dpkgtrực tiếp) - sử dụng tệp đó thay vì /var/lib/dpkg/statusint lệnh trên. Nếu bạn cũng đã xóa điều đó, bạn có thể xây dựng lại một danh sách các gói gần đúng $(cd /usr/share/doc && ls), bởi vì hầu hết các gói tạo ra một mục trong /usr/share/doc. Có lẽ có một vài ngoại lệ.

Không yêu cầu bất kỳ trợ giúp về quản lý gói trên hệ thống này. Phục hồi từ việc xóa các tệp quan trọng hệ thống không phải là một khoa học chính xác. Nếu bạn không thể khôi phục từ bản sao lưu, bạn nên cài đặt một hệ thống mới, sạch càng sớm càng tốt.


Tôi sẽ nói rằng không sao khi yêu cầu hỗ trợ về các gói trên một hệ thống như vậy miễn là bạn bắt đầu với việc mô tả vấn đề lịch sử và cách bạn khắc phục nó . Đôi khi, việc sửa chữa các hệ thống như vậy có thể cho phép nhận thấy các lỗ hổng bảo mật trong một số quy trình quản lý gói và nó có thể có giá trị mặc dù thực tế rằng việc xử lý một hệ thống như vậy có thể khó khăn.
Mikko Rantalainen

5

/var/lib/dpkg/availablethể được tạo lại từ dữ liệu apt. Cách dễ nhất tôi tìm thấy để làm điều này chúng tôi sử dụng dselectvà chọn cập nhật. Tôi hy vọng điều này sẽ chỉ hoạt động nếu bạn có apt được chọn làm phương pháp cập nhật. Có vẻ như dselect:

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

Lưu ý mặc dù mọi thứ có thể đã thay đổi kể từ sà lan Debian.

Có các thủ thuật để tạo lại /var/lib/dpkg/statusdựa trên thực tế là mọi gói được yêu cầu để thêm một thư mục trong /usr/share/docthư mục. Xem bài đăng tại http://linuxmafia.com/faq/Debian/package-database-rebuild.html . Có một đoạn script được trình bày sử dụng danh sách / usr / share / doc được lọc để tạo danh sách các gói đã được cài đặt, sau đó cài đặt lại tất cả.


1

Vâng, tôi cho rằng bạn có thể tạo lại tập tin trống và sau đó thực hiện cài đặt danh sách dài apt-get, giả sử bạn biết những gì bạn đã cài đặt lần đầu tiên.

Tôi có một tập lệnh cổ mà về cơ bản là từ tập gói nhỏ nhất có thể chạy apt-get. Khi sử dụng, tôi đã báo cáo hàng chục phụ thuộc không khai báo.

Nếu bạn không biết mọi thứ bạn đã cài đặt, hãy cài đặt lại hệ thống.


0

Trên Linux Mint 17 tôi gặp phải một vấn đề âm thanh tương tự. Tôi đã rất nhiệt tình trong việc xóa các tập tin và thấy mình ở nơi "Quản trị -> Trình quản lý nâng cấp" trông không vui vẻ gì .......

Giải pháp hiệu quả với tôi là tạo một thư mục có tên "dpkg" theo thông báo lỗi và trong đó tạo một tệp trống có tên là "trạng thái".

Sau đó tôi chạy Trình quản lý cập nhật.

Nó hoạt động với tôi :-)


0

Nếu bạn có các tài khoản người dùng khác ngoài 'bạn không thể thử apt-get dist-nâng cấp từ một trong số họ. Apt sẽ tải xuống tài liệu lưu trữ nhưng không thể cài đặt chúng do một số thư mục bị thiếu trong / var /. Các thư mục sẽ được hiển thị. tạo chúng và chạy apt-get dist-nâng cấp một lần nữa. Trong trường hợp tạo chúng thất bại từ tài khoản thay thế đăng nhập trở lại root n tạo các thư mục từ đó sau đó chạy lại apt. bạn sẽ được nhắc về cấu hình logrotate và một vài cấu hình khác chỉ cần gõ Y n cho đến khi kết thúc, sau đó khởi động lại khi quá trình nâng cấp apt hoàn tất. mọi thứ bây giờ sẽ trở lại bình thường


0

Xin lỗi về sự chậm trễ. Briam, tạo lại các thư mục và tệp theo cách thủ công và sau đó cập nhật repos ( mkdirtouch, theo yêu cầu của lỗi được hiển thị) và sử dụng dpkg --configure -a.

Hệ thống của bạn sẽ chạy tốt, nhưng điều quan trọng là phải cài đặt lại để đảm bảo rằng nó không bị hỏng; trước đây chỉ để có thời gian lên lịch cài đặt lại ... và chăm sóc xóa /var/lib/*các tập tin.


-2

Nếu bạn đã mua mâm xôi pi 3 và bạn gặp phải sự cố và gặp lỗi "không thể mở tệp / var / lib / dpkg / trạng thái được phân tích hoặc mở" thì đây là một cách giải quyết phù hợp với tôi:

Làm cách nào để tạo lại tệp "/ var / lib / dpkg / status"?, Chỉ vì đây không phải là tệp không hợp lệ, đây là một tệp rất quan trọng giữ một số thông tin về các gói đã cài đặt trong hệ điều hành raspbian của bạn, vì vậy đây là cách tôi được tạo lại :

  1. Thực hiện một wget trong hệ thống Raspbian của bạn:

    wget http://www.doglabscs.com/recover1.sh
    
  2. Cấp một số quyền:

    chmod 777 recover1.sh
    
  3. Phân tích thư mục tài liệu trong hệ thống của bạn và tạo lại tệp trạng thái:

    ./recover1.sh
    
  4. Sau khi hoàn thành, tải tập tin và đọc kỹ. Thực hiện theo các bước được mô tả trong tệp:

    wget http://www.doglabscs.com/recover2.txt
    cat recover2.txt
    

Chào! Vui lòng gửi mã dưới dạng một phần câu trả lời của bạn chứ không phải là liên kết.
dhag

Cảnh báo: recover1.shsẽ phá hủy hiện tại của bạn /var/lib/dpkg/statusmà không cần kiểm tra nếu nó đã ổn. Sau đó, nó sẽ thực hiện các thủ thuật hỗn hợp để cố gắng xây dựng lại phiên bản hoạt động. Không bao giờ chạy tập lệnh trên trừ khi bạn hoàn toàn thiếu tệp / var / lib / dpkg / status. Nếu không, strings /var/lib/dpkg/statuscó thể là một cách tốt hơn để bắt đầu xây dựng lại các tập tin bị hỏng.
Mikko Rantalainen
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.