如何删除 RHEL 及其衍生产品的所有已安装的弱依赖包

如何删除 RHEL 及其衍生产品的所有已安装的弱依赖包

我知道设置install_weak_deps=False进去后/etc/dnf/dnf.conf可以让你以后使用dnf安装程序时不安装弱依赖包。

但是,在设置此选项之前如何列出所有已安装的软件包?

我想删除整个系统中作为弱依赖项安装的所有软件包。

答案1

如果包 A 在不存在依赖项 B 的情况下仍能正常工作,则只能在包 A 的规范文件中使用弱依赖项。这意味着软件包 A 只是“建议”安装软件包 B。

无法可靠地确定包 B 是否曾是弱依赖性(因此被 A 拉入)B已经安装好了。除非您有权访问完整的 yum/dnf 日志文件并且愿意仔细研究它们!

这是因为 B 可能是手动安装的,或者作为包 C 的弱依赖项,或者包 D 的硬依赖项(“require”)。

答案2

你无法获得精确的列表。

但是,您可以通过一些相对简单的脚本进行消除来获得合理的近似值。

dnf repoquery --userinstalled将列出从 DNF 角度手动安装的所有软件包(这与实际上出于多种原因手动安装,但它与我们的目的并不特别相关)。

dnf repoquery --installed列出所有已安装的软件包。

dnf repoquery --requires pkg列出 的硬依赖项pkg

dnf repoquery --whatprovides pkg可以将上述命令的输出转换--requires为特定的包。

使用这四个命令,您可以使用以下 shell 脚本生成所有未手动安装且未显式依赖的包的大致列表:

#!/bin/bash

# Get the list of all installed packages
installed="$(dnf repoquery --installed)"

# Generate a list of all hard dependencies by iterating over each dependency of each installed package.
required=""
for pkg in ${installed}; do
    for dep in $(dnf repoquery --requires "${pkg}"); do
        required="${required}\n$(dnf repoquery --whatprovides "${dep}")"
    done
    # Remove any duplicates from the list of hard dependencies (done each time we finish a package’s dependencies to minimize memory usage).
    required="$(echo "${required}" | sort -u)"
done

# Iterate over each manually installed and explicitly required package, removing them from the list of all installed packages
notrequired="${installed}"
for pkg in $(dnf repoquery --userinstalled) ${required}; do
    notrequired="$(echo "${notrequired}" | grep -v "${pkg}")"
done

# Print the final list of packages that are not required.
echo "${notrequired}"

不幸的是,这将需要一段时间长的运行时间(即使是全新安装,也需要几分钟的时间),并且可能会使用相当多的内存。它最终打印出的软件包列表是 DNF 认为您自己没有安装的所有内容,这也不是任何已安装软件包的硬依赖项。这不是确切地与作为软依赖项安装的软件包列表相同,因为:

  • 有些东西最初可能是作为软依赖项引入的,但要么是后来手动安装的,要么是后来安装的包的硬依赖项。
  • 您实际上可以更改 DNF 认为给定的软件包是手动安装还是自动安装。
  • 可能导致通过安装一个组来拉入的软件包也被列出(我不确定,因为我只是不使用组)。

相关内容