Tìm (và cài đặt lại) các gói có tệp bị hỏng (không phá vỡ bất cứ thứ gì)


35

Tôi thường thích sửa một hệ thống Linux hơn là cài đặt lại từ đầu. Máy tính của tôi đã thấy nhiều nâng cấp phân phối và danh sách các PPA hoặc kho lưu trữ của bên thứ ba. APT thường đảm bảo rằng mọi thứ hoạt động cuối cùng. Tuy nhiên, thực tế là người quản lý gói nghĩ rằng tất cả các gói bắt buộc được 'cài đặt' không đảm bảo rằng tất cả các tệp đều có trên hệ thống tệp.

Một tình huống như vậy có thể xảy ra nếu bạn phải giải quyết các vấn đề phụ thuộc xung quanh dpkg --force-*. Người ta cũng có thể tái tạo một tình huống như vậy bằng cách xóa một tập tin từ /usrgốc.

Có cách nào đơn giản để xác minh xem tất cả các tệp thuộc gói đã cài đặt không?

Nếu một gói vấn đề như vậy được tìm thấy, aptitude reinstallkhắc phục vấn đề.

Câu trả lời:


47

Từ debsumstrang người đàn ông:

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

Tôi chỉ chạy cái này trên hệ thống của mình vì nội dung đĩa bị hỏng ngẫu nhiên trong khi tôi đang thử nghiệm hệ điều hành beta. Đây là những gì tôi đã làm (và dường như nó đã hoạt động tốt):

Đầu tiên, tôi đã cài đặt 'debsums' và chạy nó để xem liệu tôi có bất kỳ tệp bị hỏng nào trên hệ thống của mình không:

$ 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

Như bạn có thể thấy, tôi có năm tệp bị hỏng nên tôi cần cài đặt lại chúng. Đây là cách tôi tìm thấy gói nào chứa các tệp bị hỏng:

$ 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

Sau đó, tôi đã sửa chữa tham nhũng bằng cách cài đặt lại các gói bị hỏng:

$ 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) ...

Cuối cùng, tôi đã kiểm tra để đảm bảo rằng không còn tệp bị hỏng:

$ sudo debsums -c

Không có đầu ra từ lệnh này, có nghĩa là không tìm thấy lỗi. :-)

Một lưu ý cuối cùng: bạn cũng nên kiểm tra các tệp cấu hình của gói để đảm bảo chúng ổn. Điều này có thể khó khăn hơn vì các tệp cấu hình thường thay đổi và các thay đổi là hợp pháp, do đó bạn sẽ cần kiểm tra thủ công từng tệp cấu hình đã thay đổi để xác định xem nó có thực sự bị hỏng hay không. Đây là cách bạn có được danh sách các tệp cấu hình đã thay đổi:

$ 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)

Tôi không chỉ bị hỏng tập tin mà còn thiếu tập tin. Khi tôi cố gắng cài đặt lại với apt-get, nó sẽ hủy bỏ vì dpkg báo lỗi rằng một tập tin bị thiếu (facepalm). Tương tự với apt-get remove, lỗi vì tập tin bị thiếu.
Mark Jeronimus

Nếu bạn có nhiều hơn 1. Điều này cũng hoạt động cho các tệp bị thiếu. debsums -c | grep -P -o '/.*?\s' | xargs dpkg -S | cut -d : -f 1 | xargs apt-get install --reinstall
mikeytown2

11

Kịch bản được đưa ra bởi PeniWize hoạt động rất tốt cho các tệp bị hỏng, nhưng không quan tâm đến các gói có tệp bị thiếu, vì debsums báo cáo chúng cho thiết bị lỗi chuẩn. Để cài đặt lại các gói với các tệp bị thiếu, điều này làm việc cho tôi:

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 --

3

Câu hỏi đã được trả lời ở nơi khác:

Có kiểm tra vệ sinh Ubuntu không? : gói debsums có thể tính băm MD5 và so sánh với gói deb.

Có cách nào an toàn để cài đặt lại thông qua trình quản lý gói : Có, nhưng không được khuyến nghị.


Nếu câu trả lời của bạn về cơ bản là giới thiệu cho một câu hỏi khác, tốt hơn là gắn cờ câu hỏi này là một bản sao của câu hỏi khác. Đừng quên bỏ phiếu cho (các) câu trả lời mà bạn thấy hữu ích!
Melebius

-1

Sử dụng chương trình dpkg cùng với một số tập lệnh Bash sẽ có thể giúp bạn điều này. Nhắc nhở duy nhất sẽ là nếu ai đó thay thế các phiên bản "sạch" của các tệp bằng các phiên bản "độc hại". Vì vậy, bạn sẽ cần nhận được tổng kiểm MD5 hợp lệ từ gói nguyên sơ. Dù sao, đây là mã shell để đạt được những gì bạn muốn:

#!/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

Kịch bản sẽ chỉ in ra nếu một tệp hoặc thư mục được xác định trong gói bị thiếu. Ngoài ra, bạn sẽ cần thay thế biến 'PACKAGE_NAME' bằng gói mà bạn muốn kiểm tra. Hi vọng điêu nay co ich.


1
Tôi không chắc liệu điều này sẽ làm việc trong mọi trường hợp. Những gì hiện dpkg -Ldanh sách chính xác? debsums như được trả lời ở nơi khác trông giống như một sự thay thế tốt.
Jan
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.