시스템 업그레이드 중 정전이 발생했습니다( pacman -Suy
). 그래서 손상된 패키지가 많이 있습니다. 재설치 시 강제로 덮어쓰면 문제가 해결되는 것 같습니다(예 pacman -S systemd-sysvcompat--overwrite "*"
: ).
그래서 제 질문은 손상된 모든 패키지에 재설치를 적용하는 방법입니다.
답변1
손상된 패키지가 누락된 파일로 보고되었다고 가정하면 Qk
(에서)를 사용하여 패키지를 확인할 수 있습니다 man pacman
.
-k, --확인
해당 패키지가 소유한 모든 파일이 시스템에 존재하는지 확인합니다. 패키지가 지정되지 않았거나 필터 플래그가 제공되지 않은 경우 설치된 모든 패키지를 확인하십시오. 이 옵션을 두 번 지정하면 필수 mtree 파일이 포함된 패키지에 대해 보다 자세한 파일 검사(권한, 파일 크기 및 수정 시간 포함)가 수행됩니다.
따라서 이 명령은 시스템에서 손상된 패키지의 전체 목록을 제공해야 합니다(아래 예는 내 Arch의 결과입니다).
$ pacman -Qk 2>/dev/null | grep -v ' 0 missing files'
at: 45 total files, 1 missing file
audit: 196 total files, 4 missing files
bind: 413 total files, 3 missing files
blueman: 791 total files, 1 missing file
gdm: 501 total files, 6 missing files
gnome-perl: 71 total files, 18 missing files
gnome-vfs-perl: 61 total files, 27 missing files
gnomecanvas-perl: 39 total files, 17 missing files
gvfs: 324 total files, 1 missing file
hplip: 2294 total files, 72 missing files
mariadb: 354 total files, 1 missing file
nfs-utils: 111 total files, 3 missing files
perl-goo-canvas: 59 total files, 18 missing files
perl-gtk2-imageview: 36 total files, 19 missing files
perl-term-shellui: 21 total files, 6 missing files
polkit: 201 total files, 1 missing file
samba: 976 total files, 1 missing file
syslinux: 237 total files, 2 missing files
systemd: 1891 total files, 1 missing file
그러면 이 명령은 패키지 이름만 인쇄합니다.
$ pacman -Qk 2>/dev/null | grep -v ' 0 missing files' | cut -d: -f1
at
audit
bind
blueman
gdm
gnome-perl
gnome-vfs-perl
gnomecanvas-perl
gvfs
hplip
mariadb
nfs-utils
perl-goo-canvas
perl-gtk2-imageview
perl-term-shellui
polkit
samba
syslinux
systemd
목록을 반복하고 다시 설치할 수 있습니다.
pacman -Qk 2>/dev/null | grep -v ' 0 missing files' | cut -d: -f1 |
while read -r package; do
pacman -S "$package" --overwrite "*" --noconfirm
done
또는 목록이 너무 길지 않으면 다음과 같이 할 수도 있습니다.
pacman -S "$(pacman -Qk 2>/dev/null | grep -v ' 0 missing files' | cut -d: -f1)" \
--overwrite "*" --noconfirm
제가 가지고 있으니 참고해주세요아니요이것을 테스트했으며 이 명령이 패키지를 수정한다는 귀하의 말을 받아들입니다. sudo pacman -Qkk 1>/dev/null 2>&1 | grep checksum
제안된 대로 실행하여 실수로 수정된 파일을 확인할 수도 있습니다 .탕옌댓글에.
마지막으로 Arch 문서에서는 이 --overwrite
옵션을 사용하지 말라고 경고하고 있습니다.벤 모르드개댓글에서 이 점을 지적하세요):
일반적으로 pacman과 함께 --overwrite 옵션을 사용하지 마십시오. --overwrite 옵션은 glob을 포함하는 인수를 사용합니다. 팩맨을 사용하면 glob과 일치하는 파일에 대한 파일 충돌 검사를 우회합니다. 적절하게 유지 관리되는 시스템에서는 Arch 개발자가 명시적으로 권장하는 경우에만 사용해야 합니다. 보다#시스템 업그레이드 전 꼭 읽어야 할 내용부분.
물론 귀하의 경우에는 업그레이드 중 정전으로 인해 시스템을 제대로 유지 관리하지 못하므로 이는 좋은 사용 사례가 될 수 있습니다.
답변2
모든 패키지를 반복하고 다시 설치하는 스크립트를 작성할 수 있습니다.
현재 설치된 패키지 목록을 텍스트 파일로 저장하기만 하면 됩니다.
pacman -Qq > packages.txt
스크립트를 작성하십시오.
nano reinstall.sh
#!/bin/bash
for package in $(cat packages.txt)
do
pacman -S $package --overwrite "*" --noconfirm
done
나중에 실행할 수 있습니다
sudo sh reinstall.sh
노트:chmod a+x reinstall.sh
스크립트를 실행 가능하게 만들려면 다음을 입력 해야 할 수도 있습니다.
답변3
두 답변 모두 유용하지만 둘 다 완전한 솔루션은 아닙니다.
다음 스크립트는 이러한 오류를 제거하는 데 도움이 됩니다.
ldconfig: File /usr/lib/libsvn_repos-1.so is empty, not checked.
스크립트:
LANG=en_EN ldconfig 2> err.txt
for file in $(cut -d" " -f3 err.txt)
do
echo $file
pacman -S $(pacman -Fq $file) --noconfirm --overwrite "*"
done
파일 데이터베이스를 쿼리합니다. 이 작업을 통해 특정 파일을 소유한 패키지를 찾거나 특정 패키지가 소유한 파일을 표시할 수 있습니다. 동기화 데이터베이스의 일부인 패키지만 검색합니다. 아래 파일 옵션을 참조하세요.