为什么软件中心不允许多个下载?

我在想为什么软件中心不能一次性下载所有请求的应用程序,并在它们完成下载后逐个安装。 或者为什么软件中心不能在一个应用程序安装时同时下载另一个应用程序。

可能只是为了节省带宽... - drnessie
1据我所知,sudo apt-get install 可以安装任意数量的软件包。你需要知道软件包的名称。 - sagarchalise
1@drnessie 不是这样的!如果你同时使用apt-get安装两个软件,你会同时下载它们,然后逐一安装。 - Alvar
@Alvar 好的。我在Linux Mint上已经做到了。但是在Ubuntu上尝试同样的操作却不起作用。怎么办? - MycrofD
@MycrofD 你在尝试什么? - Alvar
你是说想要同时使用两个终端下载两个软件,对吗? - MycrofD
7个回答

这是一个很好的问题。原因是它基于与apt-get和其他工具相同的软件包工具。这些工具的设计方式是期望您提供要安装的所有软件包,然后剩下的就是自动完成的。在大多数情况下,这非常好用,但对于软件中心来说,会引发一些问题。您要么需要先选择要安装的软件包,然后点击按钮来下载和安装它们,要么您必须将应用程序排队,然后逐个下载和安装。如果您只安装一个应用程序,这样的用户体验要好得多,而不必进行额外的点击,但当您“购物”时,这也会变得很烦人。
这是可以解决的,所以我预计在未来会有所改善,但这意味着需要重新创建或重写现有的工具,所以我认为它的优先级不会很高。
让我详细说明一下:
一个软件包可能依赖于其他软件包。如果这些软件包不可用,那么该软件包就无法安装。因此,像apt-get这样的工具会首先下载您请求的所有软件包以及它们所依赖的所有软件包,然后再安装它们。因此,通常您会一次性提供所有想要的软件包,它们会先被下载,然后再安装。
当您选择在软件中心安装应用程序时,通常希望它立即开始下载和安装。但为了确保一切井然有序,一次只能进行一个安装。因此,当您安装一个应用程序时,必须等待该应用程序完全下载和安装完成,然后才能开始下一个下载和安装。
这个问题可以通过不使用apt-get来安装软件包,而是手动下载软件包,然后在准备好后使用dpkg来安装来解决。虽然您仍然无法同时安装两个软件包,但您可以在之前已经开始的安装完成时开始下载新的软件包。在某些情况下,这将节省相当多的时间,所以这是一个好主意。但在大多数情况下,这并不重要,因此更好将精力集中在其他方面。

实际上,apt-get可以下载软件包而不安装它们,尽管我不能百分之百确定这是否适用于锁定的数据库... - JanC
Linux Mint同时下载和可能的安装功能。但在Ubuntu上不行。 - MycrofD
2@MycrofD:我不太清楚那个评论的意图是什么。在Ubuntu上,你当然可以同时下载多个软件包,只是不能通过apt-get及其相关工具来实现。这显然与你所提到的Linux发行版无关。 - Jo-Erlend Schinstad

你只能使用sudo apt-get install一次安装一个软件包,但是你可以用一条命令安装多个软件包。像这样:
  • sudo apt-get install ubuntu-desktop lubuntu-desktop
这将按照正确的顺序安装ubuntu-desktoplubuntu-desktop以及它们所需的任何依赖项。
另外,当你使用sudo apt-get upgrade更新系统时,你首先下载所有软件,然后逐个安装软件包。 原因
为什么不能同时安装多个软件包呢?因为同一时间只能有一个实例使用apt-get权限。这是因为apt-get软件源上加了锁,阻止其他命令使用它们。

一个例子
假设您像@Rinzwind所说的那样以2个单独的apt-get方式启动,那么理论上您至少可以在使用它查找和安装新软件的同时编辑源列表。这可能会导致您安装的程序编辑源列表并同时添加不安全的存储库,而您正在升级系统。这可能是一个安全问题。

另一个例子
如果您在2个单独的命令中编辑源列表,那么当您保存时,您将替换最新版本,这将是最后保存的版本。这意味着中间的命令将没有任何效果,因为您将覆盖旧版本。


Windows在使用“官方”(MSI)安装程序时的行为类似。
即使在Windows中,多个软件也可以同时安装...这样做有什么优势或者为什么在Linux/Ubuntu等系统中这是必要的呢?
使用官方Windows安装程序(MSI)的软件包一次只能运行一个实例。这是因为MSI安装程序数据库类似于sources.list、dpkg信息文件等——你不希望有多个安装程序同时修改/锁定它们。
但是很多Windows软件包使用第三方安装程序,如Installshield、NSIS等,它们可以同时运行,因为它们不需要访问/修改MSI数据库。同样,在Linux/Ubuntu中,没有人会阻止你同时运行apt-get、tar -xzf和perl/bash安装脚本 :)

1如果我没有错的话,许多应用程序可以同时使用sudo运行,但是在软件包管理方面,一次只能有一个这样的应用程序安装或删除软件包,因为运行apt会对sources.list文件加锁,因此如果尝试运行任何其他软件包管理应用程序,它将无法锁定该文件,因此无法运行。 - Kushal
@Kush 只能使用 apt-get,抱歉,我很久没有遇到这个错误了。 - Alvar
@Rinzwind 这是你的意思吗?:) - Alvar
2@Alvar: 在底部增加了类似的Windows行为:不希望人们错误地认为Windows在某种程度上“更优越” ;) - ish
@izx 哦,那是正确的观点。 - Alvar
1@Alvar...非常感谢!!这解决了我的基础问题.. ;) - Nirmik

首先,要知道这个答案是我从使用dpkg和apt的经验中获得的。我没有查看实际的软件中心代码来确定这一点。
这是底层软件设计的限制。
Ubuntu用于软件包的dpkg系统的一部分包括一个功能,即“锁定”/ var/lib/dpkg/lock文件,以防止多个dpkg(apt-get和Ubuntu软件中心是前端)覆盖自身和其他坏事情。
安装软件时会发生什么?发生的是它启动sudo apt-get install chromium-browser(以Chromium为例)。
然后发生了锁定。一旦添加了一个以上要安装的软件包,下一步会等待第一个完成后才开始下一个apt命令。

一些操作,比如刷新菜单、索引字体和重新配置库,只需要在同时安装所有软件包时执行一次。 第二个优点希望不会经常发生,但如果您想安装互斥的软件包,您可以在下载它们之前就知道。 最后一个优点在同时安装或升级多个软件包时非常重要:如果需要回答问题,它们将在安装过程中依次出现。这样,您可以继续工作,而不是每隔5分钟被不同的问题打扰。

你提出了一些有趣的观点。 :) - Jo-Erlend Schinstad

两个 apt-get 实例无法同时运行的原因是该应用程序正在读取/写入系统操作所必需的几个关键文件。当一个 apt-get 操作读取或写入一个文件时,另一个 apt-get 操作也在对该文件执行相同的操作将导致错误配置和/或文件损坏的问题。因此,当进行 apt-get 操作时,它会“锁定”所需的文件,以防止同时执行其他操作,也就是说,它会引发一个标志,告诉其他操作这些文件当前正在使用中。
然而,通过使用 apt-fast 命令,可以实现 apt 所需文件的同时下载(或从多个源下载)。

https://github.com/ilikenwf/apt-fast


一次安装多个文件的简单方法,请按照以下步骤进行:

  1. 复制所有的安装文件夹,例如:/home/user/apps
  2. 打开终端并输入:

    CD /home/user/apps

  3. 然后再次输入:

    sudo dpkg -i *.deb

等待安装完成。


1这仍然是逐个安装.deb文件。这不是OP所要求的——他想要同时安装多个.deb文件。 - ish

你可以在另一个终端(例如terminal1)安装的同时下载这个软件包。
sudo apt-get install vlc

然后在另一个终端中下载另一个软件包。
sudo apt-get download openssh-server

要查看apt-get的其他可用选项,请参考它的man手册。只需简单地输入即可。
apt-get <press tab on your keyboard>

这并没有回答问题。 - guntbert
@guntbert 我是在回答他问题的第二部分,他说:“或者为什么软件中心在安装一个应用程序时不能下载另一个应用程序”,我觉得他在断言在安装一个应用程序时无法下载另一个应用程序,这是错误的。 - marengz

  • 相关问题