Temukan (dan instal ulang) paket dengan file yang rusak (tanpa merusak apa pun)

35

Saya biasanya lebih suka memperbaiki sistem Linux daripada menginstal ulang dari awal. Komputer saya telah melihat banyak peningkatan distribusi dan daftar PPA atau repositori pihak ketiga. APT biasanya memastikan bahwa semuanya bekerja pada akhirnya. Namun, fakta bahwa manajer paket berpikir bahwa semua paket yang diperlukan 'diinstal' tidak menjamin bahwa semua file ada pada sistem file.

Situasi seperti itu dapat terjadi jika Anda harus mengatasi masalah ketergantungan dpkg --force-*. Orang juga dapat mereproduksi situasi seperti itu dengan menghapus file dari /usrsebagai root.

Apakah ada cara sederhana untuk memverifikasi apakah semua file milik paket yang diinstal ada?

Jika ditemukan paket masalah, aptitude reinstallperbaiki masalah tersebut.

Jan
sumber

Jawaban:

47

Dari debsumshalaman manual:

apt-get install --reinstall $(dpkg -S $(debsums -c) | cut -d : -f 1 | sort -u)
       Reinstalls packages with changed files.

Saya hanya menjalankan ini di sistem saya karena konten disk rusak secara acak ketika saya sedang bereksperimen dengan OS beta. Inilah yang saya lakukan (dan tampaknya telah bekerja dengan baik):

Pertama, saya menginstal 'debsums' dan menjalankannya untuk melihat apakah saya memiliki file yang rusak pada sistem saya:

$ sudo apt-get install debsums
$ sudo debsums_init
$ sudo debsums -cs
/usr/share/bash-completion/completions/ssh
/usr/share/icons/hicolor/scalable/actions/cheese-take-photo.svg
/usr/share/gnome/help/gnumeric/C/files-textopen.xml
/usr/share/dbus-1/services/indicator-sound.service
/lib/modules/3.11.0-12-generic/kernel/drivers/mtd/ubi/ubi.ko

Seperti yang Anda lihat, saya memiliki lima file yang rusak sehingga saya harus menginstalnya kembali. Ini adalah bagaimana saya menemukan paket mana yang berisi file yang rusak:

$ sudo debsums -c | xargs -rd '\n' -- dpkg -S | cut -d : -f 1 | sort -u
bash-completion
cheese-common
gnumeric-doc
indicator-sound
linux-image-extra-3.11.0-12-generic

Lalu saya memperbaiki korupsi dengan menginstal ulang paket yang rusak:

$ xargs -rd '\n' -a <(sudo debsums -c | xargs -rd '\n' -- dpkg -S | cut -d : -f 1 | sort -u) -- sudo apt-get install -f --reinstall --
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following package was automatically installed and is no longer required:
  linux-image-generic
Use 'apt-get autoremove' to remove it.
0 upgraded, 0 newly installed, 5 reinstalled, 0 to remove and 0 not upgraded.
Need to get 43.9 MB of archives.
After this operation, 0 B of additional disk space will be used.
Get:1 http://us.archive.ubuntu.com/ubuntu/ saucy/main bash-completion all 1:2.0-1ubuntu3 [173 kB]
Get:2 http://us.archive.ubuntu.com/ubuntu/ saucy/main cheese-common all 3.8.3-0ubuntu1 [2,929 kB]
Get:3 http://us.archive.ubuntu.com/ubuntu/ saucy/universe gnumeric-doc all 1.12.6-1 [7,295 kB]     
Get:4 http://us.archive.ubuntu.com/ubuntu/ saucy/main linux-image-extra-3.11.0-12-generic i386 3.11.0-12.19 [33.5 MB]
Get:5 http://us.archive.ubuntu.com/ubuntu/ saucy/main indicator-sound i386 12.10.2+13.10.20131011-0ubuntu1 [55.7 kB]
Fetched 43.9 MB in 10min 23s (70.4 kB/s)                                                           
(Reading database ... 174913 files and directories currently installed.)
Preparing to replace bash-completion 1:2.0-1ubuntu3 (using .../bash-completion_1%3a2.0-1ubuntu3_all.deb) ...
Unpacking replacement bash-completion ...
Preparing to replace cheese-common 3.8.3-0ubuntu1 (using .../cheese-common_3.8.3-0ubuntu1_all.deb) ...
Unpacking replacement cheese-common ...
Preparing to replace gnumeric-doc 1.12.6-1 (using .../gnumeric-doc_1.12.6-1_all.deb) ...
Unpacking replacement gnumeric-doc ...
Preparing to replace linux-image-extra-3.11.0-12-generic 3.11.0-12.19 (using .../linux-image-extra-3.11.0-12-generic_3.11.0-12.19_i386.deb) ...
Unpacking replacement linux-image-extra-3.11.0-12-generic ...
Examining /etc/kernel/postrm.d .
run-parts: executing /etc/kernel/postrm.d/initramfs-tools 3.11.0-12-generic /boot/vmlinuz-3.11.0-12-generic
run-parts: executing /etc/kernel/postrm.d/zz-update-grub 3.11.0-12-generic /boot/vmlinuz-3.11.0-12-generic
Preparing to replace indicator-sound 12.10.2+13.10.20131011-0ubuntu1 (using .../indicator-sound_12.10.2+13.10.20131011-0ubuntu1_i386.deb) ...
Unpacking replacement indicator-sound ...
Processing triggers for man-db ...
Processing triggers for libglib2.0-0:i386 ...
No such key 'auto-launch' in schema 'com.ubuntu.update-notifier' as specified in override file '/usr/share/glib-2.0/schemas/20_xubuntu-default-settings.gschema.override'; ignoring override for this key.
Processing triggers for hicolor-icon-theme ...
Setting up bash-completion (1:2.0-1ubuntu3) ...
Setting up cheese-common (3.8.3-0ubuntu1) ...
Setting up gnumeric-doc (1.12.6-1) ...
Setting up linux-image-extra-3.11.0-12-generic (3.11.0-12.19) ...
Running depmod.
update-initramfs: deferring update (hook will be called later)
Not updating initrd symbolic links since we are being updated/reinstalled 
(3.11.0-12.19 was configured last, according to dpkg)
Not updating image symbolic links since we are being updated/reinstalled 
(3.11.0-12.19 was configured last, according to dpkg)
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/apt-auto-removal 3.11.0-12-generic /boot/vmlinuz-3.11.0-12-generic
run-parts: executing /etc/kernel/postinst.d/dkms 3.11.0-12-generic /boot/vmlinuz-3.11.0-12-generic
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 3.11.0-12-generic /boot/vmlinuz-3.11.0-12-generic
update-initramfs: Generating /boot/initrd.img-3.11.0-12-generic
run-parts: executing /etc/kernel/postinst.d/pm-utils 3.11.0-12-generic /boot/vmlinuz-3.11.0-12-generic
run-parts: executing /etc/kernel/postinst.d/update-notifier 3.11.0-12-generic /boot/vmlinuz-3.11.0-12-generic
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 3.11.0-12-generic /boot/vmlinuz-3.11.0-12-generic
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.11.0-14-generic
Found initrd image: /boot/initrd.img-3.11.0-14-generic
Found linux image: /boot/vmlinuz-3.11.0-12-generic
Found initrd image: /boot/initrd.img-3.11.0-12-generic
Found memtest86+ image: /boot/memtest86+.bin
Found Windows 7 (loader) on /dev/sda1
done
Setting up indicator-sound (12.10.2+13.10.20131011-0ubuntu1) ...

Akhirnya, saya memeriksa untuk memastikan tidak ada file yang rusak:

$ sudo debsums -c

Tidak ada output dari perintah ini, yang berarti tidak ada kesalahan yang ditemukan. :-)

Satu catatan terakhir: Anda juga harus memeriksa file konfigurasi paket Anda untuk memastikan semuanya OK. Ini bisa lebih sulit karena file konfigurasi sering berubah, dan perubahannya sah, jadi Anda harus memeriksa secara manual setiap file konfigurasi yang diubah untuk menentukan apakah itu benar-benar rusak atau tidak. Ini adalah bagaimana Anda mendapatkan daftar file konfigurasi yang diubah:

$ sudo debsums -as
debsums: changed file /etc/gnome/defaults.list (from desktop-file-utils package)
debsums: changed file /etc/default/rcS (from initscripts package)
debsums: changed file /etc/subuid (from login package)
debsums: changed file /etc/subgid (from login package)
debsums: changed file /etc/sudoers (from sudo package)
PeniWize
sumber
Saya tidak hanya file yang rusak tetapi juga file yang hilang. ketika saya mencoba menginstal ulang dengan apt-get it dibatalkan karena dpkg memberikan kesalahan bahwa file hilang (facepalm). Sama dengan apt-get remove, error karena file hilang.
Mark Jeronimus
Jika Anda memiliki lebih dari 1. Ini juga berfungsi untuk file yang hilang. debsums -c | grep -P -o '/.*?\s' | xargs dpkg -S | cut -d : -f 1 | xargs apt-get install --reinstall
mikeytown2
11

Skrip yang diberikan oleh PeniWize berfungsi bagus untuk file yang rusak, tetapi tidak menangani paket dengan file yang hilang, karena debsums melaporkannya ke stderr. Untuk menginstal ulang paket dengan file yang hilang, ini bekerja untuk saya:

xargs -rd '\n' -a <(sudo debsums -c 2>&1 | cut -d " " -f 4 | sort -u | xargs -rd '\n' -- dpkg -S | cut -d : -f 1 | sort -u) -- sudo apt-get install -f --reinstall --
ajn
sumber
-1

Menggunakan program dpkg bersama dengan beberapa skrip Bash seharusnya dapat membantu Anda. Satu-satunya peringatan adalah jika seseorang mengganti versi "bersih" dari file dengan yang "jahat". Untuk itu Anda perlu mendapatkan checksum MD5 yang valid dari paket asli. Bagaimanapun, ini adalah kode shell untuk mencapai apa yang Anda inginkan:

#!/bin/sh
PACKAGE_NAME="xterm"
for i in `sudo dpkg -L ${PACKAGE_NAME}`
do
    if ! [ -e $i ]; then
            echo "$i is a missing file in the $PACKAGE_NAME package."
    fi
done

Skrip hanya akan mencetak jika file atau direktori yang ditentukan dalam paket hilang. Anda juga perlu mengganti variabel 'PACKAGE_NAME' dengan paket yang ingin Anda periksa. Semoga ini membantu.

Justin Andrusk
sumber
1
Saya tidak yakin apakah ini akan berhasil dalam semua kasus. Apa dpkg -Ldaftar sebenarnya? debsum seperti yang dijawab di tempat lain sepertinya merupakan alternatif yang baik.
Jan