所以GNU/Linux是一个操作系统,至少由几个程序组成:Linux kenel、gcc、gnu-binutils、Gnome桌面等。
是什么造就了 Linux 发行版 GNU?是编译内核的工具吗?是发行版附带的工具吗?
是否存在基于 Linux 但不是 GNU 的功能齐全的桌面操作系统?
答案1
这自由软件基金会认为大多数 Linux 发行版实际上都是 GNU 系统,恰好使用 Linux 内核。他们的这一主张基于以下事实:在 Linux 出现之前,GNU 是一个开发自由操作系统的长期项目,并且内核只是最后一个缺失的部分。他们是对的,因为几乎所有基于 Linux 的桌面和服务器发行版都至少使用一些 GNU 组件,也许最重要的是GNU C 库(glibc),GNU 核心实用程序(coreutils) 和重击壳。此外,Linux 内核开发本质上与 GCC 相关,因为GCC 扩展的利用。
一些嵌入式系统,也许最著名的是 Google 的 Android,不使用任何 GNU 组件或库。例如,在 Android 中,GNU C 库被 Google 自己的、基于 BSD 的 Bionic C 库取代。 FSF 同意将此类系统称为“GNU 系统”或“GNU/Linux”,但另一方面他们也不希望这些系统仅仅被称为“Linux”系统。至少我们可以得出这样的结论:使用 GNU 工具构建内核似乎已经达成共识:不是使系统成为“GNU 系统”。
答案2
GNU/Linux 术语的历史可以追溯到 20 世纪 90 年代初。
1991 年,Linus Torvalds 在赫尔辛基的卧室里开始了 Linux 内核项目。不久之后,在互联网兴起的帮助下,Linux 内核开始获得巨大的关注。
Richard Stallman 的 GNU 项目当时仍计划使用 HURD 微内核作为计划中的 GNU 操作系统的内核。然而,当 Linux 发行版(基于 Linux 内核的免费类 Unix 操作系统)开始围绕新的 Linux 内核项目形成时,斯托曼开始感兴趣。 1993 年 Debian 项目在 Ian Murdock 的领导下启动时,FSF 为这个年轻的项目提供了一些财政支持。然而,Debian 开发人员很快就与 Stallman 和 FSF 分道扬镳,部分原因是技术问题。例如,一个问题是 Stallman 希望在程序中保留调试符号,而 Debian 希望删除它们。
Debian 和 FSF 分道扬镳后,斯托曼要求 Debian 将自己称为 GNU/Linux。这个请求是向布鲁斯·佩伦斯提出的,因为默多克已将领导权移交给了他。由于这些组织已经友好地分手,并且有着共同的目标,Debian 开发人员按照他的要求做了。当然,Stallman 确实独立推广了此类名称,但实际的基于 Linux 的操作系统在引用自己时的合作对于推广此类名称的使用具有重要意义。
Stallman 给出的理由包括:(a) 除了 Linux 内核之外,系统的核心主要是 GNU 工具,(b) Linux 内核在某种意义上是 GNU 项目的顶峰/完成,GNU 项目一直在努力获得一个工作内核已经有一段时间了,所以它应该使用这个名称作为承认和提醒人们 GNU 项目理想的一种方式。原因 (a) 往往被更频繁地提及,尽管当时并不完全正确,现在更不正确,尽管基于 Linux 的操作系统的明显重要部分依赖于 GNU 工具,例如 bash、gcc、binutils、gdb, libc 等,在某些情况下这些可以被其他工具替代。因此,这样的论点至少是值得商榷的,而且确实已经引起了很多争论。
据我所知,只有 Debian 及其(部分)衍生版本(跟随其父版本)将自己称为 GNU/Linux。然而,其他所谓的 Linux 发行版,如 Fedora、Gentoo 等,本质上与 Debian 没有什么不同——它们大多是相同的软件。因此,人们同样有充分的理由将它们称为 GNU/Linux。
没有很多系统在没有 GNU 用户空间的情况下使用 Linux 内核,因为两者在很大程度上是一起开发的,并且以各种方式交织在一起。 (例如,Linux 内核是用 gcc 的扩展 (GNU) C 编写的,并且不会使用标准 C 编译器构建。)正如 Thomas 所说,最明显的例子是 Android,但由于它已被 Google 大量分叉尽管有人谈论未来的合并/协调,但将 Android 内核称为 Linux 是否正确仍值得怀疑。
顺便说一句,不幸的是 Stallman 和 FSF 显然对 GNU/Linux 术语的使用相当严格。例如,乔纳森·科贝特在 LWN 评论中写道FSF 拒绝与他交谈,除非他使用 GNU/Linux 一词。 Jon 除了是 LWN 创始人之外,还是一位备受尊敬的资深内核开发人员。评论全文如下:
需要澄清的是:我们多年前就不再向 FSF 征求意见,因为如果我们事先没有承诺我们会说什么以及我们会使用哪些术语,FSF 就会拒绝与我们交谈。我们不愿意做出这样的承诺。如果 FSF 对此类事情的政策发生变化,我们将很高兴知道。
这显然是对 GNU/Linux 术语等方面的坚持的引用。
Glyn Moody 的《Rebel Code》第 6 章(“Boot then Root”)详细介绍了上述历史。
答案3
操作系统是内核和用户态的组合。基本上,内核管理硬件,而用户区为用户提供全面的界面。
在常见的 GNU/Linux 发行版中,Linux提供内核,而GNU项目带来用户层工具。 GNU 的诞生早于 Linux,并提供了大量实用程序来构建完整的操作系统。
然而,他们缺少一个内核。虽然他们有赫德内核,准备时间太长了。进而来了Linux在巨大热情的帮助下,它的发展速度比赫德更快。
您现在拥有来自两个不同项目的用户空间和内核。由于每个人对于拥有一个操作系统都是必不可少的,为什么不命名该协会GNU/Linux那么每个项目都有自己的功劳吗?
您还有其他用户区,例如 BSD utils 或忙碌盒。然而,与 GNU 实用程序相比,它们或多或少是完整的,并且某些软件只能在 GNU 用户空间中运行。例如,大多数 BSD 操作系统都使用 GCC 作为编译器,而LLVM很快就会改变这种状况。
作为通用操作系统,您可以运行具有 FreeBSD 内核和 GNU 用户区的 Debian。
答案4
是什么造就了 Linux 发行版 GNU?是编译内核的工具吗?是发行版附带的工具吗?
是的,是的。内核是一个整体独立的可执行文件。一切其他位于“用户区”。一般来说,用户态应用程序至少使用一个系统库,即标准 C 库。1除了 各种实用函数之外,它还提供对系统调用的访问——请求系统(即内核)执行的操作有些东西——即使是非常基本的任务(例如处理文件)也是必需的。Linux 中使用的 C 库实现是 glibc——GNU C 库。
Linux 内核本身是用 C 语言编写的,并且还需要一个 C 库才能工作——除了在这种情况下,必要的部分是在内部编译的,而不是在外部编译的。通常用于此目的的编译器是 GCC(“GNU 编译器集合”),而 C 库是 glibc。
由于几乎所有用户空间都是针对 glibc 编译的,因此它是系统上继内核之后最重要的东西之一。另一个重要组件是链接器,它将可执行文件连接到外部库。那也是 GNU 产品。
为了说明这一点,您可以使用ldd
各种可执行文件,包括库(它们是可执行的,但不能单独使用)。正如手册页中所述,“ldd 打印命令行上指定的每个程序或共享库所需的共享库”。例如:
> ldd /bin/bash
linux-vdso.so.1 => (0x00007fff7348e000)
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fdbdae7f000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fdbdac7b000)
libc.so.6 => /lib64/libc.so.6 (0x00007fdbda8c3000)
/lib64/ld-linux-x86-64.so.2 (0x00007fdbdb0c8000)
注意“libc.so.6”——这是 glibc(不要将它与 glib 混淆,glib 是 Linux 的另一个基础 GNU 产品,但不像 glibc 那么基础)。如果您查看提到的所有其他内容(除了第一个内容,如下所述),您会发现它们都链接到 libc 本身。让我们看看 libc.so.6 本身:
> ldd /lib64/libc.so.6
/lib64/ld-linux-x86-64.so.2 (0x00007f9cefa04000)
linux-vdso.so.1 => (0x00007fffb21ff000)
“ld-linux-x86-64.so.2”是上面提到的链接器(通常是ld
,并且有一个手册页)。你不能在上面运行 ldd,但file
说它是动态链接的,我猜想是 libc(这听起来可能是循环的,但事实并非如此)和 linux-vdso。最后一个有点有趣,因为您会注意到=>
.那是因为它实际上是内核的一部分。
C 库,AFAIK,是仅有的系统上不链接到 C 库的共享对象——它位于中心整个混乱的局面。甚至其他编译语言的基础库也使用libc,例如:
> ldd libstdc++.so.6.0.17
linux-gate.so.1 => (0xf77b8000)
libm.so.6 => /lib/libm.so.6 (0xf7684000)
libc.so.6 => /lib/libc.so.6 (0xf74d2000)
/lib/ld-linux.so.2 (0xf77b9000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xf74b5000)
请注意,库和链接器具有通过符号链接实现的各种假名(例如,/lib64/ld-linux-x86-64.so.2 实际上是/lib64/ld-2.15.so)。
另请注意gcc
,“本机”编译器(因为它编译内核和 C 库)不必存在于系统上,但 libc 和 ld 可以,否则什么都无法工作。
这并不是 GNU 提供的唯一一组东西。他们还负责bash
shell 和其他核心工具和实用程序,使系统类似于 *nix 并(大部分)兼容 POSIX。 GNOME 是最早的 Linux DE 之一,也是使用最广泛的 Linux DE 之一。还有前面提到的 glib,它提供了许多高级函数来支持 GNOME 和其他 DE 等。 GNOME 是基于 GTK 构建的,GTK 最初是为 GIMP 开发的。 GTK 也是其他各种 DE 的基础; GTK 和 GIMP 也是 GNU 产品。他们做了很多事情。
1有一种用户态应用程序不链接到任何库;这些被称为静止的可执行文件,这本质上意味着它们已将该库的部分内容编译到其中(就像内核一样)。