손상된 파일이있는 패키지를 찾아서 다시 설치하십시오.


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.

베타 OS를 실험하는 동안 디스크 내용이 무작위로 손상 되었기 때문에 시스템에서 이것을 실행했습니다. 여기 내가 한 일이 있습니다 (그리고 잘 작동 한 것 같습니다).

먼저 'debsum'을 설치하고 시스템에 손상된 파일이 있는지 확인하기 위해 실행했습니다.

$ 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

보시다시피 5 개의 손상된 파일이 있으므로 다시 설치해야합니다. 이것이 손상된 파일이 들어있는 패키지를 찾은 방법입니다.

$ 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으로 다시 설치하려고하면 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에서 제공하는 스크립트는 손상된 파일에는 적합하지만 debsum은 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

이 질문은 다른 곳에서 답변되었습니다 :

우분투 위생 검사가 있습니까? : 패키지 debsum은 MD5 해시를 계산하고 deb 패키지와 비교할 수 있습니다.

패키지 관리자를 통해 안전하게 다시 설치할 수 있습니까? 예. 권장하지는 않습니다.


당신의 대답은 본질적으로 다른 질문에 대한 추천 있다면, 그것은 더 나은 것 플래그 다른의 중복으로이 질문에. 유용한 답변에 투표하는 것을 잊지 마십시오!
Melebius

-1

일부 Bash 스크립팅과 함께 dpkg 프로그램을 사용하면 가능합니다. 누군가가 "깨끗한"버전의 파일을 "악의적 인"파일로 바꾸는 경우 유일한 경고가됩니다. 이를 위해서는 깨끗한 패키지에서 유효한 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정확히 무엇을 나열합니까? 다른 곳에서 답변 된 debsum 은 좋은 대안처럼 보입니다.
Jan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.