apt-get install 背后做了什么?

apt-get install 背后做了什么?

该命令起什么作用apt-get install ...

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

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

出现此问题的原因是,最近我尝试使用 安装 tomcat7 apt-get install tomcat7。一切正常,直到我安装tomcat7-admin(管理器 Web 应用程序)时,服务器才对任何请求没有响应。我尝试了很多次,但总是发生这种情况。

答案1

主要是apt-get做以下事情:

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

dpkg将要:

  • 解压软件包并将内容复制到正确的位置,并检查其中是否存在预先存在的文件及其修改,
  • 跑步软件包维护者脚本: preinstpostinst, (如果软件包正在升级,则在此之前为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

答案2

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

更长:

准备工作:

来自手册页

还将检索并安装指定安装的软件包所需的所有软件包。

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

第一个软件包没有其他依赖项,因此不需要为它们安装其他软件包。这样,其他软件包(以前有依赖项)现在不再有依赖项。系统会不断重复此过程,直到安装指定的软件包。

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

软件包安装:

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

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

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

有一张有趣的图,展示了安装新包的过程:

安装

还有更多的控制文件,最重要的是以下这些:

  • control: A列表依赖关系,以及其他有用的信息来识别包
  • conffiles: A列表配置文件(通常是/etc
  • debian-binary:包含 deb 包版本,目前为 2.0
  • md5sums:包中每个文件的 md5sum 列表,用于验证
  • templates:包含错误描述和对话框安装期间

答案3

对于实际引擎盖下 你需要获取 Apt 源。如果你启用了源存储库,则相当简单:

apt-get source apt

命令apt-get本身位于 中cmdline/apt-get.cc。虽然读起来很麻烦,但apt-get的大多数操作都在那里详细说明。但是,安装是通过DoInstall中的函数进行映射的apt-private/private-install.{cc,h}

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

我只是粗略地看了看,但即使这样,我也看不出这实际上与系统有什么关联dpkg。其中一些似乎是自动配置的,apt-pkg/aptconfiguration.cc但这是一个很深的坑。你可能要花几天时间才能解开这个谜团。

不过源文档还是不错的。你可以做更糟糕的事情,而不是浏览每个文件并阅读标题来弄清楚实际发生了什么。

答案4

这里有一些很棒的答案,比这个简短的答案更好,但你可以考虑一些可以帮助你更好地理解包管理器所做的更改的东西Docker。您可以使用比较容器中所做的更改docker diff <container>,它会显示所有更改。这对于深入了解apt-get install系统内部情况非常有用。快速搜索将帮助您一些 资源以帮助实现这一目标。

相关内容