问题描述
apt-get install ...
命令有什么作用?
当我输入apt-get install ...
命令时,屏幕上出现一些文本,但是没有足够的信息供我使用。我想知道是否创建/编辑了任何文件,启动了任何服务以及其他活动……
apt-get install ...
运行时是否执行了任何.sh
文件?如果是这样,我怎么能看到sh
文件的内容?
这个问题的原因是最近我尝试用apt-get install tomcat7
安装tomcat7。一切正常,直到我安装tomcat7-admin
(经理Web应用程序),服务器对任何请求都没有响应。我尝试了很多次,这总是发生。
最佳解决方案
大多数情况下,apt-get
执行以下操作:
-
检查依赖关系(并要求安装它们),
-
下载包,验证它,然后告诉
dpkg
安装它。
dpkg
将:
-
提取包并将内容复制到正确的位置,检查pre-existing文件及其修改,
-
运行package maintainer scripts:
preinst
,postinst
,(以及之前的prerm
,postrm
,如果正在升级包装) -
基于triggers执行一些操作
您可能对维护者脚本感兴趣,这些脚本通常位于/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
次佳解决方案
简而言之:apt-get install
可以完成您的系统成功执行新安装的软件应用程序所需的一切。
更长:
预赛:
来自manpage:
All packages required by the package(s) specified for installation will also be retrieved and installed.
这些包存储在网络中的存储库中。因此,apt-get
将所有需要的内容下载到临时目录(/var/cache/apt/archives/
)中。它们将从网络或ftp-server下载。它们在所谓的sources.list
中指定;存储库列表。从那时起,他们逐个程序地逐个安装。
第一个是那些没有进一步依赖的;所以不必为他们安装其他包。通过它,其他包(以前具有依赖关系)现在已经没有依赖关系了。系统会一直反复执行该过程,直到安装指定的软件包。
每个包都经过安装程序。
包装安装:
在Debian-based Linux发行版中,作为Ubuntu,这些包采用指定的标准化格式:deb – The Debian binary package format。
这样的包包含要在系统上安装的文件。它们还包含control file。该文件包含打包系统应在特定情况下执行的脚本;所谓的maintainer scripts。这些脚本分为:
-
preinst
:在将文件安装到系统文件层次结构之前 -
postinst
:安装完成后 -
prerm
:卸载前 -
postrm
:卸载后
有一个有趣的图片,显示了安装新包的过程:
还有更多的control-files,最重要的是如下:
-
control
:依赖项的list,以及识别包的其他有用信息 -
conffiles
:配置文件的list(通常是/etc
中的那些) -
debian-binary
:包含deb-package版本,currently 2.0 -
md5sums
:软件包中每个文件的md5sums列表,用于验证 -
templates
:安装期间带有error descriptions and dialogs的文件
第三种解决方案
对于实际的under-the-hood内容,您需要获取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
实际上令人惊讶的是package-manager不可知。所有功能都通过apt-pkg/package-manager.cc
抽象出来
我只是简单地看一下,但即使在那里,我也看不到它实际附着在dpkg
系统上的哪个位置。其中一些似乎是通过apt-pkg/aptconfiguration.cc
自动配置,但这是一个深井。你可以花几天时间解开这个。
源文档虽然很好。你可以做更糟糕的事情,而不是浏览每个文件并阅读标题以确定实际发生的事情。
第四种方案
这里有一些很棒的答案比这个简短的答案更好,但你可以考虑帮助你更好地理解包管理器所做的更改是Docker。您可以使用docker diff <container>
对容器中所做的更改进行区分,它将显示所有更改。这对于了解apt-get install
对系统的作用非常有用。快速搜索将获得several resources来帮助实现这一点。