Menginstal ulang paket dengan file yang hilang / rusak

17

Setelah shutdown yang tidak bersih dan fsck yang penuh warna, sejumlah file hilang. Output dari 'rpm -Va' panjangnya beberapa ratus baris (kebanyakan file hilang tetapi juga beberapa checksum dan ketidakcocokan lainnya). Apakah ada cara mudah untuk menginstal ulang paket yang memiliki file yang hilang dan / atau rusak?

OS yang dimaksud adalah Fedora 22.

jaymmer - Pasang kembali Monica
sumber
3
Tentu mungkin, tetapi juga cukup membosankan untuk mengurai output dan untuk setiap file permintaan paket yang berisi file itu dan mungkin membutuhkan waktu. Mengapa tidak menginstal ulang semua paket dengan mudah? yum reinstall $(rpm -qa --qf="%{N}-%{V}\n" | sort)
doktor5000
Mungkin juga sangat jelek untuk menyaring semua masalah tambahan yang disebabkan oleh prelink, jika saya tidak salah bahwa masih diaktifkan secara default pada Fedora menurut fedorahosted.org/fesco/ticket/1183
doktor5000
Saya memang akhirnya menginstal ulang semuanya - masalahnya adalah saya lupa mengaktifkan keep-cache untuk dnf, akhirnya mengunduh lebih dari 2gb paket (dan saya telah membatasi internet)
jaymmer - Reinstate Monica

Jawaban:

16

Demi referensi dan kelengkapan, satu perintah yang akan dapat mencapai apa yang awalnya diminta akan menjadi seperti ini (dengan cepat mengutak-atik bersama, tetapi berhasil)

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

Berikut penjelasan singkat dari berbagai bagian:

rpm -Va 2>&1

Akan menjalankan verifikasi lengkap pada semua paket yang saat ini diinstal / terdaftar dalam basis data rpm. Ini juga akan mengarahkan stderr ke stdout, karena di sini di kotak saya beberapa kesalahan yang disebabkan oleh prelink yang diaktifkan dilaporkan sebagai kesalahan tetapi kami menginginkannya di stdout.
Perhatian: Perlu dijalankan sebagai root untuk dapat memeriksa semua file, izin dan pemilik / grup.

grep -vE '^$|prelink:'

Menekan menampilkan garis emtpy dan seperti kesalahan prelink (contoh kesalahan seperti itu:
prelink: /tmp/#prelink#.B14JBi: Recorded 10 dependencies, now seeing -1)

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

akan memfilter rpm -Vaoutput hanya menampilkan nama file

rpm -qf $()

akan menanyakan semua nama file yang diperoleh yang berisi paket-paket itu, dan menampilkan nama dan versi paket

| sort -u

akan menekan kombinasi nama paket / versi duplikat.

Secara keseluruhan Anda akan menerima daftar paket yang gagal verifikasi.

rpm -Vamungkin masih menunjukkan beberapa masalah yang tidak terkait, karena juga memeriksa dependensi antar paket, yang mungkin perlu ditekan dengan menambahkan --nodeps.

doktor5000
sumber
2

Baru-baru ini saya memiliki masalah yang sama dengan file yang hilang pada openSUSE 13.2 dan memperbaikinya dengan:

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

Opsi untuk rpm dan panggilan ke awk dimaksudkan untuk menghemat waktu dalam kasus saya, karena tidak ada korupsi yang terjadi.

auxsvr
sumber
1
Jika tidak ada kerusakan file, Anda bahkan dapat menambahkan --nofilesdan karenanya pada dasarnya melakukan hal yang sama karena yum check dependencieshanya akan memeriksa semua paket rpm yang diinstal untuk masalah ketergantungan. --nofilesakan menghemat banyak waktu untuk instalasi non-SSD, tetapi Anda juga akan menghilangkan centang untuk file yang hilang. ... hanya demi kelengkapan. Dan harap diingat, jika Anda menerima string bahasa Inggris, Anda mungkin ingin awalan dengan LC_ALL=C;)
doktor5000