什么是 Linux 操作系统?

9 Oct 2024 | 阅读 17 分钟

Linux 简介

Linux 是一个开源的类 Unix 操作系统系列,基于 Linux 内核。该内核于 1991 年 9 月 17 日首次由 Linus Torvalds 发布。通常,Linux 被打包成 Linux 发行版,其中包含支持库、系统软件和内核,其中许多由 GNU 项目提供。一些 Linux 发行版在标题中使用“Linux”一词,但自由软件基金会使用“GNU/Linux”标题来强调 GNU 软件的重要性,这引起了一些争议。

著名的 Linux 发行版包括 Ubuntu、Fedora Linux 和 Debian,其中 Debian 包含许多不同的修改和发行版,包括 Xubuntu 和 Lubuntu。商业发行版有 SUSE Linux Enterprise 和 Red Hat Enterprise Linux。Linux 的桌面发行版使用 Wayland 或 X11 等窗口系统以及 KDE Plasma 和 GNOME 等桌面环境。

  • 最初,Linux 是为基于 Intel x86 架构的个人计算机设计的,但此后已移植到比其他操作系统更多的环境。
  • 包括 Android 在内,Linux 拥有所有通用操作系统中最大的安装量,这得益于截至 2022 年 5 月 Linux-based Android 在智能手机领域的控制。
  • 然而,截至 2022 年 11 月,Linux 在桌面计算机上的使用率仅约为 2.6%。
  • 此外,Linux 在许多嵌入式系统上运行,即 OS 通常集成到固件中且高度定制化的设备。
  • 它包括航天器(毅力号火星车、龙飞船太空舱和猎鹰 9 号火箭)、汽车(丰田、现代、梅赛德斯-奔驰、奥迪和特斯拉)、电视(LG 和三星智能电视)、视频游戏机、智能家居设备、自动化控制和路由器。

Linux 是开源和免费软件协作最杰出的典范之一。根据其各自许可证(如 GNU GPL(通用公共许可证))的条款,任何人都可以分发、修改和商业或非商业使用其源代码。例如,Linux 内核是根据 GPLv2 许可的。

Linux OS 历史

What is Linux Operating System?
  • 前身
    Unix 操作系统由 AT&T 的贝尔实验室的 Joe Ossanna、Douglas Mcllroy、Dennis Ritchie 和 Ken Thompson 于 1969 年在美国构思和实现。Unix 于 1971 年首次发布,当时完全用汇编语言编写,这是当时的常规做法。1973 年,Dennis Ritchie 以一种关键的先驱方式用 C 语言对其进行了更新。Unix 高级语言实现的可用性使其能够方便地移植到不同的计算机平台。
  • 创建
    Torvalds 在 1990 年秋季访问赫尔辛基大学时注册了一门 Unix 课程。该课程使用了一台运行 Ultrix 的 MicroVAX 小型计算机,其中一本必读的教材是 Andrew S. Tanenbaum 的《操作系统:设计与实现》。该教科书中包含 Tanenbaum 的 MINIX 操作系统副本。正是通过这门课程,Torvalds 最初接触了 Unix。他于 1991 年开始对操作系统产生兴趣。由于 MINIX 当时仅限于教育用途的许可限制,他开始着手开发自己的操作系统内核,最终成为了 Linux 内核。
    Torvalds 从 MINIX 开始 Linux 内核开发,为 MINIX 编写的软件也用于 Linux。后来,Linux 得到了发展,然后 Linux 内核的开发出现在 Linux 系统上。此外,GNU 应用程序取代了所有 MINIX 组件,因为通过 GNU 项目使用新 OS 的免费代码是有益的;根据 GNU GPL 许可的代码可以重新应用于其他计算机功能,只要它们也根据兼容或相同的许可证发布。
    Torvalds 开始从他禁止商业分发的实际许可证转向 GNU GPL。开发人员致力于开发与 Linux 内核的 GNU 组件,从而创建了一个免费且功能齐全的操作系统。
  • 当前开发
    Linux 内核的首席维护者是 Greg Kroah-Hartman,他领导着其开发。自由软件基金会的执行董事是 William John Sullivan,他支持 GNU 组件。最后,公司和个人开发非 GNU 的第三方组件。
    第三方组件包括大量的代码,可能包含用户库和应用程序以及内核模块。Linux 社区和供应商以 Linux 发行版的形式分发和组合内核、非 GNU 组件和 GNU 组件以及额外的包管理软件。
  • 流行和商业化推广
    在生产环境中,Linux 的采用最初开始于 20 世纪 90 年代中期,在超级计算领域流行起来,而不仅仅是爱好者使用,NASA 等组织开始越来越多地用运行 Linux 的廉价商品计算机集群来取代昂贵的机器。商业使用始于 IBM 和 Dell,随后是惠普,它们开始为 Linux 提供支持,以打破微软在桌面操作系统市场的垄断。
    Linux 系统在当今的计算领域得到了广泛应用,从嵌入式系统到几乎所有的超级计算机,并在 LAMP 应用程序堆栈等服务器安装中占据了一席之地。Linux 发行版在企业和家庭桌面上的使用一直在增长。
    此外,Linux 发行版在上网本市场中也变得流行,许多设备出厂时都预装了定制的 Linux 发行版,Google 发布了专为上网本设计的 ChromeOS。

Linux OS 设计

许多开源开发者承认 Linux 内核不是被开发的,而是自然演化的。基于 Linux 的系统是兼容的类 Unix 操作系统,它从 20 世纪 70 年代和 80 年代 Unix 中确立的原则中汲取了许多通用设计。这样的系统应用 Linux 内核,一个单体内核,负责管理文件系统、外围设备访问、网络和进程控制。设备驱动程序直接集成到内核中,或者作为模块包含,并在设备处于活动状态时加载。

What is Linux Operating System?

已安装的 Linux 系统组件包括以下内容:

  • 引导加载程序 (bootloader),例如 systemd-boot、SYSLINUX、LILO 和 GNU GRUB。它是一个程序,可以在计算机启动后、固件登录完成后,将 Linux 内核加载到计算机的主内存中。
  • init 程序,例如传统的 sysvinit 和较新的 Upstart、OpenRC 和 systemd。它是 Linux 内核启动的第一个进程,也是进程树的根。换句话说,所有进程都从 init 启动。它会初始化进程,例如登录提示符和系统服务(无论是在终端还是图形模式下)。
  • 软件库 (Software libraries),其中包含可由正在运行的进程使用的代码。处理动态库使用的动态链接器在带有 ELF 格式可执行文件的 Linux 系统上称为 ld-linux.so。此外,如果系统配置为用户自行收集软件,将添加头文件来定义已安装库的接口。此外,Linux 系统上最广泛使用的软件库是 GNU C 库 (glibc)。还有许多其他库,如 Mesa 和 SDL。
    • C 标准库是使用 GNU C 库的系统执行 C 程序所必需的标准。已经开发了替代品,如 uClibc(为 uClinux 开发)、EGLIBC(Debian 曾经使用的 glibc 分支)和 musl。然而,前两个目前已不再维护。Android 使用自己的 C 库,称为 Bionic
  • 用户界面
    此外,用户界面称为 shell。它可以是 GUI(图形用户界面)、CLI(命令行界面)或与相关硬件连接的控件,这对于嵌入式系统来说很常见。桌面系统的默认用户界面是图形化的。但是,可以通过终端模拟器窗口或独立的虚拟控制台访问 CLI。
    命令行界面 shell 是基于文本的用户界面,它们同时使用文本进行输入和输出。占主导地位的 shell 是 bash(Bourne-Again Shell),在 Linux 中使用,最初是为 GNU 项目设计的。Linux 的几乎所有低级组件,包括许多用户空间部分,都仅使用 CLI。特别是,CLI 兼容延迟或重复任务的自动化,并提供非常简单的进程间通信。
    • GUI shell 是桌面系统上最受欢迎的用户界面,与 Xfce、Pantheon、LXDE、Cinnamon、MATE、GNOME 和 KDE Plasma 等广泛的桌面环境打包在一起,尽管还有许多其他用户界面可供选择。
    • 大多数流行的用户界面都与 X Window System 的概念协同工作,该概念称为 “X”
    • 它提供了网络透明性,并允许在另一台计算机上显示在某台系统上活动的图形应用程序,用户可以在其中与该应用程序进行交互。
    • 然而,某些 X Window System 扩展无法在网络上运行。
    • 有许多 X 显示服务器可用,其中 X.Org Server 是最著名的参考实现。
  • 视频输入基础设施
    目前,Linux 有两个内核-用户空间 API 来处理视频输入设备:用于电视接收的 DVB API 和用于广播和视频流的 V4L2 API。
    这种基础设施需要发展以更好地适应其他设备,因为不同设备的数量繁多且复杂,并且由于这些 API 管理的标准和格式数量庞大。一个更好的用户空间设备库也是用户空间应用程序能够处理设备支持的每种格式的关键。

Linux OS 的用途

关于开源/免费软件的几项定量研究集中在可靠性和市场份额等主题上,许多研究专门探讨 Linux。Linux 市场正在增长,预计到 2027 年 Linux OS 市场规模将增长 19.2%,达到 156.4 亿美元,而 2019 年为 38.9 亿美元。支持者和分析师将 Linux 的成功归因于其自由、低成本、可靠性以及免受供应商锁定。

What is Linux Operating System?
  • Web 服务器
    W3Cook 发布的数据显示,对 Alexa 顶级 100 万个域的统计表明,截至 2015 年 5 月,96.55% 的 Web 服务器使用 Linux,1.73% 使用 Windows,1.72% 使用 FreeBSD。
  • 笔记本电脑和台式机
    根据 Web 服务器统计数据,截至 2022 年 5 月,Linux 在台式机上的估计市场份额约为 2.5%。Microsoft Windows 的市场份额约为 75.5%,而 macOS 约为 14.9%。
  • 移动设备
    Android 已成为基于 Linux 内核的智能手机的首选操作系统。截至 2022 年 7 月,全球 71.9% 的智能手机使用 Android。此外,Android 也是平板电脑的流行操作系统,截至 2013 年占平板电脑销量的 60% 以上。
  • 电影制作
    多年来,Linux 一直是电影行业的首选平台。1997 年的《泰坦尼克号》是第一部在 Linux 服务器上发行的重要电影。自那时以来,包括工业光魔、维塔数码、皮克斯和梦工厂动画在内的大型工作室都已转向 Linux。
  • 政府用途
    Linux 发行版在许多国家和地方政府中也越来越受欢迎。喀拉拉邦甚至规定所有州立高中都必须在其系统上使用 Linux。中国在其 Loongson 处理器系列中独家使用 Linux 作为操作系统,以实现技术独立。
    西班牙的一些地区整合了他们自己的 Linux 发行版,在官方和教育机构中得到广泛使用。德国和法国也朝着采用 Linux 迈出了步伐。朝鲜的 Red Star OS 自 2002 年以来就基于 Fedora Linux 版本。

Linux OS 工作原理

Linux 操作系统遵循一种标准的通用设计,这是其多种发行版和变体的关键。每个 Linux 发行版都基于 Linux 内核,但可能根据以下因素而有所不同:

  • 内核版本:发行版可以配置为使用最新版本以添加新功能,或使用旧版本以保持更平衡。
  • 内核模块 (Kernel modules):这是可以从内核加载和卸载的软件,可以在不重新启动的情况下增强功能。通常,内核模块用于支持:
    • 设备驱动程序,使用代码管理连接设备的运行方式。
    • 文件系统驱动程序,使用代码管理内核如何与不同文件系统进行操作。
    • 系统调用,使用代码管理程序如何通过内核请求服务。
  • 配置选项:仅为特定用途编译的内核,例如,为没有任何有线网络设备驱动程序的无线设备编译内核,其中包含已配置的配置选项以仅添加文件系统或设备驱动程序。
    内核是运行 Linux 的所有系统共有的东西。Linux 的工作原理是:
  • 启动并加载 Linux 内核。
  • 内核在启动后处理所有系统输入和输出。系统启动后,即可初始化进程。
  • 系统可用于执行各种进程,包括通过命令行交互输入的命令、网络服务器功能、桌面应用程序或任何程序或应用程序,因为系统进程已被启动。

用户体验可能因 Linux 系统如何使用而大相径庭,同时内核可能由于一些编译差异和配置分歧而几乎相同。例如,Linux 的一些不同用户体验的用例包括:

  • 桌面生产力系统,例如软件开发人员或其他专业人士使用的系统。软件开发工作站可能针对性能进行了优化,而桌面工作站可能针对行政专业人员的桌面生产力工具的使用进行了优化。
  • 网络服务器可能甚至不包括用于直接访问的命令行窗口。通过网络终端或 Windows 会话远程处理这些无头服务器。服务器可供多人使用,但只能由授权的系统管理员直接访问。
  • 精简客户端允许用户使用轻量级设备体验丰富的桌面环境。这包括 Google Chromebooks 和 Raspberry Pi 单板计算机。

当使用 GUI 和桌面环境作为 GUI 时,Linux 的工作方式与任何 GUI 操作系统非常相似。通过单击图标可以启动应用程序和其他许多资源,并且可以使用触摸板或鼠标删除、复制或移动文件。

Linux 发行版

Linux 自开始开发以来就接受了自由软件基金会的 copyleft 条款,该条款产生了 GNU GPL。GPL 规定,任何被修改和免费使用的内容都必须免费分发。
有数百种 Linux 版本,也称为发行版(distros)或分发版。通常,发行版通过定义特定的目标、目标市场、功能或理念来区分自己。

有许多发行版专为特定目标功能而设计,例如安全、游戏、桌面、服务器或嵌入式设备,如 Raspberry Pi 系统。几乎所有现代发行版都可以即插即用且预编译,而其他发行版,如 Gentoo Linux,则由源代码组成,任何用户都可以在安装过程中在本地编译以使用其系统配置。

Linux OS 的优缺点

使用 Linux 的一些好处列出并解释如下:

What is Linux Operating System?
  • 开源:Linux 内核在 GNU GPL 的开源软件许可证下发布。大多数发行版都包含各种类别的应用程序,具有多种选项。此外,许多发行版包含来自制造商提供的专有软件,如设备驱动程序,以支持硬件。
  • 可靠性:Linux 被视为一个可靠的操作系统,并得到了大量安全补丁的支持。此外,Linux 被视为一个稳定的操作系统,这意味着它几乎可以在任何情况下运行。Linux 还可以处理意外输入和软件运行时出现的错误。
  • 许可成本:与 Apple macOS 或 Microsoft Windows 不同,Linux 没有准确的许可费用。虽然一些 Linux 供应商提供系统支持(收费),但操作系统本身可以免费使用和复制。一些 IT 组织通过将其服务器软件从商业操作系统迁移到 Linux 来提高了节省。
  • 向后兼容性:Linux 和许多开源软件倾向于频繁更新以进行功能和安全补丁,同时保持核心功能。即使使用软件更新,Shell 脚本和配置也可能保持不变。通常,Linux 和其他开源应用程序不会像商业软件供应商那样随着新版本而改变其操作模式,这些供应商会在新版本的操作系统中引入新的工作方式。
  • 多种选择:几乎无限的选择,众多可用的发行版,以及配置、编译和在几乎所有硬件平台上运行 Linux 的众多应用程序选项,可以为几乎所有应用程序开发 Linux。

Linux 的一些缺点是:

What is Linux Operating System?
  • 缺乏标准:Linux 没有可用的标准版本,这可能有利于针对特定应用程序优化 Linux,但不利于部署桌面映像和标准化服务器。大量选择可能因此导致支持复杂化。
  • 支持成本:虽然组织可以免费获取 Linux 而无需支付许可费,但支持并非免费。几乎所有企业级 Linux 分销商,如 Red Hat 和 SUSE,都提供支持合同。这些许可费根据情况可能会显著降低节省。
  • 专有软件:Microsoft Office 等 PC 生产力软件无法在 Linux 桌面中使用,并且许多专有软件可能不适用于 Linux 平台。
  • 陡峭的学习曲线:许多用户在使用 Linux 应用程序和 Linux 桌面时会感到困难。
  • 不支持的硬件:许多硬件制造商为其产品提供了 Linux 设备驱动程序,但许多制造商不提供。

可加载内核模块

LKM(Loadable Kernel Module,可加载内核模块)是一个目标文件,其中包含用于增强计算机中任何操作系统运行内核或基础内核的代码。通常,LKM 用于支持新硬件或文件系统,或添加系统调用。当不再需要可加载内核模块提供的功能时,可以卸载其功能以释放内存和其他资源。

大多数当前的 Microsoft Windows 和类 Unix 系统在不同名称下支持 LKM,例如 macOS 中的 kext(内核扩展)、FreeBSD 中的 kld(内核可加载模块)、VxWorks 中的 DKM(可下载内核模块)、Windows NT 中的内核模式驱动程序、HP-UX 中的动态加载内核模块,以及 AIX 中的内核扩展模块。它们也被简单地称为 KLM(或内核可加载模块)和 KMOD(或内核模块)。

  • LKM 的优点
    • 没有 LKM,操作系统就必须将所有可能的假定功能直接编译到基础内核中。
    • 其中许多功能将占用内存而未被使用,浪费内存,并且用户每次需要新功能时都必须重新创建和重新启动基础内核。
  • LKM 的缺点
    • 选择模块化内核而不是静态内核的一个小评估是碎片化带来的惩罚。
    • 始终,基础内核通过其设置例程解压到原始的连续内存中;因此,基础内核的代码没有碎片。
    • 当系统处于可以嵌入模块的任何状态时,例如,当挂载包含模块的文件系统时,插入新的内核代码很可能会导致内核碎片化,从而通过使用更多 TLB 条目引入轻微的性能损失,导致更多的 TLB 缓存未命中。

不同 OS 的使用

Linux

在 Linux 中,使用 modprobe 命令加载 LKM。LKM 位于 /usr/lib/modules 和 /lib/modules 中,自 2.6 版本以来具有 .ko(内核对象)扩展名。lsmod 命令用于列出已加载的内核模块。在某些严重情况下,如果系统由于损坏的模块而无法启动,可以通过更改内核启动参数列表来启用或禁用特定模块(例如,如果使用 GRUB,则在 GRUB 的启动菜单中点击“e”,然后修改内核参数行)。

  • Linuxant 争议

Linuxant,一家在 2004 年发布专有设备驱动程序作为内核模块(可加载)的咨询公司,尝试利用 MODULE_LICENSE 中的 null 终止符,如下面的代码片段所示:

MODULE_LICENSE("GPL\0for files in the \"GPL\" directory; for others, only LICENSE file applies");

  • 许可问题

从 Linux 维护者的角度来看,LKM 是从内核派生的工作。Linux 维护者允许分发专有模块,但允许符号仅对 GNU GPL 模块可用。

加载非 GPL 兼容或专有模块会使正在运行的内核中出现“污染”标志,这意味着维护者不太可能检查遇到的任何错误或问题。实际上,LKM 成为正在运行的内核的一部分,因此它们会产生专有模块无法检查的错误和内核数据结构。

FreeBSD

对于 FreeBSD,内核模块存储在 /boot/kernel/(用于与 OS 共享的许多模块)或 /boot/modules/(用于从 FreeBSD 包或 FreeBSD 端口安装的许多模块,或用于二进制或专有模块)中。通常,FreeBSD 内核模块的扩展名为 .ko。当设备启动后,可以使用 kldload 命令加载,使用 kldunload 命令卸载,并使用 kldstat 命令列出。此外,模块可以在内核启动之前通过加载程序加载,无论是手动还是自动(通过 /boot/loader.conf)。

macOS

在 macOS 中,一些可加载的内核模块可以自动加载。此外,可以通过 kextload 命令加载可加载的内核模块。它们可以通过 kextstat 命令显示。LKM 封装在扩展名为 .kext 的包中。随 OS 提供的模块保存在 /System/Library/Extensions 目录中;第三方提供的模块位于许多其他目录中。

NetWare

NetWare 内核模块称为 NLM(NetWare Loadable Module)。NLM 通过 LOAD 命令嵌入到 NetWare 内核中,并通过 UNLOAD 命令删除。modules 命令列出了当前加载的内核模块。NLM 可以位于 NetWare 服务器上定义的任何准确搜索路径中,并且文件名的扩展名为 .NLM。

VxWorks

可以创建一个 DKM(Downloadable kernel module,可下载内核模块)类型的项目,生成一个 .out 文件,该文件可以借助“ld”命令加载到内核空间。

Solaris

Solaris 包括一个内核模块(可配置)加载路径,默认情况下为 /platform/platform-name/kernel /kernel /usr/kernel。几乎所有模块都驻留在 /kernel 目录下的子目录中;那些未被 init 识别为启动系统所必需的,并且通常位于 /usr/kernel 目录中。当运行 DEBUG 内核时,会积极尝试卸载模块。

二进制兼容性

Linux 不为内核模块提供稳定的 ABI 或 API。这意味着不同的内核版本之间在功能和内部结构上存在许多差异,这可能导致兼容性问题。符号版本信息位于 ELF 模块(可加载)的 .modinfo 部分中。在加载模块之前,可以将此版本信息与活动内核的版本信息进行关联;如果版本不兼容,则无法加载模块。

包括 Windows、macOS、FreeBSD 和 Solaris 在内的其他操作系统,保持内核 ABI 或 API 相对稳定,因此忽略了这个问题。例如,针对内核 6.0 版本编译的 FreeBSD 内核模块可以在其他 6.x 版 FreeBSD(例如 6.4)上无需修改即可运行。但是,它们与其他版本不兼容,必须为使用 7.x 版 FreeBSD 进行修改,因为 ABI 和 API 兼容性仅在分支内管理。

安全性

虽然 LKM 是更改活动内核的合适方式,但攻击者可能会利用它们来逃避对他们文件或进程的检测,从而控制系统。以这种方式,许多 rootkit 使用 LKM。请注意,在几乎所有操作系统上;模块不会在特权提升方面提供帮助,因为加载可加载内核模块需要提升的特权,它们很难让攻击者方便地隐藏入侵。

Linux

Linux 允许通过 sysctl 选项禁用模块加载,即 /proc/sys/kernel/modules_disabled。一个称为 initramfs 的系统可以在启动时加载设备所需的特定模块,然后禁用模块加载。这使得安全性与单体内核几乎相同。攻击者可以修改内核二进制文件,如果他们能够修改 initramfs。

macOS

在 OS X Yosemite 及更高版本中,内核扩展需要使用包含特定“权限”的开发者证书进行代码签名。这种开发者证书仅由 Apple 根据请求授予,不会自动提供给所有 Apple Developer 成员。此功能,称为“kext 签名”,默认启用,并指示内核在存在未识别的内核扩展时避免启动。这是 OS X El Capitan 及更高版本中的系统完整性保护部分。

在内核扩展包中,如果属性 OSBundleAllowUserLoad 在旧版 macOS 的包属性列表中设置为 true,或者当 kext 签名被禁用时,可以使用非 root 用户加载 LKM。然而,如果包内的文件,如可执行代码文件,不归 root 组 wheel 所有,或者可以通过“other”或组指定,则加载 LKM 的尝试将失败。

Solaris

根据 Verified Boot 的策略设置,内核模块可以选择包含一个 ELF 加密签名部分,该部分在加载时进行身份验证。内核可以确保模块经过受信任证书集的加密签名。通过用户空间启动的内核模块加载仅通过受信任路径进行,前提是系统启用了 Immutable Global Zone 功能。


下一主题Linux 的优点