什么是依赖项?
依赖项被定义为程序需要正常工作的文件、组件或软件包。 我们安装的几乎每个软件包都依赖于另一段代码或软件才能按预期工作。 因为 Linux 的总体主题一直是让程序做一件特定的事情,并且做得很好,所以许多软件标题利用其他软件来正确运行。
介绍
让我们回顾一下什么是依赖项以及为什么需要它们。 当我们安装软件时,我们都曾在某一时刻从我们的系统中看到一条关于“缺少依赖项”的消息。 此错误表示软件包的所需部分已过时、不可用或丢失。 让我们回顾一下当我们在 Ubuntu 上遇到这些问题时如何解决这些问题。
安装依赖项
Ubuntu 使用 apt(或 Advanced Package Tool)进行软件包管理。 大多数时候,每当您在 Ubuntu 上看到安装某些东西时,您都会看到使用 apt-get 命令。 apt-get 的主要任务是从存储库中检索信息和包,其中包含用于安装、升级和/或删除包及其依赖项的安全、经过身份验证的软件源。
这是 apt-get 的语法:
root@host:~# apt-get [options] command
或者
root@host:~# apt-get [options] install|remove pkg1 [pkg2 ...]
或者
root@host:~# apt-get [options] source pkg1 [pkg2 ...]
既然我们知道了 apt-get 是什么以及它的语法应该是什么样子,让我们来看看一些最常用的 apt-get 命令,我们将解释它们中的每一个是如何操纵依赖关系的。
安装软件
因此,假设我们想在我们的服务器上安装 Python。 首先,我们需要安装一个 libpython2.7-minimal 包/依赖项。 我们可以运行这个命令来完成这个。
root@host:~# apt-get install libpython2.7-minimal
我们将得到一个包本身已被找到、解包和配置的输出。 以及有关该软件包将占用的磁盘空间的信息。 如果我们缺少两个依赖项,那么我们可以运行这样的命令来安装这些包。
root@host:~# root@host:~# apt-get install libpython2.7-minimal libpython-stdlib:amd64
现在我们可以使用几乎相同的命令安装 python:
root@host:~# apt-get install python
删除软件
如果我们想删除这个依赖,我们可以运行以下命令。
root@host:~# apt-get remove libpython2.7-minimal
这将删除 libpython2.7-minimal 包以及它拥有的所有相关依赖项。
更新软件
如果您想在任何时候更新服务器上的所有系统包,我们可以简单地运行这个命令。 此命令会更新我们所有的软件,包括任何依赖项。
root@host:~# apt-get update
或者
root@host:~# apt-get upgrade
第二个命令将列出它要安装/更新的所有软件包,并在继续安装之前提示我们选择是或否。 使用此命令,我们确保满足所有依赖项。
列出软件
如果你想列出所有可用的包,我们可以使用这个命令。
root@host:~# apt-cache pkgnames
我们提到这个命令是因为它引导我们进入下一节专门关于依赖关系的部分。 该命令将向我们展示大量可供安装的软件包。 现在,假设我们要安装 libslang2 包,但不确定哪些依赖项需要与此包一起安装,哪些不需要。 我们甚至可能不知道我们需要哪些。 幸运的是,Linux 通过使用 showpkg 标志提供了这个选项。 我们可以运行这个命令来查看需要哪些依赖项。
root@host:~# apt-cache showpkg libslang2
因此,如果我们不确定我们需要哪些依赖项,我们可以简单地运行 showpkg 子命令来获取我们需要的信息。
清理依赖
如果您想清理一些有时会占用我们宝贵磁盘空间的杂物,我们可以使用以下命令来释放额外的磁盘空间。
root@host:~# apt-get clean
root@host:~# apt-get autoclean
这些命令将为我们完成工作,就像在 CentOS 上的 yum clean 和 yum cleanall 命令一样。
clean 标志从 /var/cache 中的本地存储库中删除所有 .deb 文件,除了锁定文件。
autoclean 标志还会从本地存储库中删除所有 .deb 文件,但与 clean 标志不同,它仅删除无法再下载的过时软件包。
未满足的依赖项错误
几乎每个 Ubuntu 用户都看到了错误“以下软件包有未满足的依赖关系问题”。 在这种情况下,失败几乎总是与 apt 包管理器有关,而不是与正在安装的软件有关。 幸运的是,有多种选择可以纠正这种情况。 我们将研究解决这个问题的几种方法。
备份配置文件
首先,与任何系统修改一样,备份我们的配置是必须的。 我们这样做是为了确保出现任何其他问题,我们可以恢复我们为恢复系统文件所做的更改。
root@host:~# cp /etc/apt/sources.list /etc/apt/sources.list.bak
root@host:~# cp /var/lib/dpkg/status /var/lib/dpkg/status.bak
选项
当这些依赖错误发生时,我们有多种选择可以尝试解决这个问题。
- 启用所有存储库
- 更新软件
- 升级软件
- 清理包依赖
- 清理缓存的包
- 删除“保留”或“保留”的包裹
- 将 -f 标志与 install 子命令一起使用
- 使用 build-dep 命令
- 测试安装包
- 重新安装软件
- 删除 PPA
使用 Apt-mark 列出软件包
顺便说一句,当使用 apt-mark showauto 命令时,它会打印每个包的列表,这些包将自动添加到新行中。 如果给出了包名,则只会显示那些将自动安装的包。 我们提到了这一点,因此我们可以注意应该与软件一起安装的软件包。
root@host:~# apt-mark showauto softwarename
选项 1:启用所有 Ubuntu 存储库。
使用此选项将允许从更广泛的软件和依赖项中提取。 然后,一旦更新,我们可以尝试重新安装软件。
root@host:~# add-apt-repository "deb https://archive.ubuntu.com/ubuntu $(lsb_release -sc) main universe restricted multiverse"
root@host:~# apt-get update
选项 2:更新软件
上述命令完成后,我们可以尝试再次更新包。 尝试更新软件应该是我们的第一道防线。
root@host:~# apt-get update softwarename
选项 3:升级软件
接下来,我们可以显示需要升级的包,然后尝试升级软件。
root@host:~# apt-get -u && apt-get upgrade
选项 4:清理包依赖项
损坏的软件包数据库或已损坏或未正确安装的软件包可能会导致此问题。 此选项使用 autoremove 标志来解决此问题。
root@host:~# apt-get autoremove
此命令将仅删除存储库中不再存在的过时或不必要的包。
选项 5:清理缓存的包
此命令将清理下载包的本地存储库。 然后,尝试重新安装软件。
root@host:~# apt-get clean
选项 6:删除“保留”或“保留”包
要定位被挂起或挂起的软件,我们可以使用 apt-mark 命令。 一旦我们有了这些信息,我们就可以使用 remove 和 dry-run 标志来查看将要删除的确切内容。 然后,尝试重新安装软件。
root@host:~# apt-mark showhold
root@host:~# apt-get remove –dry-run softwarename
选项 7:使用 -f 标志
根据 apt-get 手册页,使用 -f(或 –fix-broken)参数将允许 apt-get 命令尝试纠正损坏的依赖关系问题。 使用 -f 时不要在命令中使用包名。
-f, –fix-broken
使固定; 尝试纠正存在损坏依赖关系的系统。 此选项与安装/删除一起使用时,可以省略任何包以允许 APT 推断出可能的解决方案。 如果指定了包,则必须完全纠正问题。
第一次运行 APT 时有时需要该选项; APT 本身不允许损坏的包依赖关系存在于系统上。 系统的依赖结构可能会损坏到需要手动干预(这通常意味着使用 dselect(1) 或 dpkg –remove 来消除一些有问题的软件包)。
在某些情况下,将此选项与 -m 一起使用可能会产生错误。 配置项:APT::Get::Fix-Broken。
https://ss64.com/bash/apt-get.html
root@host:~# apt-get install -f
root@host:~# dpkg --configure -a
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
root@host:~#
如果您看到 0 升级消息,这意味着该命令已失败。 不过,我们还没有完成。 让我们尝试再次发出命令。
root@host:~# apt-get install -f
选项 8:使用 Build-dep 命令
使用这个子命令,我们可以安装 ‘softwarename’ 的所有依赖项。 然后,我们可以尝试单独重新安装软件依赖项。
root@host:~# apt-get build-dep packagename
选项 9:测试安装包
–dry-run 标志向我们展示了 apt-get 在不实际安装软件包的情况下会安装什么。 这对上述命令很有用。 它有时也可以在软件安装之前显示依赖错误。
root@host:~# apt-get install --dry-run softwarename
选项 10:重新安装软件
出现了某些 apt 无法解决的依赖问题和冲突。 发生这种情况时,apt 会将这些包保存在“暂停”状态。 这意味着它们不会被完全安装。 删除这些软件包可能会解决问题,并可能有助于解决原始问题。 apt-get purge 命令将从我们的系统中删除程序、所有关联的配置文件以及任何插件或设置。
root@host:~# apt-get -u dist-upgrade
root@host:~# apt-get --reinstall softwarename
如果输出显示任何包处于“暂停”状态,我们可以继续尝试删除它们。 该命令完成后,运行此命令以
root@host:~# apt-get -o Debug::pkgProblemResolver=yes dist-upgrade
0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.
现在通过每次执行 dist-upgrade 一次删除一个保留的包,直到没有更多的保留包。 之后,尝试重新安装您的软件包。 确保实施 –dry-run 选项,以便随时了解后果:
root@host:~# apt-get remove -dry-run package-name
root@host:~# apt-get remove package-name
root@host:~# apt-get install package-name
选项 11:删除旧 PPA
以下命令删除包、PPA 和相关的依赖项。
root@host:~# apt-get autoremove -purge PACKAGENAME
root@host:~# apt-get install ppa-purge
root@host:~# add-apt-repository -remove ppa:someppa/ppa
root@host:~# apt-get autoclean
最后,我们可以得出一个结论,apt-get 管理依赖的方式与 yum 相同。 我们可以使用 install 子命令安装依赖项,我们可以使用 remove 子命令删除它,使用 upgrade 子命令更新它,等等。
如果您正在使用 Ubuntu 并寻找管理依赖项和软件包的最佳方法,那么 apt-get 是一个不错的选择。 它优于dpkg,并且更加人性化。
如果您对此仍有疑问,请拨打 800.580.4985 联系我们,或打开 聊天 或与我们联系,今天与我们其中一位知识渊博、经验丰富的 Linux 管理员交谈!