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

apt-get install ...命令有什么作用?

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

apt-get install ...运行时是否执行了任何.sh文件? 如果是这样,我怎么能看到该sh文件的内容?

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

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

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

dpkg将:

  • 提取包并将内容复制到正确的位置,检查预先存在的文件及其修改,
  • 运行包维护者脚本 : preinstpostinst ,(和prerm ,之前的postrm ,如果正在升级包)
  • 根据触发器执行一些操作

您可能对维护者脚本感兴趣,这些脚本通常位于/var/lib/dpkg/info/.{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 

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

更长:

预赛:

从联机帮助页 :

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

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

第一个是那些没有进一步依赖的; 所以不必为他们安装其他包。 通过它,其他包(以前具有依赖关系)现在已经没有依赖关系了。 系统会一直反复执行该过程,直到安装指定的软件包。

每个包都经过安装程序。

包装安装:

在基于Debian的Linux发行版中,作为Ubuntu,这些包采用指定的标准化格式:deb – Debian二进制包格式 。

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

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

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

安装

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

  • control :依赖项列表以及用于标识包的其他有用信息
  • conffiles :配置文件列表 (通常是/etc 中的配置文件)
  • debian-binary :包含deb-package版本, 目前为2.0
  • md5sums :包中用于validation的每个文件的md5sums列表
  • templates :安装期间包含错误说明和对话框的文件

对于实际的引擎盖下的东西,你需要抓住Apt源。 如果您启用了源存储库,则相当简单:

 apt-get source apt 

apt-get命令本身位于cmdline/apt-get.cc 。 阅读是痛苦的,但大多数apt-get的行为在那里被广泛地阐述。 但是,安装通过DoInstall函数进行映射,该函数位于apt-private/private-install.{cc,h}

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

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

源文档虽然很好。 你可以做更糟糕的事情,而不是浏览每个文件并阅读标题以确定实际发生的事情。

这里有一些很棒的答案比这个简短的答案更好,但你可以考虑帮助你更好地理解包管理器所做的更改是Docker 。 您可以使用docker diff docker diff 容器中所做的更改,它将显示所有更改。 这对于了解一下apt-get install对系统的影响非常有用。 快速搜索将为您提供多种 资源来帮助实现此目的。