首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Arch Linux:在系统升级期间断电后重新安装所有损坏的包

Arch Linux:在系统升级期间断电后重新安装所有损坏的包
EN

Unix & Linux用户
提问于 2021-07-24 13:27:02
回答 3查看 18.3K关注 0票数 11

在系统升级(pacman -Suy)过程中出现了电源故障。所以我有很多破碎的包裹。他们似乎是固定的重新安装与强制覆盖(例如pacman -S systemd-sysvcompat--overwrite "*")。

那么,我的问题是如何将重新安装应用于所有损坏的软件包?

EN

回答 3

Unix & Linux用户

发布于 2021-07-24 15:45:14

假设损坏的包被报告为丢失的文件,则可以使用Qk检查包(来自man pacman):

-k,--检查给定包(S)拥有的所有文件是否存在于系统中。如果未指定包或未提供筛选标志,请检查所有已安装的包。两次指定此选项将对包含所需mtree文件的包执行更详细的文件检查(包括权限、文件大小和修改时间)。

因此,这个命令应该给出系统上损坏包的完整列表(下面的示例是my上的结果):

代码语言:javascript
运行
复制
$ 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

然后,这个命令将只打印包名:

代码语言:javascript
运行
复制
$ 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

您只需遍历该列表并重新安装其中的每一个:

代码语言:javascript
运行
复制
pacman -Qk 2>/dev/null | grep -v ' 0 missing files' | cut -d: -f1 |
    while read -r package; do
        pacman -S "$package" --overwrite "*" --noconfirm
    done

或者,如果列表不是太长,你甚至可以:

代码语言:javascript
运行
复制
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中使用--覆盖选项.--覆盖选项接受一个包含glob的参数.使用时,pacman将绕过文件冲突检查,查找与glob匹配的文件。在维护得当的系统中,只有在Arch开发人员明确推荐时才应该使用它。请参阅#升级系统前请阅读部分。

当然,在您的情况下,您没有一个适当维护的系统,因为在升级期间的电源故障,所以这可能是一个很好的用例。

票数 9
EN

Unix & Linux用户

发布于 2021-07-24 13:58:58

您可以编写一个脚本,循环遍历所有包并重新安装它们。

只需将当前安装的包列表保存到文本文件中即可。

代码语言:javascript
运行
复制
pacman -Qq > packages.txt

并创建脚本:

代码语言:javascript
运行
复制
nano reinstall.sh

#!/bin/bash
for package in $(cat packages.txt)
do
    pacman -S $package --overwrite "*" --noconfirm
done

在此之后,您可以使用

代码语言:javascript
运行
复制
sudo sh reinstall.sh

注:您可能必须键入chmod a+x reinstall.sh才能首先使脚本可执行

票数 3
EN

Unix & Linux用户

发布于 2021-08-15 21:57:16

这两个答案都是有用的,但它们都不是一个完整的解决方案。

下面的脚本有助于消除这样的错误:

代码语言:javascript
运行
复制
 ldconfig: File /usr/lib/libsvn_repos-1.so is empty, not checked.

剧本:

代码语言:javascript
运行
复制
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

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

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/659756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档