ค้นหา (และติดตั้งใหม่) แพ็คเกจด้วยไฟล์ที่เสียหาย (โดยไม่ทำลายอะไรเลย)


35

ฉันมักจะต้องการแก้ไขระบบ Linux มากกว่าติดตั้งใหม่ตั้งแต่ต้น คอมพิวเตอร์ของฉันได้เห็นการอัพเกรดการกระจายจำนวนมากและรายการ PPA หรือที่เก็บของบุคคลที่สาม APT มักจะทำให้แน่ใจว่าทุกอย่างทำงานได้ในที่สุด อย่างไรก็ตามความจริงที่ว่าผู้จัดการแพ็คเกจคิดว่าแพ็กเกจที่จำเป็นทั้งหมดเป็น 'ติดตั้ง' ไม่รับประกันว่าไฟล์ทั้งหมดจะปรากฏในระบบไฟล์

dpkg --force-*สถานการณ์ดังกล่าวดังกล่าวอาจเกิดขึ้นได้ถ้าคุณมีปัญหาการพึ่งพาการทำงานรอบกับ เราสามารถทำซ้ำสถานการณ์ดังกล่าวได้โดยการลบไฟล์จาก/usrในฐานะรูท

มีวิธีง่าย ๆ ในการตรวจสอบว่าไฟล์ทั้งหมดที่เป็นของแพ็คเกจที่ติดตั้งมีอยู่หรือไม่?

หากพบแพ็กเกจปัญหาดังกล่าวให้aptitude reinstallแก้ไขปัญหา

คำตอบ:


47

จากdebsumsหน้าคน:

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

ฉันเพิ่งรันสิ่งนี้บนระบบของฉันเพราะเนื้อหาของดิสก์เกิดความเสียหายแบบสุ่มขณะที่ฉันทดลองกับระบบปฏิบัติการเบต้า นี่คือสิ่งที่ฉันทำ (และดูเหมือนว่าจะทำงานได้ดี):

ก่อนอื่นฉันติดตั้ง 'debsums' และเรียกใช้เพื่อดูว่ามีไฟล์ที่เสียหายในระบบของฉันหรือไม่:

$ 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

อย่างที่คุณเห็นฉันมีห้าไฟล์เสียหายดังนั้นฉันต้องติดตั้งใหม่ นี่คือวิธีที่ฉันพบว่าแพ็คเกจใดที่มีไฟล์เสียหาย:

$ 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

จากนั้นฉันซ่อมแซมความเสียหายด้วยการติดตั้งแพคเกจที่เสียหาย:

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

ในที่สุดฉันตรวจสอบเพื่อให้แน่ใจว่าไม่มีไฟล์ที่เสียหายอยู่:

$ sudo debsums -c

ไม่มีเอาต์พุตจากคำสั่งนี้ซึ่งหมายความว่าไม่พบข้อผิดพลาด :-)

หมายเหตุสุดท้าย: คุณควรตรวจสอบไฟล์กำหนดค่าของแพ็คเกจเพื่อให้แน่ใจว่าตกลง ซึ่งอาจเป็นเรื่องยากมากขึ้นเนื่องจากไฟล์กำหนดค่ามีการเปลี่ยนแปลงบ่อยครั้งและการเปลี่ยนแปลงนั้นถูกต้องตามกฎหมายดังนั้นคุณจะต้องตรวจสอบแต่ละไฟล์กำหนดค่าที่เปลี่ยนแปลงเพื่อกำหนดว่าไฟล์นั้นเสียหายจริงหรือไม่ นี่คือวิธีที่คุณจะได้รับรายการไฟล์ปรับแต่งที่เปลี่ยนแปลง:

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

ฉันไม่เพียง แต่ไฟล์ที่เสียหาย แต่ยังไฟล์ที่ขาดหายไป เมื่อฉันพยายามติดตั้งใหม่โดยใช้ apt-get it aborts เพราะ dpkg ให้ข้อผิดพลาดว่าไฟล์หายไป (facepalm) เหมือนกับ apt-get remove ข้อผิดพลาดเนื่องจากไฟล์หายไป
Mark Jeronimus

หากคุณมีมากกว่า 1 นี้ใช้งานได้กับไฟล์ที่หายไปเช่นกัน debsums -c | grep -P -o '/.*?\s' | xargs dpkg -S | cut -d : -f 1 | xargs apt-get install --reinstall
mikeytown2

11

สคริปต์ที่ได้รับจาก PeniWize ใช้งานได้ดีสำหรับไฟล์ที่เสียหาย แต่ไม่ได้ดูแลแพ็กเกจที่มีไฟล์ที่หายไปเพราะ debsums จะรายงานให้ stderr หากต้องการติดตั้งแพ็กเกจใหม่ด้วยไฟล์ที่หายไปสิ่งนี้ใช้ได้กับฉัน:

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

คำถามได้รับคำตอบจากที่อื่น:

มีการตรวจสอบสติของ Ubuntu หรือไม่ : debsums ของแพคเกจสามารถคำนวณ MD5 hashes และเปรียบเทียบกับแพคเกจ deb

มีวิธีที่ปลอดภัยในการติดตั้งผ่านตัวจัดการแพคเกจ : ใช่ แต่ไม่แนะนำ


หากคำตอบของคุณคือการอ้างอิงถึงคำถามอื่นเป็นหลักจะเป็นการดีกว่าถ้าคุณติดธงคำถามนี้ซ้ำกับคำถามอื่น อย่าลืมโหวตให้กับคำตอบที่คุณเห็นว่ามีประโยชน์!
Melebius

-1

การใช้โปรแกรม dpkg พร้อมกับการเขียนสคริปต์ Bash บางอย่างจะช่วยให้คุณทำสิ่งนี้ได้ ข้อแม้เพียงอย่างเดียวคือหากมีคนแทนที่ไฟล์ "เวอร์ชัน" ที่สะอาดด้วยไฟล์ที่เป็น "อันตราย" เพื่อที่คุณจะต้องได้รับการตรวจสอบ MD5 ที่ถูกต้องจากแพคเกจที่เก่าแก่ อย่างไรก็ตามนี่คือรหัสเชลล์เพื่อให้บรรลุสิ่งที่คุณต้องการ:

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

สคริปต์จะพิมพ์ออกมาเฉพาะเมื่อไฟล์หรือไดเรกทอรีที่กำหนดไว้ในแพ็คเกจขาดหายไป นอกจากนี้คุณจะต้องแทนที่ตัวแปร 'PACKAGE_NAME' ด้วยแพ็คเกจที่คุณต้องการตรวจสอบ หวังว่านี่จะช่วยได้


1
ฉันไม่แน่ใจว่าจะใช้งานได้ในทุกกรณีหรือไม่ อะไรdpkg -Lรายการว่า? debsums ตามคำตอบที่อื่นดูเหมือนเป็นทางเลือกที่ดี
ม.ค.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.