重新安装所有Debian软件包


19

我错误地杀死了一个在后台运行的dpkg进程,我想重新安装所有软件包以确保一切正常。

首先,我尝试获取所有软件包的列表并重新安装它们

dpkg --get-selections | grep -v deinstall | awk '{print $1}' > list.log
apt-get install --reinstall $(cat list.log)

但是有些消息像:

E: Couldn't configure pre-depend debconf:i386 for console-setup:i386, probably a dependency cycle.

我尝试了apt-get -f install,但没有成功。

作为最后的选择,我重新安装了所有未通过校验和的程序:

dpkg -l | grep ^ii | awk '{ print $2 }' | xargs debsums -s -a

我应该怎么做才能重新安装所有内容?

编辑:问题解决了。问题是别的(请参阅评论)。我知道Debian应该避免这种情况。


1
我最近在尝试安装软件包时崩溃。当我重新启动并尝试重新安装该软件包时,收到消息“ E:dpkg被中断,您必须手动运行'dpkg --configure -a'来解决问题。”。运行该命令将删除所述软件包及其配置文件。然后,我可以从头开始安装该软件包。尝试执行该命令。
Embedded.kyle

它什么也没做,所以我猜没有什么坏的。稍后,我将尝试检查驱动程序问题是否解决。
alex_reader 2013年

1
重新安装所有软件包==真的是个坏主意。(a)几乎总是没有必要(b)可能会失败(c)如果您的系统确实被严重破坏,只需重新安装它。只需解决您实际遇到的问题即可。
Faheem Mitha

Answers:


9

试试这个,记住,我并没有测试它:

dpkg --get-selections > selections
sudo dpkg --clear-selections
sudo dpkg --set-selections < selections
sudo apt-get --reinstall dselect-upgrade

资料来源:


我的问题完全不同:我没有引导正确的内核(!)。我会接受您的回答,因为它似乎可以满足我的要求(但也未经测试)。
alex_reader 2013年

这将不起作用,并且将完全破坏系统。第3行将卸载apt,因此此后将无法重新安装所有内容。
rkjnsn

@rkjnsn:我更新了答案,检查是否有效。
Marco Sulla 2013年

1
尝试执行此操作,虽然填充了选择文件,但没有重新安装任何东西:pi @ prodpi〜$ sudo apt-get --reinstall dselect-upgrade阅读软件包列表...完成构建依赖关系树读取状态信息...完成0升级,新安装了0个,删除了0个,未升级的还有0个。任何想法?
andig 2014年

我认为您的代码无法使用的原因之一是因为命令dpkg --get-selections列表还会卸载软件包。
Ortomala Lokni 2015年

2

以防万一,请尝试重新安装每个软件包

for i in $(cat list.log); do apt-get install --reinstall "$i"; done

您可能也希望对所有问题选项都选择“是”。


猫:list.log:没有此类文件或目录
IgorGanapolsky

2
@IgorGanapolsky dpkg --get-selections > list.log首先运行。
QwertyChouskie

2
list.log取自问题。
斯蒂芬·基特

2

在卢卡斯·马洛(Lucas Malor)引用的资源之一中,我找到了一个名为populator的脚本,该脚本似乎已经解决了。如果将软件包选择变量设置为所有软件包的列表

PKGLIST=$(dpkg --get-selections | grep -v deinstall| cut -f1)

然后,您可以运行脚本并重新安装所有软件包,但系统可能会出现一些问题。最好先在虚拟机中对其进行测试。

这是上面链接中脚本的一种变体:

#!/bin/bash
#
# Script to pre-populate apt-get proxy for faster later downloads.
# It uses apt-get and wget to pull all the specified packages.
#

# Make sure only root can run our script
if [[ $EUID -ne 0 ]]; then
   echo "You're not root, are you?" 1>&2
   exit 1
fi

# Specify wanted packages
PKGLIST="exaile" 

# Clears out the local repository of retrieved package files
apt-get clean

# Resynchronize the package index files from their sources
apt-get update

# Re-install specified packages at the newest version. 
apt-get install --reinstall $PKGLIST

如果显示错误,提示无法重新安装特定软件包,请运行以下命令以重试:

sudo apt-get -y autoremove

1

请尝试执行此操作,因为它将占用您的输出,并使其成为一行巨大的行,并用空格分隔文件名。

dpkg --get-selections | grep -v deinstall | awk '{print $1}' > list.log awk '$1=$1' ORS=' ' list.log > newlist.log apt-get install --reinstall $(cat newlist.log)

原始帖子的唯一更改是在第二个awk语句中添加,这可能与第一个awk语句内联完成,以创建所需的文件。

此更改将迫使apt-get正确地重新下载软件包以及所有未首次安装的缺少依赖项,并按顺序重新安装它们。

如果我们将其内联,那么我相信它会像这样:

dpkg --get-selections | grep -v deinstall | awk '{print $1}' | awk '$1=$1' ORS=' ' > list.log

然后确保您确实使系统具有正确的软件包(或最新的软件包),清理apt缓存,对其进行更新,然后重新下载所有文件(如果只需要缓存中的内容,则可以跳过前两个步骤重新安装):

apt-get clean && apt-get update && apt-get install --reinstall $(cat list.log)

我在升级的具有挂断功能的系统上安装了超过2k个软件包。使用dpkg --configure -a完成安装(它处于最后阶段)。然后,我运行它以使所有内容正确地重新安装。

或如/superuser/298912/reinstall-debian-while-keeping-installed-packages-and-data所述

sudo apt-get install --reinstall $(dpkg --get-selections | grep -w 'install$' | cut -f1)

只需确保首先运行“ init 2”,然后再进行任何重新安装,因为X的某些组件或您喜欢的窗口管理器可能不喜欢重新安装。


除非您修改了IFS,否则$(cat file)无论文件是由换行符还是空格分隔,未引号都会在任何空格上标记并给出完全相同的结果。--reinstall可能有帮助,但在此之前已经给过两次。
dave_thompson_085

0

使用Aptitude时,有一种简便快捷的方法:

sudo aptitude reinstall '~i'

它将重新安装所有当前安装的软件包。


-1

使用RPM时,如果在软件包数据库中造成损坏,则有一个选项可以重建该数据库,从而使您基本上不必重新安装。正如一位用户在此处指出的那样,这是在Debian中完成的dpkg --configure -a


1
的作用dpkg --configure -a是配置所有未打包和未配置的软件包。见手册页dpkgdpkg-reconfiguredebian.org/doc/manuals/debian-faq/ch-pkg_basics.en.html
Ortomala Lokni
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.