apt-get install 在幕后做了什么?

Tru*_*gDQ 64 apt software-installation

什么是apt-get install ...命令吗?

当我输入apt-get install ...命令时,屏幕上会出现一些文本,但这对我来说没有足够的信息。我想知道是否创建/编辑了任何文件,启动了任何服务以及其他活动...

运行.sh时有没有执行文件apt-get install ...?如果是这样,我如何才能看到该sh文件的内容?

这个问题的原因是最近我试图用apt-get install tomcat7. 一切正常,直到我安装tomcat7-admin(管理器 Web 应用程序),服务器对任何请求都没有响应。我试了很多次,这总是发生。

mur*_*uru 53

大多数情况下,apt-get执行以下操作:

  • 检查依赖项(并要求安装它们),
  • 下载包,验证它,然后告诉dpkg安装它。

dpkg 将要:

  • 解压缩包并将内容复制到正确的位置,并检查预先存在的文件和对它们的修改,
  • 运行包维护者脚本: preinst, postinst, (以及prermpostrm在这些之前,如果包正在升级)
  • 根据触发器执行一些动作

您可能对维护者脚本感兴趣,它们通常位于/var/lib/dpkg/info/<package-name>.{pre,post}{rm,inst}. 这些通常是 shell 脚本,但没有硬性规定。例如:

$ ls /var/lib/dpkg/info/xml-core.{pre,post}{rm,inst}
/var/lib/dpkg/info/xml-core.postinst
/var/lib/dpkg/info/xml-core.postrm
/var/lib/dpkg/info/xml-core.preinst
/var/lib/dpkg/info/xml-core.prerm
Run Code Online (Sandbox Code Playgroud)


cha*_*aos 32

简而言之apt-get install执行您的系统可以成功执行新安装的软件应用程序所需的一切。

更长:

预赛:

联机帮助页

指定用于安装的包所需的所有包也将被检索和安装。

这些包存储在网络中的存储库中。因此,apt-get将所有需要的下载到一个临时目录 ( /var/cache/apt/archives/) 中。它们将从网络或 ftp 服务器下载。它们在所谓的sources.list; 存储库列表。从那时起,它们会按程序一一安装。

第一个是那些没有进一步依赖的;因此无需为它们安装其他软件包。通过这个,其他包(以前有依赖关系)现在不再有依赖关系。系统会一遍又一遍地执行该过程,直到安装了指定的软件包。

每个包都经过一个安装过程。

包安装:

在基于 Debian 的 Linux 发行版中,如 Ubuntu,这些软件包采用指定的标准化格式,称为: deb - Debian 二进制软件包格式

这样的包包含要安装在系统上的文件。它们还包含一个控制文件。该文件包含打包系统应在特定情况下执行的脚本;所谓的维护者脚本。这些脚本分为:

  • preinst: 在将文件安装到系统文件层次结构之前
  • postinst: 安装后
  • prerm: 卸载前
  • postrm: 卸载后

有一张有趣的图片,显示了安装新软件包的过程:

安装

还有更多的控制文件,最重要的如下:

  • control:依赖项列表和其他用于识别包的有用信息
  • conffiles:配置文件列表(通常是 中的那些/etc
  • debian-binary: 包含 deb-package 版本,目前是 2.0
  • md5sums: 包中每个文件的 md5sum 列表,用于验证
  • templates:安装过程中包含错误描述和对话框的文件


Oli*_*Oli 12

对于实际的底层 内容,您需要获取 Apt 源。如果您启用了源存储库,则相当简单:

apt-get source apt
Run Code Online (Sandbox Code Playgroud)

apt-get命令本身住在cmdline/apt-get.cc。通读一遍很痛苦,但大部分apt-get操作都在那里得到了相当广泛的阐述。然而,安装是通过一个DoInstall位于apt-private/private-install.{cc,h}.

您必须记住 apt-get 只是硬币的一面。
dpkg正在处理实际安装,但DoInstalldpkg直接了解。apt-get实际上令人惊讶的是包管理器不可知。所有功能都通过抽象apt-pkg/package-manager.cc

我只是简单地看了一下,但即使在那里我也看不到它实际连接到dpkg系统的位置。其中一些似乎是通过自动配置的,apt-pkg/aptconfiguration.cc但这是一口深井。你可以花几天时间来解开这个。

不过源文档很好。你可以做比浏览每个文件并阅读标题以找出实际发生的事情更糟糕的事情。


小智 8

这里有一些很棒的答案,比这个简短的答案要好,但是您可能会考虑使用Docker来帮助您更好地了解包管理器所做的更改。您可以使用 diff 在容器中所做的更改docker diff <container>,它会向您显示所有更改。这对于深入了解系统的内部情况特别有用apt-get install。快速搜索将为您提供一些 资源来帮助实现这一点。

  • 谢谢你提出你的观点。在 Docker 容器中,我安装了 Firefox,并在另一个终端选项卡中密切监视容器的差异并了解容器中所有文件的变化。它帮助我更清楚地理解。 (2认同)