dpkg -l
仅显示实际安装的软件包的一小部分(Ubuntu 22.04)。
有没有办法重新创建已安装软件包的列表?
背景:
尝试安装 vinagre 后发生这种情况。安装崩溃,导致未完全安装或配置的软件包。通过救援系统解决问题时,似乎已安装软件包的数据库被覆盖了。
vinagre 崩溃损坏了我重新安装的一些软件包,例如 python3、systemd、systemd-timesyncd。似乎只有这些重新安装的软件包才会列出dpkg -l
。
因此,对于大多数实际安装的软件包,我不再获得任何更新apt update
。
如果没有办法恢复软件包列表,我可以通过重新安装所有软件包来重新创建已安装软件包的列表。
是否有一个扫描器可以循环遍历可用的包并在本地系统上搜索它们的文件?
或者是否有一个通常安装的软件包列表?例如,openSuSE 的 YAST 有一组要安装的软件包模式,例如基础、笔记本电脑、网络和服务器
我知道如果一切都失败了,我可以点击 Synaptic 中的所有包并猜测可能安装了什么,但我不太愿意这样做。
编辑:我为解决这个问题所做的事情:
首先,我必须处理已接受答案中的混乱部分。我发现这/var/backups/dpkg.status.0
已经有近 4 周的历史了,尽管我几乎每天都更新软件包。我认为状态是在我升级到 Ubuntu 22.04(从 21.10)之前的状态。我使用 Meld 进行合并/var/lib/dpkg/status
,/var/backups/dpkg.status.0
保留较新的条目并添加较旧的条目。
之后我尝试了简洁的部分。
sudo dpkg --verify
发现有很多关于丢失软件包的投诉,我尝试了apt install
,如果找不到它们,就用 删除apt remove
。最后我做了一个sudo apt update
并更新了 1000 多个软件包。
我会看看这是否有帮助,但至少/var/lib/dpkg/status
似乎比以前更好地反映了当前的系统。
@raffa 的提示/var/backups/dpkg.status.0
真的很有帮助。谢谢你的帮助。
答案1
整洁的部分
如果没有办法恢复软件包列表,我可以通过重新安装所有软件包来重新创建已安装软件包的列表。
dpkg
状态/数据库有多个副本/备份(自动) 。
是否有一个扫描器可以循环遍历可用的包并在本地系统上搜索它们的文件?
有一个更高效的日志文件,/var/log/dpkg.log
其中包含曾经处理过的软件包dpkg
及其状态,如果您使用类似方法过滤该文件,grep “install”
则会获得安装的所有软件包的列表dpkg
。
或者是否有一个通常安装的软件包列表?例如,openSuSE 的 YAST 有一组要安装的软件包模式,例如基础、笔记本电脑、网络和服务器
是的,一个元包ubuntu-desktop
。
我知道如果一切都失败了,我可以点击 Synaptic 中的所有包并猜测可能安装了什么,但我不太愿意这样做。
不需要这样做,有dpkg
选项可以修复数据库损坏。
有没有办法重新创建已安装软件包的列表?
(您的意思是验证/检查数据库/文件是否仍然在那里)是的,在大多数损坏情况下。
首先,您需要运行:
sudo dpkg --configure -a
然后运行:
sudo dpkg --verify
然后运行:
sudo dpkg --audit
最后,运行:
sudo apt update
从男人dpkg
:
- 配置package...|-a|--pending 配置已解压但尚未配置的软件包。如果给出 -a 或 --pending 而不是 package,则将
配置所有已解压但尚未配置的软件包。-V,--验证[package-name...] 通过将软件包安装的文件信息与存储在 dpkg 数据库中的文件元数据信息进行比较,验证 package-name 或所有软件包(如果省略)的完整性(自 dpkg 1.17.2 起)。数据库中文件元数据信息的来源是二进制软件包本身。在安装过程中,软件包解压时会收集该元数据。
目前唯一执行的功能检查是针对文件数据库中存储的值对文件内容进行 md5sum 验证。只有当数据库包含文件 md5sum 时才会进行检查。要检查数据库中是否有任何缺失的元数据,可以使用 --audit 命令。
-C,--审计[package-name...] 对 package-name 或所有软件包(如果省略)执行数据库健全性和一致性检查(自 dpkg 1.17.10 起按软件包检查)。例如,搜索系统中仅部分安装的软件包或缺少、错误或过时的控制数据或文件的软件包。dpkg 将建议如何处理它们以进行修复。
混乱的部分
最后,如果上述方法不起作用,则dpkg
数据库(状态)已严重损坏,无法修复,甚至是空的或丢失的。在这种情况下,首先备份您拥有的任何内容(如果有),如下所示:
sudo mv /var/lib/dpkg/status /var/lib/dpkg/my-old-status
然后,尝试/var/lib/dpkg/status-old
如下恢复:
sudo cp /var/lib/dpkg/status-old /var/lib/dpkg/status
该文件保存着最近的副本(大约一天前)。
如果未成功,则查看/var/backups/
以下内容:
ls -lh /var/backups/ | grep status
首先恢复最新的一个,dpkg.status.0
如下所示:
sudo cp /var/backups/dpkg.status.0 /var/lib/dpkg/status
然后查看情况如何,如果需要,请.gz
逐一恢复旧备份(这些是压缩文件,因此请先提取/解压缩它们),直到恢复正常(运行时没有错误sudo apt update
)
status
请注意,如果仅恢复不足以解决问题,其他相关文件也将被备份并可能被恢复。您可以使用以下命令列出它们:
ls -lh /var/backups/ | grep dpkg
要了解您缺少什么,以下是通常位于的文件和目录/var/lib/dpkg/
:
$ ls -lh /var/lib/dpkg/
total 5.4M
drwxr-xr-x 2 root root 4.0K Jun 11 12:41 alternatives
-rw-r--r-- 1 root root 11 Jan 8 02:35 arch
-rw-r--r-- 1 root root 178K Aug 19 2021 available
-rw-r--r-- 1 root root 8 Aug 19 2021 cmethopt
-rw-r--r-- 1 root root 616 Jan 8 02:38 diversions
-rw-r--r-- 1 root root 671 Jan 8 02:38 diversions-old
drwxr-xr-x 2 root root 436K Jun 16 10:54 info
-rw-r----- 1 root root 0 Jun 16 14:36 lock
-rw-r----- 1 root root 0 Jun 16 14:36 lock-frontend
drwxr-xr-x 2 root root 4.0K Mar 23 2020 parts
-rw-r--r-- 1 root root 270 Jan 8 13:40 statoverride
-rw-r--r-- 1 root root 309 Jan 8 13:40 statoverride-old
-rw-r--r-- 1 root root 2.4M Jun 16 10:54 status
-rw-r--r-- 1 root root 2.4M Jun 16 10:54 status-old
drwxr-xr-x 2 root root 4.0K Jun 11 12:40 triggers
drwxr-xr-x 2 root root 4.0K Jun 16 14:36 updates
肮脏的部分
如果你到了这里,你很可能已经没有主意/选择了,正准备重新安装 Ubuntu...让我们达成一致第一的;我不认识你,你也不认识我(你完全靠自己)... 这是一件肮脏的事(你的),你应该独自处理它:)... 前面的过程将解析/var/log/dpkg.log
(假设你还没有炸毁它)转换为包名称并将它们提供apt
给重新安装...dpkg
即使它严重受损(确实如此),这也应该重建您的状态/数据库... 如果你有其他选择,请立即选择...“别无选择”...让我们开始吧:
按照相同的顺序逐一运行上面整洁部分中的所有四个命令(再次)。
重新安装据称(假设你没有安装然后删除一个或多个包) 通过将内容解析为
/var/log/dpkg.log
包名称并将它们提供给已安装/半安装的包,apt install -y
如下所示(这是可行的,但不是最佳的...我强烈建议你改进它,如果你可以名词):awk -F' |:' '/installed/ { if ( !seen[$7]++ ) print $7 }' /var/log/dpkg.log | xargs sudo apt install -y
处理错误(哦是的,会有错误),修复它们并重新开始,直到所有包都安装并且没有错误...祝你好运(你会需要它)。