Cài đặt lại các gói với các tập tin bị thiếu / hỏng


17

Sau khi tắt máy ô uế và một fsck đầy màu sắc, cả đống tập tin đã bị mất. Đầu ra của 'rpm -Va' dài vài trăm dòng (hầu hết các tệp bị thiếu nhưng cũng có một số tổng kiểm tra và các phần không khớp khác). Có cách nào dễ dàng để cài đặt lại các gói bị thiếu và / hoặc tệp bị hỏng không?

Hệ điều hành trong câu hỏi là Fedora 22.


3
Chắc chắn là có thể, nhưng cũng khá tẻ nhạt để phân tích đầu ra và cho mỗi tệp truy vấn gói chứa tệp đó và có thể mất một thời gian. Tại sao không chỉ đơn giản là cài đặt lại tất cả các gói? yum reinstall $(rpm -qa --qf="%{N}-%{V}\n" | sort)
doktor5000

Nó cũng có thể khá xấu khi lọc ra tất cả các vấn đề bổ sung do prelink gây ra, nếu tôi không nhầm mà vẫn được bật theo mặc định trên Fedora theo fedorahosted.org/fesco/ticket/1183
doktor5000 19/07/15

Tôi thực sự đã cài đặt lại tất cả mọi thứ - vấn đề là tôi đã quên bật cache cho dnf, cuối cùng nó đã tải xuống hơn 2gb gói (và tôi đã giới hạn internet)
jaymmer - Khôi phục lại

Câu trả lời:


16

Để tham khảo và hoàn thiện vì lợi ích, một lệnh có thể đạt được những gì ban đầu được yêu cầu sẽ là một thứ như thế này (nhanh chóng kết hợp với nhau, nhưng nó hoạt động)

rpm -qf $(rpm -Va 2>&1 | grep -vE '^$|prelink:' | sed 's|.* /|/|') | sort -u

Đây là một lời giải thích ngắn về các phần khác nhau:

rpm -Va 2>&1

Sẽ chạy xác minh đầy đủ trên tất cả các gói hiện được cài đặt / liệt kê trong cơ sở dữ liệu vòng / phút. Nó cũng sẽ chuyển hướng stderr sang thiết bị xuất chuẩn, vì ở đây trên hộp của tôi một số lỗi gây ra bởi prelink được kích hoạt được báo cáo là lỗi nhưng chúng tôi muốn chúng trên thiết bị xuất chuẩn.
Chú ý: Cần chạy bằng root để có thể kiểm tra tất cả các tệp, quyền và chủ sở hữu / nhóm.

grep -vE '^$|prelink:'

ngăn chặn việc hiển thị các dòng emtpy và các lỗi prelink như vậy (ví dụ về lỗi đó
prelink: /tmp/#prelink#.B14JBi: Recorded 10 dependencies, now seeing -1:)

sed 's|.* /|/|')

sẽ lọc rpm -Vađầu ra để chỉ hiển thị tên tệp

rpm -qf $()

sẽ truy vấn tất cả các tên tệp thu được trong đó các gói được chứa và xuất ra tên và phiên bản của gói

| sort -u

sẽ ngăn chặn các kết hợp tên / phiên bản gói trùng lặp.

Tổng cộng bạn sẽ nhận được một danh sách các gói không xác minh.

rpm -Vavẫn có thể hiển thị một số vấn đề không liên quan, vì nó cũng kiểm tra sự phụ thuộc giữa các gói, có thể cần phải được loại bỏ bằng cách thêm --nodeps.


2

Gần đây tôi đã gặp sự cố tương tự với các tệp bị thiếu trên openSUSE 13.2 và đã sửa nó bằng:

rpm -Va --nodeps --nodigest --noscripts --nosignature --nofiledigest --nosize --nomode --nordev --nouser --nogroup --nomtime\
| awk -e '($1=="missing") && ($2=="d") {system("rpm -qf "$3);}; ($1=="missing") && ($2!="d") && ($2!="c") {system("rpm -qf "$2);}'\
| sort -u | xargs zypper in -f

Các tùy chọn cho vòng / phút và cuộc gọi đến awk nhằm tiết kiệm thời gian trong trường hợp của tôi, vì không có tham nhũng xảy ra.


1
Nếu không có hỏng tập tin, bạn thậm chí có thể thêm --nofilesvà do đó về cơ bản sẽ làm như vậy yum check dependenciesvì nó sẽ chỉ kiểm tra tất cả các gói vòng / phút được cài đặt cho các vấn đề phụ thuộc. --nofilessẽ tiết kiệm rất nhiều thời gian cho việc cài đặt không phải SSD, nhưng bạn cũng sẽ bỏ qua việc kiểm tra các tệp bị thiếu. ... chỉ vì lợi ích hoàn toàn. Và xin lưu ý, nếu bạn grep cho chuỗi tiếng Anh, bạn có thể muốn thêm tiền tố vào LC_ALL=C;)
doktor5000
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.