Linux和GNU系统

Richard Stallman 著

http://www.gnu.org/gnu/linux-and-gnu.zh-cn.html

更多信息,请同时参看GNU/Linux常见问题和为什么是GNU/Linux?

每天都有许多计算机用户使用一个被改动过的GNU系统,但是他们并没有意识到。经过一系列的事件,现在被广泛使用的GNU版本则经常被称作“Linux”,而且许多用户并不了解它基本上就是GNU系统,是由GNU工程开发的。

Linux确实存在,许多人都在使用它,但它仅仅是所用系统的一部分。Linux是内核:它是为你运行的其他程序分配计算机资源的程序。内核是操作系统的基本部分,但是它自己并无用处;它只能在完整的操作系统框架下才能发挥作用。Linux一般和GNU操作系统一起使用:整个系统基本上就是GNU加上Linux,或叫GNU/Linux。所有被叫做“Linux”的发行版实际上是GNU/Linux发行版。

许多用户并不了解作为内核的Linux和也被称作“Linux”的整个系统的区别。而不加区别地使用该名称并不能帮助人们对此的理解。这些用户常常认为Linus Torvalds在1991年凭借一些帮助完成了整个操作系统的开发。

程序员一般知道Linux是一个内核。但是他们一般也听到整个系统叫“Linux”,他们通常会设想的历史是整个系统要以内核命名。例如,许多人相信一旦Linus Torvalds完成了Linux内核,其用户就搜索一些自由软件来和内核一起工作,此时他们发现(没有特别的原因)构成一个类似Unix系统的大多数必要组件已经有了。

他们的发现不是巧合—它正是还没有全部完成的GNU系统。这些已经完成的自由软件加在一起就构成了完整的系统,因为GNU工程从1984年起就在做这件事。在GNU宣言中,我们已经阐明了开发一个自由的类似Unix的系统的目标,它叫做GNU。GNU工程的初始声明也勾画了GNU系统的一些原始计划。在Linux开始时,GNU几乎已经完成。

大多数自由软件项目以完成某项具体工作为目标。例如,Linus Torvalds编写一个类似Unix的内核(Linux);Donald Knuth编写一个文本排版软件(TeX);Bob Scheifler开发一个窗口系统(X Window系统)。测量该工程里各个程序的贡献是一件自然的事情。

如果我们这样测量GNU工程的贡献,我们会得出什么结论?一个CD-ROM提供商发现在他们的“Linux发行版”中,GNU软件占单一最大的比重,大约是整个源代码的28%,其中包括一些关键性主要部件,没有它们,就没有整个系统。Linux自身占大约3%。(这个比例在2008年也差不多:在gNewSense的“主”库中,Linux占1.5%,而GNU包占15%。)所以如果你要根据谁的代码多来命名系统,最合适的单个选择是“GNU”。

但是这不是考虑此问题的最深刻方法。GNU工程过去不是、现在也不是,一个开发专门软件包的项目。它不是一个开发C编译器的工程,不过我们做了。它也不是一个开发文本编辑器的工程,我们也做了。GNU工程是要开发一个完全自由的类似Unix的系统:GNU。

许多人已经为系统中的自由软件作出了重大贡献,他们都应该获得荣誉。但GNU是一个整合系统—而不是一些实用程序集合的原因是,GNU工程的最初目标就是做一个完整系统。我们曾经为完成一个完整的自由系统列了一个所需程序的清单,而且我们系统地寻找、编写、或者征询别人编写清单上的每一个程序。我们编写了关键的但是十分枯燥的(1)主要部件,因为这是系统所必需的。有些系统部件,比如编程工具,自己也变成程序员使用的流行工具,但是我们还编写了许多不是工具的部件(2)。我们甚至还开发了一个国际象棋游戏,叫GNU Chess,因为一个完整的系统也需要游戏。

到了90年代初期,我们曾经把除了内核以外的东西放到一起组成了一个系统。我们也在开始开发一个内核,称为GNU Hurd,运行在Mach1之上。开发这个内核比我们的预期要难得多;GNU Hurd在2001年开始可以稳定工作,但是距离能够被人们正常使用还有很长的路要走。

庆幸的是,我们不必再等Hurd了,因为有了Linux。当Linus Torvalds在1992年使Linux成了自由软件,它填补了GNU系统的一个重要空白。人们可以把Linux和GNU系统结合起来组成一个完整的自由系统—一个带有Linux的GNU系统。换句话说,就是GNU/Linux系统。

把它们组合到一起并不是一个简单的工作。有些GNU部件(3)需要作大量的修改才能适应Linux。把系统集成到一个完整的发行版本中、使之“能够直接安装并工作”也是一项艰巨的工作。它需要考虑如何安装和启动系统—我们那时还未处理此问题,因为我们还没有走到那一步。因此,那些开发了不同的发行版的人们作出了许多重要的工作。但是这些工作的属性是,它们终究会被某些人做的。

GNU工程支持GNU/Linux系统,就象支持其GNU系统一样。FSF为重写与Linux相关的GNU C库提供资金,以至于它们现在可以很好地集成在一起,最新版本的GNU/Linux系统使用当前库而无需修改。FSF也为早期Debian GNU/Linux的开发提供资金。

今天有很多不同的GNU/Linux系统(通常叫做“发行版”)。它们大多数包含了非自由软件—它们的开发者遵循的是和Linux相关的“开源”哲学,而不是GNU的“自由软件”哲学。然而,也有完全自由的GNU/Linux发行版。FSF支持其中一些发行版相关的电脑及其周边件。

制作一个自由的GNU/Linux发行版不止是剔除非自由软件。现在,常规的Linux版本也带有非自由程序。这些程序会在系统启动时加载到I/O(输入输出)设备,它们以很长的数字形式包含在Linux的“源代码”中。所以,维护自由的GNU/Linux发行版现在承担着维护一个自由版Linux的责任。

无论你是否使用GNU/Linux,请不要含糊不清地使用“Linux”这一名称来混淆大众。Linux是一个内核,是系统的主要基本部件之一。整个系统基本上是GNU系统,加上Linux。如果你说的是这个组合,请称之为“GNU/Linux”。

如果你想为“GNU/Linux”提供参考链接,本页面和http://www.gnu.org/gnu/the-gnu-project.html是好的选择。如果你说的是作为内核的Linux,要为它提供参考链接,http://foldoc.org/linux是一个好的URL。

后记

除了GNU,还有一个独立进行的工程开发了一个自由的类似Unix的操作系统。这个系统是BSD,它是由UC Berkeley开发的。在80年代,BSD还不是自由的,但是它在90年代初变成了自由软件。今天,一个自由的操作系统(4)差不多如果不是GNU系统的派生版本,就是BSD系统的派生版本。

人们有时会问BSD是否也是一个GNU的派生版本,像GNU/Linux那样。BSD的开发者受到GNU工程的激励而将他们的代码变成了自由软件,尤其受到来自GNU的活动家的明确吸引和帮助,但是他们的代码和GNU并不重合。BSD系统现在也使用一些GNU程序,正如GNU系统及其派生版使用一些BSD程序一样;然而,整体来看,他们是两个独立发展的不同系统。BSD的开发者并没编写一个内核,并将之添加到GNU系统,进而起个譬如叫GNU/BSD的名字,并不是这个情况。(5)

注:

  1. 这些关键但枯燥的部件包括GNU汇编器(GAS)和连接器(GLD),他们现在都是GNU Binutils软件包的一部分,以及GNU tar,还有其他许多软件。
  2. 比如,Bourne Again SHell(BASH),PostScript解释器Ghostscript,和GNU C库都不是编程工具。GNUCash、GNOME和GNU Chess也不是。
  3. 例如,GNU C库。
  4. 自从本文出版以来,有一个几乎完全自由的类似Windows的系统已经开发完成,但是从技术上说,它根本不像GNU或Unix,所以它不影响这个问题。Solaris内核的大部分都变成了自由软件,但是如果你要根据这些制作一个自由系统,除了要添加内核缺少的部分,你还需要把它添加到GNU或BSD中去。
  5. 另一方面,自从本文发表之后,GNU C库已经移植到多个BSD内核版本,这就使组合GNU系统和这些内核变得直截了当。正如GNU/Linux一样,这些也是GNU系统的派生版本,而且他们也因此根据内核的不同,被称为,比如,GNU/kFreeBSD和GNU/kNetBSD。普通桌面版本用户很难分辨出GNU/Linux和GNU/*BSD。

译注

  1. Mach,一个由卡内基.梅隆大学开发的微内核系统。其中一个衍生版本成为GNU Hurd的内核。

【转帖】Linux和GNU系统的更多相关文章

  1. GNU/Linux的GNU是什么意思

    这个组织中黑客云集,而且多是掌握核心技术的真正高手,他们的作品多是编译器.词法/语法分析器.底层函数库等大作.更重要的不是他们的技术,而是他们的哲学!他们的哲学就是技术上的“共产主义”——人人为我,我 ...

  2. 世纪大争论:Linux还是GNU/Linux?

    我们在网上已经习惯用“Linux”来称呼Linux操作系统了,然而,偶尔也用“GNU/Linux”来称呼和指代同样的操作系统和软件.同时人们也在争论这两种称呼哪个更合适. 本文将不会选边站队,仅力图向 ...

  3. Monitorix:一款面向Linux的轻型系统和网络监测工具

    Monitorix是一款功能非常强大的免费开源轻型工具,目的在于监测Linux中的系统和网络资源.它可以定期收集系统和网络数据,并使用自己的Web界面,通过图形显示相关信息.Monitorix让用户可 ...

  4. x86、Linux、GNU、GNOME是什么

    一.指令集架构: 指令集架构(英语:Instruction Set Architecture,缩写为ISA),又称指令集或指令集体系,是计算机体系结构中与程序设计有关的部分,包含了基本数据类型,指令集 ...

  5. 浅析 Linux 初始化 init 系统

    近年来,Linux 系统的 init 进程经历了两次重大的演进,传统的 sysvinit 已经逐渐淡出历史舞台,新的 UpStart 和 systemd 各有特点,越来越多的 Linux 发行版采纳了 ...

  6. 【转】Linux 初始化 init 系统 [sysvinit systemd upstart]

    http://www.ibm.com/developerworks/cn/views/linux/libraryview.jsp?sort_by=&show_abstract=true& ...

  7. Linux下获得系统时间的C语言实现

    Linux下获得系统时间的C语言的实现方法 #include<time.h> //C语言的头文件#include<stdio.h> //C语言的I/O   int main() ...

  8. 浅析 Linux 初始化 init 系统,第 1 部分: sysvinit 第 2 部分: UpStart 第 3 部分: Systemd

    浅析 Linux 初始化 init 系统,第 1 部分: sysvinit  第 2 部分: UpStart 第 3 部分: Systemd http://www.ibm.com/developerw ...

  9. 手把手VirtualBox虚拟机下安装rhel6.4 linux 64位系统详细文档

    下面演示安装的是在VirtualBox里安装rhel 6.4 linux 64位系统. 一.VirtualBOX 版本. 二.虚拟机的配置. 1.现在开始演示安装,一起从零开始.点击“新建”,创建新的 ...

随机推荐

  1. Unable to find the requested .Net Framework Data Provider

    换了个系统后发现VS2010和VS2012都有同样问题,在SQL EXPLORER 里连不上SQL Server,这也导致了打不开 dbml文件,会报错: The operation could no ...

  2. Codeforces 940 E.Cashback (单调队列,dp)

    Codeforces 940 E.Cashback 题意:一组数,要分为若干个区间,每个区间长度为ki(1<=ki<=n),并且对于每个区间删去前ki/c(向下取整)个小的数(即对区间升序 ...

  3. 1.5 JAVA的IO操作

    1.5 JAVA的IO操作 参考链接:https://www.runoob.com/java/java-files-io.html 一.JAVA的IO操作 由于JAVA引用外界的数据,或是将自身的数据 ...

  4. Leetcode题目78.子集(回溯-中等)

    题目描述: 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3],   [1] ...

  5. 2018-2019-2 20165330《网络对抗技术》Exp7 网络欺诈防范

    目录 基础问题 相关知识 实验目的 实验内容 实验步骤 实验中遇到的问题 实验总结与体会 实验目的 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 返回目录 实验内容 简 ...

  6. session cookie傻傻分不清

    做了这么多年测试,还是分不清什么是cookie,什么是session?很正常,很多初级开发工程师可能到现在都搞不清什么是session,cookie相对来说会简单很多. 下面这篇文章希望能够帮助大家分 ...

  7. Navicat 12 for MySQL最新版激活(注册机)(转)(亲测有效)

    Navicat 12 for MySQL最新版激活(注册机)(转)(亲测有效) 一.总结 一句话总结: 1.卸载自己机器上面的Navicat,安装下载的包里面的Navicat安装包,不然可能不行 2. ...

  8. chrome中如何查看元素的hover事件

    chrome中如何查看元素的hover事件 一.总结 一句话总结: Elements->Styles里面可以看到":hov":点开选择":hover"就可 ...

  9. linux下如何更新当前的容器镜像?

    docker commit <container_id> <container_image_name>

  10. SpringCloud(七)之SpringCloud的链路追踪组件Sleuth实战,以及 zipkin 的部署和使用

    一.前言 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案 ,并且兼容了zipkin,提供了REST API接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序 . ...