Bozuk dosyalarla paketler bulun (ve yeniden kurun) (hiçbir şeyi bozmadan)


35

Genellikle bir Linux sistemini düzeltmeyi sıfırdan yeniden kurmayı tercih ederim. Bilgisayarlarım birçok dağıtım yükseltmesi ve bir PPA listesi veya üçüncü taraf depoları gördü. APT genellikle her şeyin sonunda çalıştığından emin olur. Ancak, paket yöneticisinin gerekli tüm paketlerin 'kurulu' olduğunu düşündüğü gerçeği, tüm dosyaların dosya sisteminde bulunduğunu garanti etmez.

Böyle bir durum, beraberinde bağımlılık problemlerini çözmeniz gerekiyorsa ortaya çıkabilir dpkg --force-*. Kişi böyle bir durumu bir dosyayı /usrroot olarak silerek de çoğaltabilir .

Yüklenmiş bir pakete ait tüm dosyaların mevcut olup olmadığını doğrulamanın basit bir yolu var mı?

Böyle bir sorun paketi bulunursa, aptitude reinstallsorunu giderir.

Yanıtlar:


47

Gönderen debsumsadam sayfası:

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

Bunu sadece sistemimde kullandım, çünkü beta işletim sistemi ile deneme yaparken disk içeriği rastgele bozuldu. İşte yaptığım şey (ve iyi çalıştığı görünüyor):

İlk önce 'debsums' yükledim ve sistemimde bozuk dosyalar olup olmadığını görmek için koştum:

$ 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

Gördüğünüz gibi, beş bozuk dosyam var, onları yeniden yüklemem gerekiyor. Hangi paketlerin bozuk dosyaları içerdiğini bu şekilde buldum:

$ 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

Sonra hasarlı paketleri tekrar yükleyerek yolsuzluğu tamir ettim:

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

Sonunda, bozuk dosya kalmadığından emin olmak için kontrol ettim:

$ sudo debsums -c

Bu komuttan çıktı gelmedi, bu da hata bulunmadığı anlamına geliyor. :-)

Son bir not: iyi olduklarından emin olmak için paketlerinin yapılandırma dosyalarını da kontrol etmelisin. Bu daha zor olabilir çünkü yapılandırma dosyaları sık sık değişir ve değişiklikler meşrudur, bu nedenle değiştirilmiş her bir yapılandırma dosyasını gerçekten bozuk olup olmadığını belirlemek için el ile denetlemeniz gerekir. Değişen yapılandırma dosyalarının bir listesini bu şekilde alırsınız:

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

Sadece dosyaları değil, aynı zamanda dosyaları da kaybettim. apt-get komutuyla yeniden yüklemeye çalıştığımda, dpkg bir dosyanın eksik olduğunu (facepalm) verdiği için iptal ediyor. Apt-get remove ile aynı, hata nedeniyle dosya eksik.
Mark Jeronimus

1'den fazla varsa Bu, aynı zamanda eksik dosya için çalışıyor. debsums -c | grep -P -o '/.*?\s' | xargs dpkg -S | cut -d : -f 1 | xargs apt-get install --reinstall
mikeytown2

11

PeniWize tarafından verilen komut dosyası bozuk dosyalar için harikadır, ancak debsums'ler bunları stderr'e bildirdiği için eksik dosya içeren paketlerle ilgilenmez. Paketleri eksik olan dosyaları yeniden yüklemek benim için işe yaradı:

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


-1

Dpkg programını kullanarak bazı Bash komut dizileri kullanabilirsiniz. Tek uyarı, birinin "temiz" sürümlerini dosyaların "kötü amaçlı" olanlarla değiştirmesi olabilir. Bunun için, bozulmamış bir paketten geçerli MD5 sağlama toplamı almanız gerekir. Her neyse, işte istediğini elde etmek için kabuk kodu:

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

Komut dosyası yalnızca pakette tanımlanmış bir dosya veya dizin eksikse yazdırılır. Ayrıca, 'PACKAGE_NAME' değişkenini incelemek istediğiniz paketle değiştirmeniz gerekir. Bu yardımcı olur umarım.


1
Bunun her durumda işe yarayacağından emin değilim. dpkg -LTam olarak ne listeler? Başka bir yerde cevaplandığı gibi debsums, iyi bir alternatif gibi görünüyor.
19
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.