Arch Linux:系统升级过程中断电后重新安装所有损坏的软件包

Arch Linux:系统升级过程中断电后重新安装所有损坏的软件包

系统升级过程中出现断电(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 的参数。使用时,pacman 将绕过与 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

吃豆人-F

查询文件数据库。此操作允许您查找拥有某些文件的包或显示某些包拥有的文件。仅搜索属于同步数据库一部分的包。请参阅下面的文件选项。

相关内容