了解Linux可执行格式和软件分发包


8

我在理解Linux可执行格式和软件分发软件包时遇到了麻烦。Linux本身有很多不同的发行版,似乎每个发行版的每个软件包都是单独编译的。为什么是这样?我了解有些“软件包”是要安装在不同发行版上的,但是该软件的可执行格式是否有所不同?

另外,为什么许多Linux用户更喜欢应用程序的命令提示符版本而不是GUI版本?我可以理解需要较小的占用空间,但是,如果对它们进行正确编码,即使GUI应用程序也可以占用较小的占用空间。

Answers:


13

包管理器和依赖项

大多数Linux发行版都使用软件包管理器来安装和删除软件。程序包管理器提供了一些好处,例如可以使用一个中央存储库(几乎可以从中下载任何软件),将这些软件组织成可以作为一个内聚组安装的捆绑软件,以及主要的好处:自动依赖项处理并跟踪软件包所做的更改,以便可以将其卸载。

某些软件可能需要某些库或其他程序来执行某些职责,如果在该软件中重新实现了该职责,那将是多余的。软件包允许表达这些依赖性。

差异:包格式和策略

存在几种不同的程序包管理器。之所以创建每个目录,是因为现有的目录无法满足某些人的需求。每个软件包管理器都需要使用其自己的格式的软件包。

此外,不同的发行版对所包含的软件有不同的要求。根据从源代码编译为机器可执行文件时提供的选项,许多软件可以具有不同的功能。一些发行版希望提供完整的功能集和丰富的体验,而另一些发行版则希望提供尽可能简洁和简单的体验,并且两者之间都应有尽有。同样,发行版可能决定以不同的方式格式化其目录结构或使用不同的初始化系统。他们可能决定以不同的方式捆绑软件:在两个不同的发行版中可能有一个名为“ dev-utils”的软件包,但其中一个版本包括yacc而另一个则没有。由于这些不同的需求,发行版选择以不同的方式来编译软件。

这就是为什么即使您的软件包管理器使用了正确格式的软件包,如果该软件包打算用于其他发行版,也可能无法正常工作。例如,该软件包可能依赖于yacc安装,并且通过要求使用“ dev-utils”软件包来表达这种依赖性,但您的“ dev-utils”不包括在内yacc。现在,安装了一个具有未满足的依赖关系的软件包。

这不是真正的问题。

作为Linux发行版的很大一部分是维护中央软件存储库。该发行版负责为您维护所有这些。实际上,这使得安装软件非常容易。通常,您使用程序包管理器来搜索并选择一些程序包,然后告诉它安装它们。它会为您照顾其余的一切。Windows软件的安装过程包括在第三方网站上寻找软件,尝试找到适当的下载链接,下载,进行病毒检查以及运行安装程序,然后安装程序向您询问一系列不相关的问题。整个混乱不是Linux上的标准。

存储库不可能包含所有内容

现在,在某些情况下,您所需的某个软件不在发行版的存储库中。软件存储库提供的软件包是发行版与众不同的功能之一。当在发行版本的存储库中找不到所需的软件时,有三种可能的途径(实际上,有两种途径可以真正解决问题)。

社区资料库

许多发行版都有非官方的存储库,这些存储库由与发行版无关的人员维护。Ubuntu称它们为PPA,Fedora称它们为Fedora People Repositories。Arch Linux没有第三方存储库的特定名称,但确实有其AUR,它是软件包的“配方”的集合(注意:只有一个AUR)。您可能首先尝试从这些来源之一安装软件包,因为如果它们不起作用,很容易卸载它们。

从源编译

如果找不到所需的非官方存储库,那么从源代码进行编译就不难了。您需要安装发行版的开发包。这包括诸如编译器,链接器,解析器之类的基本内容,以及编译软件通常所需的其他工具。然后,找到项目的源代码(几乎总是打包在.tgz或中.tbz(称为“ tarball”)。将其下载到其自己的目录中,然后(使用提取)(tar -xf filename.tgz通常进入其创建的一个目录)。该目录可能是一个名为README或的文件(INSTALL如果存在),请继续阅读该文件;其中大多数告诉您执行相同的操作。接下来的几个步骤是在命令行中执行的,运行ls并查找一个名为的可执行文件configure。如果存在,请执行以下操作./configure;有时可能需要几分钟。通常,这会进行一些测试,以确定您的发行版如何进行设置,并确保您具有编译此软件所需的工具。下一步是运行make。这实际上是在编译软件,可能要花一些时间-从几分钟到几小时不等,具体取决于要编译的软件的大小。完成后,运行make install。这将安装软件,这涉及将编译产品复制到文件系统中的适当位置。之后,可以使用该软件。

这是一个很长的部分,但总结为“ README,。/ configure,make,make install”。这是要记住的例行程序。

从另一个发行版安装软件包(不要这样做)

我之所以列出它只是因为它可替代的,但几乎可以肯定它不会很好地结束。可以为其他发行版安装软件包,您可能会发现自己想要这样做。好吧,不要。除非您对系统非常了解,否则请不要这样做。实际上,即使有可能,我也不会在此处放置任何命令来显示如何执行此操作。如果确实到了这似乎是唯一的选择,请不要使用软件包管理器来安装软件包;相反,请从包装中取出物品,并将其与所做操作的注释一起手动放入系统中,以便在必要时撤消操作。

命令行位

有些人更喜欢命令行,因为它给他们带来了很多好处。这些可以概括为三件事:

  • 易于自动化
  • 速度(与在gui中点击整个地方相比)
  • 表现力

其中最大的是表现力。在图形界面中,有些事情是可以在命令行上完成的。

最后,在诸如此类的有用论坛中经常提供命令行指令,因为传达正确的信息比给出“单击此处然后再那里”类型的指令要容易得多。


6

很抱歉,答案很长。如果您想快速又肮脏,请阅读摘要。

摘要

  • 可执行格式是相同的。
  • 即使打包的程序兼容,也有不同的软件包管理器不兼容。(您可以将软件包视为安装程序文件,例如.msifiles)。
  • 基本上,不同的发行版/版本具有不同的核心库版本,并且出于一致性和稳定性的原因,需要针对这些版本构建应用程序。(Linux版本的dll hell)。
  • 不同的发行版以稍微不同的方式处理事务,在某些情况下可能是兼容性问题。
  • 命令行可以更快,而Unix命令行比Windows命令行要好得多。

包装经理

首先,包管理器。软件包管理器的主要目的是维护一个已安装软件包和构成该软件包的文件的数据库。

程序包管理器使程序包易于安装,并且通常也便于删除。它们还允许程序包指定在安装/删除时可能需要运行以维护系统一致性的各种脚本(例如,将程序包注册到某些子系统相关的数据库)。

不同的包裹经理

有各种不同的软件包管理器,它们具有不同的优点和缺点。例如rpm和debian软件包管理器(.deb文件),但还有其他例子。这些程序包管理器显然需要不同的格式,因此不兼容。

不同的发行版或版本

由于大多数Linux发行版都是开源的,因此与Windows系统上的代码重用相比要多得多。应用程序可能会将许多库用于其功能的各个部分。这些库本身也经常这样做,有时是相同的库。

不幸的是,库存在不同的版本,其中一些不兼容(尤其是预编译可执行文件的二进制兼容性)。多个版本可以很好地共存于Unix系统上(从这个角度来看,dll地狱更少),但是在大多数情况下,在一个正在运行的程序中使用两个不同版本的库会导致崩溃。

因此,二进制发行版通常会升级其自身版本,以继续使用各种核心软件包的新版本(在其他情况下,您需要进行重大更新)。

不同的其他文件

分发的不同之处还在于特定文件的放置方式以及配置的管理方式。取决于可能会对该程序包产生影响的程序包。

命令行

Unix主要是工作站和服务器操作系统。这意味着在设计时要考虑专业的系统管理员。自动化是系统管理工具箱的重要组成部分,shell脚本是实现此目标的方法。尝试在图形文件管理器中添加前导0到1000个文件名。

由于管理员经常管理许多计算机,因此他们需要在许多系统上执行相同的操作。使用ssh之类的工具,一次即可在多个系统上执行任务非常容易,只需等待计算机完成任务即可。

精确的规范,自动化和可重复性使命令行在性能上远胜于用于管理任务的图形工具。Unix也有许多不同的shell,这种竞争创造了极其强大的shell,几乎与Windows命令提示符无法比拟。

微软实际上已经很好地理解了这一点,并提供了Powershell作为命令行的替代品,并且Windows Server的最新版本主要由命令行管理。


3

可执行文件格式在发行版中都相同,但是可执行文件可能需要其他基础软件才能正常工作。如果查看基于Redhat的发行版,则安装产品是rpm,它将包含给定软件的所有要求,并且除非满足要求,否则默认情况下不会安装该软件。(yum是替代rpm并且它被一些基于Redhat的版本所使用。根据定义,GUI必须比命令提示符界面大得多。UNIX的基本原理是简化所有操作,以便给定的任务尽可能高效地工作。这就是为什么有这么多实用程序将执行单个任务,而该任务的输出却能够链接到另一个任务的输入以执行其他操作的原因。


正确的说,yum并不是替代方案,它可以在rpm以上运行,从而提供了更好的接口和诸如存储库之类的功能。
rvs

1

不同的发行版具有不同的安装先决条件。但是,有一些RPM或DEB(或用于其他数据包管理系统的其他程序包)可用于多个发行版。Linux的理念使源代码易于使用。编译自己的软件时,所有发行版中的例程几乎都是相同的,并且始终使用相同的.tar.gz存档。

编译的RPM更像是系统的一部分;作为一个独立实体,应用程序本身应在每个目标上进行分发和编译。

您的第二个问题是完全不同的……好吧,“许多Linux用户”出于许多不同的原因而更喜欢CLI应用程序,较小的内存占用只是其中一个原因。使用SSH时,CLI应用程序更有意义,尤其是在服务器外工作时。这些服务器通常没有安装图形环境。运行非守护程序时,它们很容易中止。Ctrl- c,程序消失了。另外,许多程序会记录到控制台,因此更容易调试。进行编程时,您将在控制台中进行大部分编译。快速编译调试更有意义。要么就是这样,要么是读取日志文件,有时,读取控制台会更快。


0

拱。 或作为整体开发的FreeBSD。(RHEL,SLES和类似文件作为一个整体被上报。)

笔记本电脑用途:薄荷

可用的可入侵性:Arch。

虐待性可入侵性:Genoo。

有趣的可入侵性:LFS。

可支持性(服务器):RHEL,Ubuntu LTS,FreeBSD(不同于Linux)。


您可能需要编辑答案,使您想说的话更清楚,并纠正一些错别字/语法错误。
haziz 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.