软件发行及其今天的作用

2021-01-18 00:45:40

什么是软件发行版?您可能会认为您已经了解了有关软件分发这一术语的所有知识,但是花点时间对其进行思考,退后一步,然后尝试了解大局。

当我们听到声音时,我们经常会想到成千上万的Linux发行版,但是,这绝不仅限于Linux,BSD,Berkeley SoftwareDistribution,其名称就是正确的软件发行版。 Android和iOS也是软件发行版。

实际上,它是如此普遍,我们可能已经停止关注这个概念了。我们发现很难将定义放在一起。肯定是其中包含分发软件的部分。可能是商业化的软件,也可能不是开源的。为了更好地理解它,也许调查一下软件分发所解决的问题将可以解决问题。

让我们想象一下软件发行之前的世界,这个世界存在吗?一个世界,在这个世界中,软件始终处于界限之内,而不与​​任何人共享。一旦打破了这些界限,我们想要共享它,我们将发现我们必须将所有软件有意义地打包在一起,对其进行配置,以使其能够很好地协同工作,并在必要时添加一些胶水,找到合适的介质来分发捆绑包,安全地将其从一端传送到另一端,确保正确安装,然后进行后续操作。

因此,软件分发涉及承担负担和决策以构建可运输的相干软件组合的机制和社区。

就像您喜欢的那样,操作系统或内核可能是(通常是)所提供拼贴的一部分,就像其他软件一样。

它背后的人称为分发维护者或程序包维护者。他们的角色千差万别,他们可以编写存储所有软件包的软件(称为存储库),维护其格式的软件包管理器,维护完整的操作系统安装程序,自己构建的软件包和上传软件,或者其他人在特定的时间范围/生命周期内构建的软件,确保没有任何恶意代码上传到存储库中,跟进最新的安全问题和错误报告,修复第三方软件以适应发行哲学的选择和配置,最重要的是测试,计划并确保一切都结合在一起。这些维护者是发行信任的来源,他们对此负责。实际上,我认为联系他们的分销商更为准确。

分布太多,可以使您的头部旋转。软件世界正在蓬勃发展,特别是开放源码的世界。例如,我们可以找到新的维护者复制并转移的分布的分支。这会创造出树状的外观,共同点的族谱和/或技术和哲学选择的影响。总体而言,我们现在拥有一个充满活力的生态系统,在其中学习到的东西可以帮助另一棵树上完全不相关的叶子。每个人都有的东西。

因此,所有这些软件发行版之间可能会有很大的不同,为什么没有一个人人可以建立的平台。

一件事是专业化和差异化。每个发行版都针对不同的受众,并由具有其理念的社区构建。

发行版可以支持特定的硬件集合和组合:从CPU ISA到外围设备驱动程序

发行版可能针对以下类型的环境进行了优化:台式机,便携式移动设备,服务器,仓库大小的计算机,嵌入式设备,虚拟化环境等。

可以针对领域中的不同知识水平(专业与否)设计发行版。例如,安全性研究,科学计算,音乐制作,多媒体盒,汽车中的HUD,移动设备接口等。

发行版可能已经过认证,可以遵循专业设置中必须遵守的某些标准,例如安全性标准和强化

发行版可能在商用机器中具有单一目的,而在特定机器功能中(例如防火墙,计算机集群,路由器等)可能具有单一目的。

一切都取决于分配的原理,它指导维护者必须做出的每个决定。它指导他们如何配置每个软件,如何考虑安全性,可移植性,全面性。

例如,如果某个发行版在乎免费软件,那么它将严格考虑其包含的软件以及其存储库中允许的许可,并让软件检查内核中许可的一致性。另一个例子是,如果他们的目标是针对台式机受众,那么将优先考虑国际化,易用性,用户友好性和众多软件包。同样,如果目标是实时嵌入式设备,则内核的大小将变小,为此目的将对其进行配置和优化,并限制和选择在此环境下工作的合适软件包。或者,如果针对的是喜欢控制机器的高级用户,维护人员将选择让用户做出大多数决定,提供尽可能多的最新版本的软件包,以宽松的方式安装发行版,很多库和软件开发工具。

这意味着发行版会尽其所能提供符合其思维方式的默认值。它组成并配置了一层组件,即一堆软件。

发行维护者通常会在配置时拥有不同的功能块,并具有选择功能的能力,将它们堆叠起来以创建我们称为软件发行功能的单元。有许多方法可以解决,他们可以选择在他们认为发行核心的内容以及对发行不重要的内容中包含更多或更少的内容。此外,有时它们甚至可能使内核变得非常小而松散,而不是提供胶水软件,使用户可以轻松地在特定的时间段(安装,运行时,维护模式等)选择和交换模块。

第一部分是安装方法,这是一切的起点。

第二部分是内核,它是当今所有操作系统的真正核心。但这并不意味着发行必须强制执行。有些发行版可能会提供专门针对不同事物的多个内核,或者根本不提供。

第三部分是文件系统和文件层次结构,该组件管理文件在物理或虚拟硬件上的分发位置和方式。这可能是混合搭配,其中文件系统树的各个部分存储在单独的文件系统上。

第四部分是初始化系统PID1。近来,这种选择引起了很多争论。 PID 1是系统上所有其他进程的母进程。它所扮演的角色以及它应该包括的功能是一个争论的话题。

第五部分由Shell实用程序组成,有时也称为用户区或用户空间,因为它是用户可以直接与之交互以控制操作系统(进程运行的地方)的第一层。在基于Unix的系统上的用户级实现通常尝试遵循POSIX标准。有许多这样的实现,也是争论的主题。

第六部分由服务及其管理组成。守护程序,长时间运行的进程,使系统保持秩序。许多人争论管理功能是否应该成为init系统的一部分。

最后一部分是关于其他所有内容,用户可以拥有的所有用户界面和实用程序以及在系统上进行管理的方式。

在与最新版本保持一致的情况下,发行版可以根据自己提供的软件的版本进行发布。这通常适用于外部第三方开源软件。频谱如下:我们是否允许用户始终拥有每个软件的最新版本,同时冒着意外破坏其系统的风险(我们称之为前沿漏洞或滚动发行版),或者我们采取更为保守的方法并花时间测试在允许软件进入存储库之前正确地安装每种软件,同时又不具备该软件的所有最新更新,功能和优化,我们称之为基于发行版的发行版。

第一种情况的极端情况是让用户直接从软件供应商/创建者源代码存储库下载,或者相反,让软件供应商/创建者直接将其推送到分发存储库。这很容易破坏或与用户的系统冲突或导致安全漏洞。我们稍后再讨论,因为如果该软件在容器化环境中运行可以避免。

在发行发行版中,通常涉及具有长期支持稳定版本,该版本长期保持与必要的安全更新和错误修复的同步并与之保持同步,而另一个版本要提前运行以测试未来的变化。在特定的时间范围内,用户可以跳转到该发行版的最新版本,这可能涉及配置和软件方面的许多更改。一些发行版本决定他们可能想要破坏主要发行版的kernel的ABI或API,这意味着需要重建和重新安装系统中的所有内容。

当涉及更新时,在两种情况下,分发维护人员都必须决定如何进行通信和处理更新。如何让用户知道发生了什么变化。如果将用户配置替换为新配置,或者与新配置合并,或者将其复制到一边。沟通是必不可少的,无论是通过官方渠道,日志记录,邮件还是其他方式进行沟通。沟通都必须是双向的,用户要报告错误,维护人员要发布他们的决定以及是否需要用户参与。这将创建分布周围的社区。

滚动发布需要软件包维护者付出巨大的努力,因为他们必须不断跟上软件开发人员。尤其是当涉及到成千上万的新库时,它们是最近的编程语言的一部分,并且还在不断增加。

各种用户都希望从系统中获得精确的信息。企业环境和任务关键型任务将更喜欢稳定版本,软件开发人员或普通最终用户可能更喜欢具有使用最新软件的能力。

有了这些,就不可能有一个创建订单的内部分发标准,我们是否需要这样的标准。

在用户级别,差异并不总是很明显,大多数情况下,一切似乎都可以正常运行,因为Unix系统有望正常工作。发行版之间没有真正的标准,只是它们或多或少地遵循POSIX标准。

在Linux生态系统中,自由标准组织试图通过修复通用的Linux ABI,文件系统层次结构,命名约定等来改善软件的互操作性。但这只是theiceberg拥有可相互分配的东西的秘诀。

此外,可以说我们以前看到的分层的每个部分都有其自己的标准:有桌面互操作性标准,文件系统标准,网络标准,安全性标准等。

当前最大的参与者是与免费桌面组相关联的systemd,它试图创建(强制)Linux分发的相互分发标准。

但是,又有一个大问题:我们实际上是否需要这样的内部分发标准?我们对目前的混合搭配感到满意吗?我们会从这样的事情中获利吗?

现在,让我们关注软件包本身,如何存储它们,如何安全访问它们,如何在它们之间进行搜索,下载,安装,删除它们以及与它们本地管理,版本控制和配置有关的所有内容。 。

从历史上到今天,都可以通过物理介质(例如CD-ROM,DVD,USB等)共享软件。这在专有供应商的发行版中附带他们所出售的某种硬件时很常见,这在采购中也很常见。初始安装映像。但是,随着当今软件的忙碌发展,使用物理介质已变得不灵活。通过FTP,HTTP,HTTPS,公共svn或git repo,通过Github等中心网站集线器或Apple和Google提供的应用程序商店,通过Internet共享更为方便。

要求存储和与之的通信应安全,可靠,无故障且可从任何地方访问。因此,通常会进行复制以避免故障,而且还会在全球范围内产生某种边缘网络加速效果,即负载平衡。复制可以通过多种方式完成,例如,它可以是P2P分布式系统。

我们如何存储它以及以哪种格式决定存储库的维护者。通常,这是一个带有软件API的文件系统,用户可以通过电线与之交互。存在两种主要的格式策略:基于源的存储库和二进制存储库。

其次,谁可以上载和管理主机包。谁有权复制存储库。

作为用户的真实来源,重要的是确保包装在接收到存储库之前已经过验证和固定。

许多发行版都只有维护者才能做到这一点。向他们提供加密密钥以对软件包进行签名并对其进行验证。

其他人则拥有自己的用户来构建软件包,然后将其发送到Centralhub进行自动或手动验证,然后上传到存储库。每个用户都有自己的加密密钥以进行签名验证。

这归结为信任和稳定的问题。如果单个软件包未正确容器化,则使用二进制软件包时,让用户上传软件包并不总是可行的。

第三种选择是介于两者之间的道路,有两种类型,一种是由官方发行维护者管理的核心,另一种是由其用户社区管理的。

用户如何在本地和远程与存储库进行交互取决于包管理的选择。用户是否缓存远程存储库的版本,就像BSD端口树系统常见的那样。跟踪更新,锁定软件版本,允许降级的灵活性如何。用户可以从其他来源下载吗?用户可以在其计算机上使用同一软件的多个版本。

正如我们已经说过的,软件共享格式主要有两种理念:源代码端口样式和预构建的二进制包。

在用户端进行管理的软件称为packagemanager,它是与存储库的链接。虽然,在基于源的仓库中,我不确定我们可以用这种方式来称呼它们,但是无论如何,我仍然会这样称呼它们。许多发行版创建自己的发行版或重复使用流行的发行版。它可以搜索,下载,安装,更新和删除本地软件。这不是一个小任务。

这本书的规则是,如果包管理器未安装该书,则它不会知道它的存在。请注意,发行版不必仅限于一个包管理器,可以有很多。

每个软件包管理器都依赖于一种特定的格式和元数据来管理软件,无论是源格式还是二进制格式。这种格式可以由一组文件或具有特定信息段的单个二进制文件组成,这些信息段一起创建有助于整个生命周期的配方。有些比其他的更容易组合在一起,顺便允许更多的用户贡献。

以及所需的配置文件以及是否应覆盖它们

真实性,要知道它来自受信任的来源,例如根据用户计算机上的受信任存储检查的加密签名

安装时是否有特定的配置标志或参数传递给软件包管理器

因此,预编译二进制软件包而不是克隆源代码并自行编译有什么好处。这样做不会减轻包裹维护人员的负担。

优点之一是预编译的软件包很方便,下载和立即运行它们更容易。这些天来,即使不是没有可能,也很难编译大量的软件,例如网络浏览器。另一点是,专有软件通常已经作为二进制程序包分发,这将创建源程序包和二进制程序包的混合。

二进制格式还节省了空间,因为代码以压缩的存档格式存储。例如:APK,Deb,Nix,ORB,PKG,RPM,Snap,pkg.tar.gz / xz等。某些包管理器可能还选择将压缩选项留给用户,并动态地从其配置文件中识别出方法。解压缩软件包。

我们要补充一点,就是存在诸如“外星人”之类的工具,它们可以通过将一种二进制软件包格式转换为另一种二进制格式来促进软件包维护人员的工作。

软件包管理器必须保留系统上当前安装的所有软件包及其版本的列表及其依赖性。当用户想要安装一个软件包时,它必须以该软件包的依赖项列表作为输入,将其与斜体已经拥有的软件包进行比较,并以满足所有依赖项的顺序输出需要安装的列表。

这是在软件开发环境中使用诸如make之类的构建自动化实用程序经常遇到的问题。该工具创建有向无环图(DAG),并使用图论和无环依赖原则(ADP)的功能来尝试找到正确的顺序。如果找不到解决方案,或者图中有冲突或周期,则应中止操作。

反之,在取出包装时也是如此。我们必须做出决定,是否要删除作为该单个软件包的依赖项安装的所有其他软件包。如果较新的软件包依赖于那些依赖关系,我们应该只允许删除未使用的依赖关系怎么办。

如果我们允许在系统上安装同一软件的多个版本,则在向混合中添加版本控制因素时,此问题会加剧。

如果我们不这样做,但允许从一个版本切换到另一个版本,那么我们是否也会切换所有其他依赖它的软件包。

版本控制不仅适用于软件包,而且适用于发行版的发行版。他们中的许多人将特定版本的软件包附加到特定发行版,因此发行版可能具有不同的存储库。

命名约定的选择也起作用,它应该向用户传达它们的含义以及是否发生任何更改。

软件包维护者应遵循软件开发者的命名约定,还是应使用自己的软件包。如果两个软件的名称相互冲突怎么办,这将使它不可能存在于其中,需要添加一些额外的信息。

我们是依靠语义版本控制,主要,次要,补丁还是像许多发行版一样依赖名称(玩具总动员,沙漠等),还是依靠发布日期,或者仅仅是递增数字? 。

当他们从存储库搜索和更新软件包时,所有这些都向用户传达了含义。

可能不适用于基于源的发行版的一件事是,在构建程序包时决定是静态链接到库还是动态链接到库。 动态链接是程序选择不在可执行文件中包含它依赖的库的过程,而是仅选择对其的引用,然后在运行时由动态链接程序解析该链接程序,该链接程序将在使用时将共享库加载到内存中。 相反,静态链接是指将库直接存储在已编译的可执行程序内部。 当大量软件依赖于同一个库时,动态链接很有用,因此一次只需要在库中存储一个实例。可执行文件的大小也较小,并且在更新时全部 ......