Linux操作系统的历史可以追溯到1991年,当时芬兰学生Linus Torvalds受Unix和Minix的启发,开始开发新的操作系统。免费许可证的成功选择预示了他的事业的成功-数十万名爱好者加入了开发,每个人都带来了新的东西。随后,大型公司(英特尔,IBM等)加入了开发。我不知道促使行业领导者支持免费操作系统的确切原因,但““之以鼻”说,许多公司决定搬迁微软,而微软当时在桌面操作系统上拥有绝对的垄断地位。
以行数表示的Linux内核演变
在没有行业领导者支持的情况下,Linux会变成现在吗?远非事实-老人们记得圣克鲁斯行动公司与支持Linux的公司之间的专利战。上合组织输掉了这场战争,不再存在。
公司向核心提交的次数
因此,Linux操作系统在其一生中已经发展了很长的路,并且现已成为能够替代Windows来解决用户许多紧急任务的流行操作系统。
在开始比较现代Linux发行版之前,我们必须定义两个重要方面-第一个方面是操作系统的组成,第二个方面是从比较的角度进行。分发工具包是指由OS内核,图形服务器(X服务器),环境(一组提供的程序),安装实用程序和初始配置组成的完整解决方案。可以从最终用户,系统管理员和应用程序程序员的角度比较分布。
从系统管理员的角度来看Linux
在Linux的发展初期,拥有大量特定编程和管理知识的技术人员和技术神父。 Linux的先驱是Unix操作系统,并且具有Unix管理经验的专家可以轻松地设置和配置系统。这是普通用户无法访问的,并且对他的管理过程类似于魔术。现代Linux已经变得用户友好-安装过程归结为可以回答一些问题,仅通过肯定地回答所有问题,仅需同意安装程序提供的配置选项就足够了-安装程序将分析硬件配置并选择必要的驱动程序和配置参数。通常,分发工具包包含即用型软件包,以DEB或RPM归档文件的形式提供,除程序本身外,还包含配置脚本和有关第三方库依赖性的信息。但是,也有例外,例如,当所有程序和构建规则都提供Gentoo发行版作为源时,并且操作系统本身实际上是在用户计算机上构建的,用于其处理器配置。这种方法的有效性问题是有争议的,我们不会深入研究,我只会指出,这只是社区宣布的自由度之一,用户可以自由选择“是否值得”。通常,RPM和DEB软件包格式相似,并且在选择分发工具包时,您可以忽略这一点。极少数例外-有时会发生该程序的作者由于某种原因未提供安装程序的第二个版本,并且仅以RPM(RedHat Linux及其衍生版本)或DEB(Debian Linux及其衍生版本)格式存在。在这种情况下,您可能需要努力安装这样的程序-即使手动解压缩安装包,也可能偶然发现不满意的依赖关系。安装这样的程序将需要大量的精力,并且如果出现错误,尝试替换所需的库,可能会导致系统崩溃。幸运的是,这种情况极为罕见,并且99.9%的Linux用户将永远不会遇到此问题。而且,所有发行版的知名制造商都使用一组丰富的程序来保存其存储库,其中每个程序都针对发行版的特定版本进行编译和测试。
因此,我们知道Linux之间的差异之一是数据包格式。但是,从系统管理员的角度来看,还有另一个区别-启动脚本的格式。在Unix操作系统家族中,Linux具有两种相互竞争的格式-System V样式和BSD样式。要了解这是什么,让我们看看它是如何工作的。引导加载程序加载OS内核并将控制权转移给它,内核启动并启动第一个进程-init。严格来说,您可以滑动任何进程来代替init,例如bash。在这种情况下,我们得到了类似单用户,单任务的控制台系统,该系统没有网络,没有图形界面,并且具有只读的根文件系统。此外,如果内核中没有驱动程序,但某些硬件作为模块加载,则这种情况下的某些硬件可能无法工作。在经典的操作模式下,init进程读取/ etc / inittab文件,并根据该文件开始系统启动过程-装载分区,装载驱动程序,初始化网络接口,启动服务程序(以前称为守护程序),装载图形子系统。 Init并非直接这样做,而是使用运行级别和特殊脚本的概念。通常最多有六个运行级别-描述系统操作模式的执行模式-启动,单用户,具有网络子系统的多用户,具有图形界面的多用户。根据使用条件,管理员可以设置标准运行级别,系统将在启动后切换到该运行级别,对于台式机,通常是具有网络和图形界面的多用户模式,对于服务器是具有网络的多用户模式。正是在这些脚本中,SystemV和BSD样式之间存在差异。但是,了解了inittab格式后,您可以查看脚本的内容并了解系统运行级别之间的启动,停止和过渡的工作方式。
2010年,RedHat的工程师开发了系统服务init的替代产品。该服务为系统带来了新功能:
- 套接字激活的服务(
替换补充inetd); - 按计划启动服务(
替换cron); - 使用硬件看门狗定时器(代替看门狗);
- 根更改(替换chroot);
- 自动挂载卷和网络资源(
替换对mount和fstab的补充); - journalctl-日志记录服务;
- systemd-analyze-服务启动的分析(包括加载速度(系统和单个服务的加载速度,服务启动的呈现等);
- systemd-boot-UEFI引导程序(替换grub和lilo)。
当前,绝大多数Linux发行版已切换到systemd,在曾经流行的发行版中,只有Slackware拒绝过渡到新子系统。
因此,直接过渡到systemd消除了Linux之间的差异之一-启动脚本系统,并导致了统一。同时,保留了对经典启动脚本的支持-例如,可以经典地通过/ etc / fstab指定用于挂载的某些卷,而可以使用systemd工具来挂载其他卷。
过去,系统管理员曾经争辩说哪个系统比SystemV或BSD更好,但是现在争论已经平息。经验丰富的系统管理员可以配置任何系统,但是对于Web上的新手来说,有足够的信息可以揭示Linux配置的各个方面。
从用户角度看Linux
从最终用户的角度来看,Linux的差异略有不同。让我们更深入地研究这个问题。图形子系统最初在Unix上是可选的。 Unix通常在功能强大的计算机上运行,并且用户通过X终端连接到它。交互通过网络进行-该程序在主机上执行,接收有关按下键盘和鼠标事件的信息,并作为响应向终端发送命令以绘制图形基元和文本。图形终端是昂贵且稀有的设备,因此个人计算机已成为终端的流行。顺便说一下,这是一个经常引起混乱的有趣点-X服务器是在终端而不是主机上执行的。程序本身在使用xlib库的主机上运行,提供了用于图形服务器的基本底层接口。该界面是很底层的,它引入了窗口的概念,即屏幕的矩形区域,可以显示不同字体的矢量文本,还可以提供各种图形图元的绘图-点,线,矩形,圆和图片。
由于基本的图形基元非常简单,因此导致了小部件库的出现-这些库提供了更高级别的抽象,并大大简化了使用图形界面编写程序的过程。例如,X Athena Widgets库成为X Window System图形系统的一部分。该库介绍了按钮,单选按钮,菜单,输入字段和类似基元的概念。但是,按照现代标准,它看起来很“扭曲”。
这就是用户之间差异的开始。用户在屏幕上看到的内容取决于多个子系统-桌面环境提供称为桌面的空间,窗口管理器确定程序窗口(窗口装饰)的外观,并且通常(但不一定)是集成到桌面环境中,最后,它是一个界面元素库。用户在屏幕上看到的内容和方式取决于上述组件的组合。
实际上,这导致一个事实,即在不同的窗口管理器中运行的同一程序可能具有不同的窗口修饰-不同的标题,窗口边框大小,不同的最小化,全屏和关闭按钮。窗口管理器定义了所有这一切。但是,在单个窗口管理器中,不同的程序可以具有不同类型的界面元素,具体取决于所使用的库。为了公平起见,应该注意的是,您可以在Windows中观察到类似的变化,但是却很少见,因为绝大多数Windows程序都使用标准的GDI +或将其包装。
Linux用户在桌面上将面对什么?首先,它是GNOME或KDE,大多数发行版都基于这些桌面环境。但是,它们不限于此,各种Linux供应商提供了大约十二种不同的环境。至于接口元素的库,这里有两个库-GTK和Qt。这两个库都是跨平台的,如果Linux和Windows下都存在任何程序,则很可能是使用GTK或Qt编写的。但是,也有例外,例如Xamarin为Linux和macOS创建了Windows窗体库的版本。有时,窗口管理器开发人员还会分发其小部件库。因此,很清楚Linux的各种图形用户界面来自何处。
从应用程序程序员的角度来看Linux
以上所有内容同样适用于编程。如果您正在编写服务器或控制台实用程序,那么在大多数情况下,您无需使用条件编译指令-现代Linux已经足够标准化并且完全兼容POSIX。此外,使用autoconf不仅可以为Linux编写程序,还可以为从BSD到各种奇特的POSIX兼容系统编写程序。
您可能不必选择包格式-同时使用DEB和RPM,您将涵盖几乎所有用例。对于服务程序,您可能必须注意启动脚本的格式,以便安装程序正确注册服务的自动启动。就我而言,我必须注意字体的位置,因为不同的供应商使用不同的路径来存储字体,但是从/ usr / share /字体开始的递归搜索将在这里为您提供帮助-除自定义字体外的所有字体都将沿着该路径放置。至于/ home / user中安装的自定义字体,会有一些混乱和摇摆,并且不同的供应商至少提供两个层次结构-〜/ .fonts和〜/ .local / share /字体。
对于图形程序,复杂度会更大。鉴于动物园的桌面环境不同,您需要考虑它们的特殊性。例如,大多数桌面环境都支持所谓的桌面通知,但可能不适用于某些特殊的窗口管理器。
最后,还有一些重要的要点使分布之间存在显着差异。尽管所有现代Linux都相似,但在发行版中,如果保护程度增加,可能会遇到问题,即使用强制访问系统的用户。例如,默认情况下,所有经典发行版中都有某些资源可用,但是会在受保护的Linux版本中导致访问错误。在这种情况下,无法预先预测程序将在何处以及如何失败,因此唯一的解决方案是对受保护的发行版进行测试。或者在用户联系技术支持后快速解决问题。
第二点是发行版的受欢迎程度。如果您将一些不太常用的库或框架用作产品的一部分,则这样的发行版可能包含该库的旧版本或不完整版本。在我的实践中,这种情况发生在支持C#的System.Text.Encoding库中支持代码页1251的发行版之一中。解决此类问题的方法只有一种-由于在其他Linux发行版中未发现该问题,因此您应写信给该发行版的开发人员的技术支持,详细描述该问题,并说在其他发行版中没有问题。
输出量... 如果您不考虑Linux的受保护版本,那么从系统管理员和程序员的角度来看,现代发行版非常相似。通常,同一供应商的不同世代发行版之间的差异比现代发行版之间的差异更重要。从用户的角度来看,主要区别在于桌面环境和分发版附带的软件的选择和配置。