我无法理解 Linux 可执行格式和软件分发包。 Linux 本身有很多不同的发行版,而且似乎每个软件包都是为每个发行版单独编译的。为什么是这样?据我所知,某些“软件包”是为了安装在不同的发行版上而设计的,但是该软件的可执行格式是否不同?
另外,为什么许多 Linux 用户更喜欢命令提示符版本的应用程序而不是 GUI 版本?我可以理解对小占用空间的需求,但即使是 GUI 应用程序,如果编码正确,也可以具有很小的占用空间。
答案1
包管理器和依赖项
大多数 Linux 发行版使用包管理器进行软件安装和删除。包管理器提供了一些好处,例如可以使用可以从中下载(几乎)任何软件的中央存储库、将软件组织成可以作为一个内聚组安装的捆绑包,以及主要好处:依赖性处理并跟踪软件包所做的更改,以便可以卸载它们。
某些软件可能需要某些库或其他程序来执行职责,如果在该软件中重新实现这些职责,这些职责将是多余的。包允许表达这些依赖关系。
差异:包格式和策略
存在多种不同的包管理器。每一个都是因为现有的不能满足某些人的需求而创建的。每个包管理器都需要其自己格式的包。
此外,不同的发行版对所包含的软件有不同的要求。有许多软件可以具有不同的功能,具体取决于从源代码编译为机器可执行文件时给出的选项。一些发行版希望提供完整的功能集和丰富的体验,而另一些发行版则希望提供尽可能精益和简单的体验,两者之间有一切。此外,发行版可能会决定以不同的方式格式化其目录结构或使用不同的初始化系统。他们可能决定以不同的方式捆绑软件:两个不同的发行版中可能有一个名为“dev-utils”的软件包,但其中一个版本包含,yacc
而另一个版本则不包含。由于这些不同的需求,发行版选择以不同的方式编译软件。
这就是为什么即使您的包管理器具有正确格式的包,如果该包用于不同的发行版,它也可能无法工作。例如,该软件包可能依赖于yacc
安装,并且它通过要求“dev-utils”软件包表达了这种依赖性,但您的“dev-utils”不包含yacc
.现在安装了一个未满足依赖关系的软件包。
这并不是什么问题。
Linux 发行版的一个重要部分是维护中央软件存储库。该发行版负责为您维护所有这些。这实际上使得安装软件变得非常容易。您通常使用包管理器来搜索并选择一些包,然后告诉它安装它们;它会为您处理剩下的事情。 Windows 软件安装过程包括在第 3 方网站上寻找软件、尝试找到适当的下载链接、下载、病毒检查以及运行安装程序,然后安装程序会询问您一堆不相关的问题。这一切并不是 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
。软件,这涉及将编译的产品复制到文件系统中的适当位置。之后,该软件就可以使用了。
这是一个很长的部分,但总结如下“自述文件,./configure,make,make install”。这就是要记住的惯例。
安装来自其他发行版的软件包(不要这样做)
我列出这个只是因为它是和替代方案,但几乎肯定不会有好结果。可以安装其他发行版的软件包,并且您可能会发现自己想要这样做。好吧,不要。在您非常了解您的系统之前不要这样做。事实上,我不会在这里放置任何命令来展示如何执行此操作,即使这是可能的。如果您确实到了这似乎是唯一选择的地步,请不要使用包管理器安装包;相反,从包中取出内容并手动将它们放入您的系统中,并附上有关您所做操作的注释,以便您可以在必要时撤消它。
命令行位
有些人更喜欢命令行,因为它给他们带来了好处。这些可以概括为三件事:
- 易于自动化
- 速度(与在 GUI 中到处点击相比)
- 表现力
其中最重要的是表现力;有些事情可以在命令行中完成,而在图形界面中则无法完成。
最后,命令行指令经常在有用的论坛(例如本论坛)中给出,因为它比给出“单击此处然后那里然后那里”类型的指令更容易传达正确的信息。
答案2
抱歉回答太长。如果您想要快速而肮脏的内容,请阅读摘要。
概括
- 可执行文件的格式是相同的。
- 即使打包的程序是兼容的,也有不同的包管理器不兼容。 (您可以将包视为安装程序文件,如
.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 的基本理念是简化一切,以便给定的任务尽可能高效地工作。这就是为什么有如此多的实用程序将执行单个任务,并且该任务的输出能够链接到另一个任务的输入以执行其他操作。
答案4
拱。 或者FreeBSD,它是整体开发的。 (RHEL、SLES 和类似的系统作为一个整体得到支持。)
笔记本电脑用途: 薄荷色
可用的可破解性:Arch。
虐待狂黑客:Genoo。
有趣的可破解性:LFS。
支持性(服务器):RHEL、Ubuntu LTS、FreeBSD(与 Linux 不同)。