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

Bil*_*ill 8 linux distributions

我无法理解 Linux 可执行格式和软件分发包。Linux 本身有很多不同的发行版,似乎每个软件包都是为每个发行版单独编译的。为什么是这样?我知道有些“包”是为了安装在不同的发行版上,但是软件的可执行格式不同吗?

另外,为什么许多 Linux 用户更喜欢应用程序的命令提示符版本而不是 GUI 版本?我可以理解对小足迹的需求,但如果编码正确,即使是 GUI 应用程序也可以有小足迹。

Sha*_*off 13

包管理器和依赖项

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

某些软件可能需要某些库或其他程序来执行如果在该软件中重新实现就会变得多余的职责。包允许表达这些依赖关系。

差异:包格式和策略

存在几种不同的包管理器。每一个都是因为现有的不能满足某些人的需要而创建的。每个包管理器都需要有自己格式的包。

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

这就是为什么即使您的包管理器格式正确的包,如果该包用于不同的发行版,它也可能不起作用。例如,该包可能依赖于yacc被安装,它通过要求“dev-utils”包来表达这种依赖关系,但你的“dev-utils”不包含yacc. 现在有一个安装了未满足的依赖项的包。

这不是问题。

作为 Linux 发行版的一个重要部分是维护一个中央软件存储库。发行版负责为您维护所有这些。这实际上使安装软件变得非常容易。您通常使用包管理器来搜索并选择一些包,然后告诉它安装它们;它会为您处理剩下的事情。Windows 软件安装过程包括在 3rd 方网站上搜索软件、尝试找到合适的下载链接、下载、病毒检查和运行安装程序,然后该程序会询问您一堆无关紧要的问题。整个混乱不是 Linux 上的标准。

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

现在,在某些情况下,您需要的软件可能不在您的发行版存储库中。软件存储库提供的包是发行版的差异化特征之一。当您在发行版的存储库中找不到所需的软件时,有三种可能的途径(实际上,两种方法加上一种真正搞砸的方法)。

社区存储库

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

从源代码编译

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

这是一个很长的部分,但它总结为"README, ./configure, make, make install"。这是要记住的例行公事。

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

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

命令行位

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

  • 易于自动化
  • 速度(与在 gui 中到处点击相比)
  • 表现力

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

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


Pau*_*eze 6

对不起,答案很长。如果你想要快速和肮脏,只需阅读摘要。

概括

  • 可执行格式是一样的。
  • 即使打包的程序是兼容的,也有不同的包管理器不兼容。(您可以将包视为安装程序文件,如.msi文件)。
  • 基本上不同的发行版/版本具有不同版本的核心库,出于一致性和稳定性的原因,需要针对这些版本构建应用程序。(Linux 版本的 dll 地狱)。
  • 不同的发行版以稍微不同的方式做事,这在某些情况下可能是兼容性问题。
  • 命令行可以更快,并且 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是某些基于 Redhat 的版本的替代方案rpm并使用它)。根据定义,GUI 的占用空间必须比命令提示符界面大得多。UNIX 的基本理念是简化一切,以便给定的任务尽可能高效地工作。这就是为什么有如此多的实用程序将执行单个任务,并且该任务的输出能够链接到另一个任务的输入以执行其他操作。