为什么 apt-get 需要 sudo?

Pat*_*ime 19 apt

这可能是一个愚蠢的问题,但我最近意识到我不知道为什么apt-get 没有单用户功能。

我不是在寻找答案:

  • “这是因为 apt 写入系统级目录”。这是表面的原因,但我正在寻找更深层次的原因。是否有一些东西从根本上阻止了单用户环境(la pip + virtualenv)?
  • “您可以从源代码构建”。这是一种解决方法,但没有解决我的问题。我不想解决短期问题,无论如何我在我的所有机器上都有 root 访问权限。

Bra*_*iam 13

为什么 apt-get 需要 sudo?

不总是。你可以完美地使用apt-get没有sudo. 有些情况下您根本不需要sudo,例如使用apt-get downloadwhich 将包下载到当前目录apt-get source将 debian 源文件下载到当前目录,changelog下载并打印给定包的更改日志,以及任何具有在--simulate/ --dry-run/ --no-act(在的情况下install,你也需要--no-download)。

这是因为这些操作/命令不需要写入系统目录。

现在,为什么apt-get需要sudo?其实不然。您可以放弃 apt-get,下载一个软件包,wget然后dpkg --extract在您喜欢的任何目录中使用和解压缩该软件包。还有--instdir哪些应该只适用于二进制包。

现在,为什么这不是默认值?因为这是一种痛苦。为了做您想做的事,我们需要将每个包裹重新包装两次,一次以正确的方式,另一次以做您想做的。在构建时,二进制文件通常需要知道它们需要的文件和库在哪里(在某些情况下,这是在编译时硬编码的)。

现在,你可以做什么?只需 chroot 一些环境a la virtualenv,在那里你可以在没有 root 的情况下安装软件包。

总结,这不是 apt-get 的使用方式,我不知道另一个类似于 apt-get 的包管理器允许您这样做。归根结底,apt-get它只是 dpkg 的一个前端,它可以做一些这样的事情。


tho*_*ter 7

这不是一个愚蠢的问题。

您要问的是,为什么 Apt在系统级别安装软件,而这需要超级用户权限?为什么它不能有选择地在用户级别安装软件,不需要这样的权限?

简短而圆滑的回答是,这不是 Apt 的职责。Apt 的作用是管理和安装构成系统一部分的软件。如果您想在用户级别安装软件,您可以自己安装,但不能使用 Apt。您可以自己编译它,或者从某个地方获取静态编译的二进制文件,或者使用诸如 flatpak 之类的东西。或者使用您自己的部署方法。

阿普特的角色

Ubuntu 是一个 Linux 发行版。Linux发行版的核心是来自许多不同来源的软件的集合,所有这些软件都被发行版的管理者收集到一个地方,以便您可以从中安装一个完整的、可工作的系统。

为了实现这一点,发行版不能只是让软件完全未经修改地可用——对于构成系统一部分的每个软件,它必须以特定的方式将其“安装”到系统中,以便它与其他软件一起正常工作该系统上的软件。

像 Ubuntu 这样的发行版维护着构成该系统的软件存储库。存储库由许多软件包组成,它们是系统的离散部分,可以单独选择和安装。每个此类软件包都以允许将其安装到工作系统中的方式布置其中的软件,因此所有软件和支持文件都已位于它们将驻留在目标系统上的目录路径中。除此之外,该软件包还附带执行任何其他所需工作的安装、配置和/或卸载脚本。

包内文件的布局以及包中的安装/配置/卸载脚本都假设该包将是整个系统的一部分。因此,将单个包安装到其他地方并不容易,因为包的脚本和布局不是为此设计的。

除此之外,系统中的包经常被其他包依赖。而且,如果某个包中的软件依赖于另一个包,则必须将其放置在文件系统中的正确位置,并且在许多情况下必须运行安装和配置脚本以确保其已安装正确。

Ubuntu 和 Debian 上安装软件包并运行其安装/配置/卸载脚本的工具称为 DPKG。但是,在存储库中查找包并确保所有依赖于其他包的包也已安装的工具称为 APT。

从这里可以看出,软件分发堆栈的每个部分都经过设计,以便将软件安装到可预测的位置,以便它可以作为系统的一部分工作,并且软件可以依赖于其他软件的存在,并且很快。

像 Ubuntu 这样的操作系统在作为系统一部分提供的软件和用户自己安装的软件之间有非常明显的区别。这种区别甚至内置于文件系统层次结构标准 (FHS) 中,该标准规定了 Linux 发行版(以及类 UNIX 操作系统)如何布局其软件。用户安装的软件将进入系统上的单独目录,例如

  • /opt - 适用于不属于操作系统但由其他供应商提供的系统范围软件
  • /usr/local/* - 对于系统管理员手动安装的系统范围软件,它不是操作系统的一部分
  • 主目录 - 用于最终用户在其用户帐户中安装的软件,而不是系统范围内的软件

除了上述目录之外,如果有理由构建自己的目录方案而不使用上述目录,也可以使用其他目录。

还有哪些其他选择?

如果您自己编写软件或从上游源获取软件并自行调整,您可以修改您的软件以将其安装在您喜欢的位置并按照您喜欢的方式工作。所以这总是一个选择。

如果您想使用操作系统(或其他 Linux 发行版)的软件包,但将它们安装在其他位置,则可以使用各种技巧从软件包中获取软件并执行此操作。但是,这样做的成功程度将取决于包的编写方式、其安装和配置脚本的工作方式、包中的依赖项如何工作等等。

您可以使用容器化(使用 chroot)来安装到某个目录中,甚至可以在该目录中运行单独的 Apt 副本。然后,您基本上就在操作系统的目录中拥有了一个精简版的 Linux 发行版。

Snap 或 Flatpak 等技术就采用了类似的技术,这也是它们在安装软件的方式和地点方面非常灵活的原因。