由于互联网连接速度限制,我更喜欢离线安装软件包。我通常从安装了相同操作系统的系统获取所需的软件包。但当我以这种方式安装程序时,我的系统上通常会出现损坏的软件包,而以下方法无法修复:
sudo apt-get update
sudo apt-get install -f
有时,最后一个命令想要从我的系统中删除 grub 或一些显然必不可少的软件包!或者执行最后一个命令后我无法安装某些程序,例如:
The following packages have unmet dependencies:
mysql-client : Depends: mysql-client-5.5 but it is not going to be installed
E: Unable to correct problems, you have held broken packages.
我该如何解决此类问题? 有没有办法在以这种方式安装程序之前保存系统状态,并在安装过程不顺利时将系统恢复到之前的状态? 有没有办法手动修复此类问题而不依赖于包管理器?
我希望在 Ubuntu 中能够像在 Windows 中一样安装彼此隔离的程序。
答案1
首先,您提到 Windows 中不存在这种情况。您其实错了 - 在 Windows 中,软件的依赖项也需要下载。
现在来谈谈您的问题。尝试从离线状态安装所需的所有软件包的问题在于您无法修复依赖关系问题。它们apt
所做的就是拉取所有依赖项的列表,确定需要安装哪些,然后尝试安装它们。如果无法安装依赖项,则失败。
你举了mysql-client
一个例子。这是一个元包,因为它引用了其他软件包,并且不包含任何实际的可执行文件。它还依赖于 的特定版本,mysql-client
并且需要下载它们。
对于离线盒子来说,没有真正的方法可以避免这种情况。唯一真正避免此问题的方法就是将您的盒子连接到带有 Debian 镜像或互联网访问的网络,并设置防火墙规则以限制出站流量仅有的到达更新服务器。
答案2
你没有说如何安装你下载的软件包。如果你只是.deb
从其他系统获取文件,那么我敢打赌你正在直接dpkg --install
安装.deb
。
正如您现在已经发现的,dpkg
无法像apt
can 那样解决和处理依赖问题。
“回滚”更改的一种方法是apt-get
使用消除您尝试安装的软件包。
你可以尝试的一件事是dpkg-离线(免责声明:这是我写的)。在您的在线系统上,获取离线系统上 Ubuntu 版本的 ISO。运行dpkg-offline
指示您要安装哪些软件包。它将用于apt-get
下载软件包及其所有依赖项,并为您提供一个 tarball,其中包含一些辅助脚本,可在离线系统上运行。它将为这些软件包添加一个“离线”存储库,然后您可以使用它apt-get
并让它解决依赖项。