第 1 章 Linux操作系统概述

第 1 章 Linux操作系统概述

Linux操作系统是目前发展最快的操作系统,自1991年诞生到现在的二十多年间,Linux逐步完善和发展。Linux操作系统在服务器、嵌入式等方面获得了长足的发展,并在个人操作系统方面有着广范的应用,这主要得益于其开放性。本章将对Linux的发展进行介绍,主要包括如下内容:

  • Linux发展的历史,以时间为主线对Linux的诞生进行介绍;

  • 分析Linux和UNIX操作系统的异同;

  • 介绍常用的几种Linux发行版本的特点;

  • 对Linux操作系统的系统架构进行简单的介绍;

  • 介绍GNU通用公共许可证及其特点。

通过本章的阅读,读者可以对Linux的发展历史和Linux操作系统的基本特点有一个简单的认识。

1.1 Linux发展历史

Linux操作系统于1991年诞生,目前已经成为主流的操作系统之一。其版本从开始的0.01版本到目前的3.9.4版本经历了二十多年的发展,从最初的蹒跚学步的“婴儿”成长为目前在服务器、嵌入式系统和个人计算机等多个方面得到广泛应用的操作系统。

1.1.1 Linux的诞生和发展

Linux的诞生和发展与个人计算机的发展历程是紧密相关的,特别是随着Intel的i386个人计算机的发展而逐步成熟。在1981年之前没有个人计算机,计算机是大型企业和政府部门才能使用的昂贵设备。IBM公司在1981年推出了个人计算机IBM PC,从而造成个人计算机的发展和普及。刚开始的时候,微软帮助IBM公司开发的MS-DOS操作系统在个人计算机中占有统治地位。随着IT行业的发展,个人计算机的硬件价格虽然逐年在下降,但是软件特别是操作系统的价格一直居高不下。

与个人计算机对应,在大型机上的主流操作系统是UNIX,而UNIX操作系统对操作系统的发展有诸多障碍:

  • UNIX的经销商为了寻求高利率,将价格抬得很高,个人计算机的用户根本不可能靠近它,不利于操作系统的普及。

  • UNIX操作系统的源代码具有版权,虽然贝尔实验室许可可以在大学的教学中使用UNIX源代码,但是因为版权问题源代码一直不能公开。对于广大的PC用户,软件行业的供应商一直没有一个很好的办法来解决UNIX操作系统普及性问题的方法。

在操作系统的发展受到版权限制的时候,出现了Minix操作系统,这个操作系统由一本书来详细地描述它的实现原理。由于书中对Minux操作系统的描述非常详细,并且很有条理性,当时几乎全世界的计算机爱好者都在看这本书来理解操作系统的原理,其中包括Linux系统的创始者Linus Torvalds。

注意:当时苹果公司的Mac系列操作系统,不论从性能方面还是从用户的易用性方面来说都是最好的,但是其价格也是最高的。

1.1.2 Linux名称的由来

Linux操作系统的名称最初并没有被称做Linux。Linus给他的操作系统取的名字是Freax,这个单词的含义是怪诞的、怪物、异想天开的意思。当Torvalds将他的操作系统上传到服务器ftp.funet.fi上的时候,这个服务器的管理员Ari Lemke对Freax这个名称很不赞成,所以将操作系统的名称改为了Linus的谐音Linux,于是这个操作系统的名称就以Linux流传下来。

在Linus的自传《Just for Fun》一书中,Linus解释说:“Ari Lemke,他十分不喜欢Freax这个名字。倒喜欢我当时正在使用的另一个名字Linux,并把我的邮件路径命名为pub OS/Linux。我承认我并没有太坚持,但这一切都是他搞的,所以我既可以不惭愧地说自己不是那么以个人为中心,但是也有一点个人的荣誉感。而且个人认为,Linux是个不错的名字。”实际上,在早期的源文件中仍然使用Freax作为操作系统的名字,可以从Makefile文件中看出此名称的一些蛛丝马迹。

关于Linux的发音有各种说法,例如['linΛks],但是按照Torvalds的说法,Linux中Li中i的发音类似于Minix中i的发音,而nux中u的发音类似于英文单词pronounce中第一个o的发音。根据Torvalds对此的解释,依照国际音标其发音为['linэks],与“喱呐科斯”类似。在网络上有一份Torvalds本人说话的音频,音频中的内容为“Hello, this is Linus Torvalds, and I pronounce Linux as Linux”,其下载网络地址为http://www.paul.sladen.org/pronunciation/torvalds-says-linux.wav

对于Linux发音的解释,还有一份Torvalds本人的解说片段,这一片段发音的视频可以从如下的URL下载:http://www.Linuxweblog.com/Linux-pronunciation

1.2 Linux的发展要素

Linux操作系统是UNIX的一种典型的克隆系统。在Linux诞生之后,借助于Internet网络,在全世界计算机爱好者的共同努力下,成为目前世界上使用者最多的一种类似UNIX的操作系统。在Linux操作系统的诞生、成长和发展过程中,以下5个方面起到了重要的作用:UNIX操作系统、Minix操作系统、GNU计划、POSIX标准和Internet网络。

1.2.1 UNIX操作系统

UNIX操作系统于1969年在Bell实验室诞生,它是美国贝尔实验室的Ken.Thompson和Dennis Ritchie在DEC PDP-7小型计算机系统上开发的一种分时操作系统。

Ken Thompson开发UNIX操作系统的初衷是为了能在一台闲置的PDP-7计算机上运行星际旅行游戏。他在1969年夏天花费一个月的时间开发出了UNIX操作系统的原型。最开始,开发UNIX操作系统使用的是BCPL语言(即通常所说的B语言),后来Dennis Ritchie于1972年使用C语言对UNIX操作系统进行了改写。同时UNIX操作系统在大学中得到广泛的推广,并将UNIX的授权分发给多个商业公司。

自从UNIX操作系统从实验室走出来之后,得到了长足的发展。目前已经成为大型系统的主流操作系统,现在几乎每个主要的计算机厂商都有其自有版本的UNIX。UNIX是一个功能强大、性能全面的、多用户、多任务的分时操作系统,在从巨型计算机到普通PC等多种不同的平台上,都有着十分广泛的应用。

通常情况下,比较大型的系统应用,例如银行和电信部门,一般都采用固定机型的UNIX解决方案:在电信系统中以SUN(SUN公司已经被Oracle公司收购)的UNIX系统方案居多,在民航里以HP的系统方案居多,在银行里以IBM的系统方案居多。

Linux是一种UNIX的克隆系统,采用了几乎一致的系统API接口。特别是网络方面,二者接口的应用程序几乎完全一致。

1.2.2 Minix操作系统

Minix操作系统也是UNIX操作系统的一种克隆系统,它由荷兰Amsterdam的Vrije大学著名教授Andrew S.Tanenbaum于1987年开发完成。Minux操作系统主要用于学生学习操作系统原理时的教学。在当时Minix操作系统在大学中是免费使用的,但是其他用途则需要收费。目前Minix操作系统已经全部是免费的,可以从许多FTP上下载,目前Minix 3是主流版本。

由于Minix操作系统提供源代码,并且与操作系统相结合,有一本高质量的书籍介绍其实现原理,在当时全世界的大学中形成了学习Minix操作系统的风气,Linus刚开始就是参照此系统在1991年开始开发Linux的。

实际上,Minix操作系统并不是很优秀,但是这个操作系统提供了C语言和汇编语言的源代码。而当时的UNIX操作系统源代码除了极少的范围外一直是保密的,Minix操作系统对程序员来说是一个福音。为了可以让学生在一个学期内能够学完操作系统的课程,AST保持了Minix操作系统的小型化,没有接受各界对Minix扩展的要求,而正是这个原因激发了Linus编写Linux操作系统。

1.2.3 POSIX 标准

POSIX(Portable Operating System Interface for Computing Systems)是由IEEE和ISO/IEC开发的一套标准。POSIX标准是对UNIX操作系统的经验和实践的总结,对操作系统调用的服务接口进行了标准化,保证所编制的应用程序在源代码一级可以在多种操作系统上进行移植。

在20世纪90年代初,POSIX标准的制定处于最后确定的投票阶段,而Linux正处于开始的诞生时期。作为一个指导性的纲领性标准,Linux的接口与POSIX相兼容。

1.3 Linux与UNIX的异同

Linux是UNIX操作系统的一个克隆系统,没有UNIX就没有Linux。但是,Linux和传统的UNIX有很大的不同,两者之间的最大区别是关于版权方面的:Linux是开放源代码的自由软件,而UNIX是对源代码实行知识产权保护的传统商业软件。两者之间还存在如下的区别:

  • UNIX操作系统大多数是与硬件配套的,操作系统与硬件进行了绑定;而Linux则可运行在多种硬件平台上。

  • UNIX操作系统是一种商业软件(授权费大约为5万美元);而Linux操作提供则是一种自由软件,是免费的,并且公开源代码。

  • UNIX的历史要比Linux悠久,但是Linux操作系统由于吸取了其他操作系统的经验,其设计思想虽然源于UNIX但是要优于UNIX。

  • 虽然UNIX和Linux都是操作系统的名称,但UNIX除了是一种操作系统的名称外,作为商标,它归SCO所有。

  • Linux的商业化版本有Red Hat Linux、SuSe Linux、slakeware Linux、国内的红旗Linux等,还有Turbo Linux;UNIX主要有Oracle的Solaris,IBM的AIX,HP的HP-UX,以及基于x86平台的SCO UNIX/UNIXware。

  • Linux操作系统的内核是免费的;而UNIX的内核并不公开。

  • 在对硬件的要求上,Linux操作系统要比UNIX要求低,并且没有UNIX对硬件要求的那么苛刻;在对系统的安装难易度上,Linux比UNIX容易得多;在使用上,Linux相对没有UNIX那么复杂。

总体来说,Linux操作系统无论在外观上还是在性能上都与UNIX相同或者比UNIX更好,但是Linux操作系统不同于UNIX的源代码。在功能上,Linux仿制了UNIX的一部分,与UNIX的System V和BSD UNIX相兼容。在UNIX上可以运行的源代码,一般情况下在Linux上重新进行编译后就可以运行,甚至BSD UNIX的执行文件可以在Linux操作系统上直接运行。

1.4 操作系统类型选择和内核版本的选择

要在Linux环境下进行程序设计,首先要选择一款适合自己的Linux操作系统。本节对常用的发行版本和Linux内核进行了介绍,并简要讲解了如何定制自己的Linux操作系统。

1.4.1 常见的不同公司发行的Linux异同

Linux的发行版本众多,曾有人收集过超过300种的发行版本。当然,不能在本书中介绍众多的发行版特点,这超出了本书的范围。本小节将对最常用的发行版本进行简单的介绍,表1.1为用户经常使用的版本。读者可以去相关网址查找,选择适合的版本使用。本书所使用的Linux为Ubuntu。

表 1.1 常用Linux发行版本特点

版本名称

网址

特点

软件包管理器

Debian Linux

www.debian.org

开放的开发模式,并且易于进行软件包升级

apt

Fedora Core

www.redhat.com

拥有数量庞大的用户,优秀的社区技术支持,并且有许多创新

up2date(rpm), yum(rpm)

CentOS

www.centos.org

CentOS是一种对RHEL(Red Hat Enterprise Linux)源代码再编译的产物,由于Linux是开发源代码的操作系统,并不排斥基于源代码的再分发,CentOS就是将商业的Linux操作系统RHEL进行源代码再编译后分发,并在RHEL的基础上修正了不少已知的漏洞

rpm

SUSE Linux

www.suse.com

专业的操作系统,易用的YaST软件包管理系统

YaST(rpm),第三方apt(rpm)软件库(repository)

Mandriva

www.mandriva.com

操作界面友好,使用图形配置工具,有庞大的社区进行技术支持,支持NTFS分区的大小变更

rpm

KNOPPIX

www.knoppix.com

可以直接在CD上运行,具有优秀的硬件检测和适配能力,可作为系统的急救盘使用

apt

Gentoo Linux

www.gentoo.org

高度的可定制性,使用手册完整

portage

Ubuntu

www.ubuntu.com

优秀易用的桌面环境,基于Debian构建

apt

1.4.2 内核版本的选择

内核是Linux操作系统的最重要的部分,从最初的0.95版本到目前的3.9.4版本,Linux内核开发经过了20多年的时间,其架构已经十分稳定。Linux内核的编号采用如下编号形式:

主版本号.次版本号.主补丁号.次补丁号

说明:在2011年,Linux Kernel 3.0发布。随后,一系列以3开头的内核版本被发布更新。

例如2.6.34.14各数字的含义如下:

  • 第1个数字(2)是主版本号,表示第2大版本;

  • 第2个数字(6)是次版本号,有两个含义:既表示是Linux内核大版本的第6个小版本,同时因为6是偶数表示为发布版本(奇数表示测试版);

  • 第3个数字(34)是主版本补丁号,表示指定小版本的第34个补丁包;

  • 第4个数字(14)是次版本补丁号,表示次补丁号的第3个小补丁。

在安装Linux操作系统的时候,最好不要采用发行版本号中的小版本号是奇数的内核,因为开发中的版本没有经过比较完善的测试,有一些漏洞是未知的,有可能造成使用中不必要的麻烦。

注意:Debian Linux内核的版本稍有不同,如2.6.18-3,可以发现多了一组数字(3),该数字是构建号。每个构建号可以增加少量新的驱动程序或缺陷修复。

Linux内核版本的开发源代码树目前比较通用的是2.6.xx的版本,当然,有部分2.4的版本仍在使用。与2.4版本的内核相比较,2.6版本内核具有如下优势:

  • 支持绝大多数的嵌入式系统,加入了之前嵌入式系统经常使用的μClinux的大部分代码,并且子系统的支持更加细化,可以支持硬件体系结构的多样性,可抢占内核的调度方式支持实时系统,可定制内核。

  • 支持目前最新的CPU,例如Intel的超线程、可扩展的地址空间访问。

  • 驱动程序框架变更,例如用.ko替代了原来的.o方式,消除内核竞争,更加透明的子模块方式。

  • 增加了更多的内核级的硬件支持。

本书中的环境对Linux的内核没有特殊要求,因此读者在选择内核版本的时候不需要重新编译内核,使用操作系统自带的内核就可以满足需要。本书作者的操作系统内核为Linux-3.2.0-44。

1.5 Linux的系统架构

Linux系统从应用角度来看,分为内核空间和用户空间两个部分。内核空间是Linux操作系统的主要部分,但是仅有内核的操作系统是不能完成用户任务的。丰富并且功能强大的应用程序包是一个操作系统成功的必要条件。

1.5.1 Linux内核的主要模块

Linux的内核主要由5个子系统组成:进程调度、内存管理、虚拟文件系统、网络接口、进程间通信。下面将依次讲解这5个子系统。

1. 进程调度SCHED

进程调度指的是系统对进程的多种状态之间转换的策略。Linux下的进程调度有3种策略:SCHED_OTHER、SCHED_FIFO和SCHED_RR。

  • SCHED_OTHER是用于针对普通进程的时间片轮转调度策略。这种策略中,系统给所有的运行状态的进程分配时间片。在当前进程的时间片用完之后,系统从进程中优先级最高的进程中选择进程运行。

  • SCHED_FIFO是针对运行的实时性要求比较高、运行时间短的进程调度策略。这种策略中,系统按照进入队列的先后进行进程的调度,在没有更高优先级进程到来或者当前进程没有因为等待资源而阻塞的情况下,会一直运行。

  • SCHED_RR是针对实时性要求比较高、运行时间比较长的进程调度策略。这种策略与SCHED_OTHER的策略类似,只不过SCHED_RR进程的优先级要高得多。系统分配给SCHED_RR进程时间片,然后轮循运行这些进程,将时间片用完的进程放入队列的末尾。

由于存在多种调度方式,Linux进程调度采用的是“有条件可剥夺”的调度方式。普通进程中采用的是SCHED_OTHER的时间片轮循方式,实时进程可以剥夺普通进程。如果普通进程在用户空间运行,则普通进程立即停止运行,将资源让给实时进程;如果普通进程运行在内核空间,需要等系统调用返回用户空间后方可剥夺资源。

2. 内存管理MMU

内存管理是多个进程间的内存共享策略。在Linux系统中,内存管理的主要概念是虚拟内存。

虚拟内存可以让进程拥有比实际物理内存更大的内存,可以是实际内存的很多倍。每个进程的虚拟内存有不同的地址空间,多个进程的虚拟内存不会冲突。

虚拟内存的分配策略是每个进程都可以公平地使用虚拟内存。虚拟内存的大小通常设置为物理内存的两倍。

3. 虚拟文件系统VFS

在Linux下支持多种文件系统,如ext、ext2、minix、umsdos、msdos、vfat、ntfs、proc、smb、ncp、iso9660、sysv、hpfs、affs等。目前Linux下最常用的文件格式是ext2和ext3。ext2文件系统用于固定文件系统和可活动文件系统,是ext文件系统的扩展。ext3文件系统是在ext2上增加日志功能后的扩展,它兼容ext2。两种文件系统之间可以互相转换,ext2不用格式化就可以转换为ext3文件系统,而ext3文件系统转换为ext2文件系统也不会丢失数据。

4. 网络接口

Linux是在Internet飞速发展的时期成长起来的,所以Linux支持多种网络接口和协议。网络接口分为网络协议和驱动程序,网络协议是一种网络传输的通信标准,而网络驱动则是对硬件设备的驱动程序。Linux支持的网络设备多种多样,几乎目前所有网络设备都有驱动程序。

5. 进程间通信

Linux操作系统支持多进程,进程之间需要进行数据的交流才能完成控制、协同工作等功能,Linux的进程间通信是从UNIX系统继承过来的。Linux下的进程间的通信方式主要有管道方式、信号方式、消息队列方式、共享内存和套接字等方法。

1.5.2 Linux的文件结构

与Windows下的文件组织结构不同,Linux不使用磁盘分区符号来访问文件系统,而是将整个文件系统表示成树状的结构,Linux系统每增加一个文件系统都会将其加入到这个树中。

操作系统文件结构的开始,只有一个单独的顶级目录结构,叫做根目录。所有一切都从“根”开始,用“/”代表,并且延伸到子目录。DOS/Windows下文件系统按照磁盘分区的概念分类,目录都存于分区上。Linux则通过“挂接”的方式把所有分区都放置在“根”下各个目录里。一个Linux系统的文件结构如图1.1所示。

图 1.1 Linux 文件系统结构示意图

不同的Linux发行版本的目录结构和具体的实现功能存在一些细微的差别。但是主要的功能都是一致的。一些常用目录的作用如下所述。

  • /etc:包括绝大多数Linux系统引导所需要的配置文件,系统引导时读取配置文件,按照配置文件的选项进行不同情况的启动,例如fstab、host.conf等;

  • /lib:包含C编译程序需要的函数库,是一组二进制文件,例如glibc等;

  • /usr:包括所有其他内容,如src、local。Linux的内核就在/usr/src中。其下有子目录/bin,存放所有安装语言的命令,如gcc、perl等;

  • /var:包含系统定义表,以便在系统运行改变时可以只备份该目录,如cache;

  • /tmp:用于临时性的存储;

  • /bin:大多数命令存放在这里;

  • /home:主要存放用户账号,并且可以支持ftp的用户管理。系统管理员增加用户时,系统在home目录下创建与用户同名的目录,此目录下一般默认有Desktop目录;

  • /dev:这个目录下存放一种设备文件的特殊文件,如fd0、had等;

  • /mnt:在Linux系统中,它是专门给外挂的文件系统使用的,里面有两个文件cdrom、floopy,登录光驱、软驱时要用到。

刚开始使用Linux的人比较容易混淆的是Linux下使用斜杠“/”,而在DOS/Windows下使用的是反斜杠“\”。例如在Linux中,由于从UNIX集成的关系,路径用“/usr/src/Linux”表示,而在Windows下则用“\usr\src\Linux”表示。在Linux下更加普遍的问题是字母大小写敏感,例如文件Hello.c和文件hello.c在Linux下不是一个文件,而在Windows下则表示同一个文件。

1.6 GNU通用公共许可证

GNU通用公共许可证(简称为GPL)是由自由软件基金会发行的用于计算机软件的一种许可证制度。GPL最初是由Richard Stallman为GNU计划而撰写。目前,GNU通行证被绝大多数的GNU程序和超过半数的自由软件采用。此许可证最新版本为“版本3”,于2007年发布。GNU宽通用公共许可证(简称LGPL)是由GPL衍生出的许可证,被用于一些GNU程序库。

1.6.1 GPL许可证的历史

GNU通用公共许可证是由Richard Stallman为了GNU计划而撰写的,它以GNU的Emacs、GDB、GCC的早期许可证为蓝本。上述的这些许可证都包含了一些GPL中的版权思想,但是仅仅针对特定的某个程序。Richard Stallman的目标是创造出一种通用的软件许可证制度,来为所有的开源软件代码计划使用。

GPL的“版本1”,在1989年1月诞生。在1990年时,因为一些共享库的使用而出现了对GPL许可证制度更为宽松的需求,在GPL“版本2”于1991年6月发布时,另一许可证--库通用许可证(Library General Public License,简称LGPL)也随之发布,并记做“版本2”以示对GPL的补充。在LGPL版本2.1发布时与GPL版本不再对应,而LGPL也被重命名为GNU宽通用公共许可证(Lesser General Public License)。

GPLv3在2007年6月份开始使用,由于对专利权和数字版权限制的问题造成了自由软件阵营的一次很大的争论。Stallman于2006年2月25日在自由开源软件开发者欧洲会议上发表的演讲中,对GPLv3的特点作了解释,相对于GPLv2,主要有如下4个不同的方面:

  • 数字版权问题。在GPLv3中禁止使用GPLv3本身作为数字版权的一部分,同时消费类电子设备上使用GPLv3代码必须开放源代码,而且允许用户自己重新构建。

  • 专利扩散许可。在GPLv3中如果具有专利的代码加入之后,此专利会自动向整个应用程序授权此专利。

  • 衍生产品的定义。在GPLv3中定义了衍生产品,即如果某个模块采用了GPLv3协议,某个产品使用此模块动态链接后,如果此模块可以被其他模块代替,则这个产品不是GPLv3协议,否则需要采用GPLv3协议。

  • GPLv3协议与其他协议的兼容问题。

1.6.2 GPL的自由理念

软件的版权保护机制在保护发明人权益的同时,对软件的技术进步造成了影响。版权所有软件的最终用户几乎不能从所购买的软件中得到任何软件设计相关的权利(除了使用的权利),甚至可能限制像逆向工程等法律允许范围内的行为。与此对应,GPL授予程序的接受方下述的权利,即GPL所倡导的“自由”:

  • 可以以任何目的运行所购买的程序;

  • 在得到程序代码的前提下,可以以学习为目的,对源程序进行修改;

  • 可以对复制件进行再发行;

  • 对所购买的程序进行改进,并进行公开发布。

自由软件许可证除了GPL许可证之外,还有一些其他的许可证,如BSD、APACHE等许可证。一些许可证比GPL的许可证的限制要少得多,例如BSD许可证并不禁止其演绎作品变成版权所有软件。它们之间的最主要区别是GPL提供一种软件复制和演绎产品的许可证继承保证。Stallman发明了一种叫做Copyleft的法律机制,要求所有GPL程序的演绎作品也要在GPL许可证之下。

目前,GPL许可证是自由软件和开源软件的最流行许可证。到2004年4月为止,GPL许可证已占freshmeat(最大的UNIX平台和跨平台软件网络发布平台)上所列的自由软件的75%,SourceForge上所列软件的68%。GNU软件中最著名的GPL自由软件包括Linux内核和GCC编译器包。

1.6.3 GPL的基本条款

GPL许可证作为Linux平台软件的主要许可证,有很多独特的地方。GPL授权的软件并不是说使用者在得到此软件后可以无限制地使用,而是要遵循一定的规则,其中主要的一点就是开放源代码。使用GPL授权发布的商业软件,也并不是不要钱,其盈利模式是采用收取服务费用的方式来获取利益。GPL中的主要条款包括权利授予、Copyleft。

1. 授予的权利

采用GPL条款的软件分发给使用人,不管是收费还是免费,其作品符合GPL授权,获得GPL作品的人成为许可证接受人。许可证接受人有修改、复制、再发行此作品或者此作品的演绎版本的权利,许可证接受人可以由上述的行为收取费用而获利。与一般禁止商业用途的软件不同,GPL授权的软件不禁止商业用途,例如Stallman最初的Emacs就是收取费用的,每份150美元。

GPL的授权通常被人理解为免费,其实这是两种完全不同的概念:GPL在出售产品的同时需要提供源代码,同时允许获得软件的产品进行再次发布。一般的GPL分发软件的盈利模式是采用服务的方式,即如果想更好地使用此软件,需要向分发者提供报酬,分发者对使用者的软件进行优化或者进行人员培训等工作。例如IBM提供的软件中就有GPL协议的,但是IBM是典型的服务获利的公司。

GPL授权的另一层含义是要求分发者提供源代码,防止软件开发商对软件进行锁定,限制用户的某些行为。如果用户获得源代码,在分析源代码的基础上,可以修改某些设置,对源软件进行功能开放。

2. Copyleft

GPL许可证不是授予许可证接受人无限制的权利,接受人在因为GPL而获益的时候(获得软件产品的源代码)必须遵守一定的要求。GPL协议要求许可证的接受人在进行软件再次发布的时候必须要公开源代码,同时允许对再发行软件进行的复制、发行、修改等的权利,即再发行的软件必须为GPL许可证。

上述的这种要求称为Copyleft,GPL由此而被称为“被黑的版权法”。因为GPL的法理基础是承认软件是拥有版权的,即作品在法律上归版权所有。由于软件的版权由发行者所有,所以发行者可以对软件的发行规定进行设置,GPL就是发行者对版权进行上述规定,放弃一定的版权。如果某个再发行版本不遵循GPL许可证,因为原作者对作品拥有版权,这样就有可能被原作者起诉。

GPL的copyleft仅仅在程序的再发行时发生作用,如果受权人对软件进行修改后没有进行发行,是可以不开放源代码的。Copyleft只对发行的软件本身起作用,对于软件的输出或者工作成果不起作用。

GPL软件的发行方法都是把源代码和可执行程序一同发行,一般提供例如CD等。目前通行的发行GPL软件的方法是将软件放置到互联网上,由用户来下载,例如HTTP、FTP等方式。

1.6.4 关于GPL许可证的争议

使用GPL的许可证造成了很多争议,主要是对软件版权方面的界定、GPL的软件传染性、商业开发方面的困扰等。比较有代表性的是对GPL软件产品的链接库使用的产品版权界定,即非GPL软件是否可以链接到GPL的库程序。

对于GPL开放源代码进行修改的产品遵循GPL的授权规定是很明确的,但是对于使用GPL链接库的产品是否需要遵循GPL存在很大分歧,但是其他专家并不认同这种观点,分成了自由和开放源代码社区两派。这个问题其实不是技术问题,这是一个法律界定的问题,需要法律的案例来例证。

由于GPL许可证需要授权人对再发行产品按照GPL许可证发行,所以在使用许可证软件的时候需要注意。有很多协议是GPL兼容的,即这种协议和GPL协议的软件共同使用,并且将开发完毕的软件产品作为GPL来发行是没有问题的,例如MIT/X许可证、BSD许可证、LGPL,它们和GPL许可证兼容;有一些许可证是GPL不兼容的,例如某些自由软件的许可证。开发者在开发的时候,要使用GPL兼容的许可证,以免引起法律问题。

GPL再发行软件必须采取GPL许可证的问题,被微软的首席执行官Steve Ballmer称为“癌症”,认为GPL是有“传染性”的“病毒”。由于包含GPL代码或动态链接到GPL库被理解为“演绎作品”,必须按照GPL许可证的强制继承来使用GPL分发。微软已经以GPL为许可证发行了SFU(Microsoft Windows Services for UNIX)中所包含的部分组件,例如GCC编译器。

1.7 Linux软件开发的可借鉴之处

在Linix的发展过程中,形成了一种独特的成功模式,包含软件的开发模式。Linux操作系统的成功从一个系统工程的角度看有很多值得项目管理人员学习的东西,例如《大教堂与集市》一书中对Linux的开发模式进行了比较详细的分析,它主要包含如下几个方面。

  • 使用集市模式进行软件开发应该有一个基本成型的软件原型,这样后来的参与者能够对此进行改进,更重要的是能够看到成功的曙光、可以看到不远的将来能够成功,获得参与的动力。

  • 集市模式的开发把软件的使用者作为开发的协作者而不仅仅是一个简单的用户,这样开发者和使用者能够共同对作品进行快速的代码改进和高效率的调试。

  • 集市模式开发使用早发布、常发布的方法,来方便听取客户的建议,对软件进行改进。项目的开发者想出好主意是件好事,而从使用者那里获得的建议是比前者更好的事情。因为从使用者那里提出的建议是有的放矢,更加切合实际的。

  • 集市的开发模式验证了如下一个成功的假设:如果参与软件Beta版测试的人员足够多,几乎软件中所有存在的问题都能够被迅速地找出并进行纠正。

  • 对于集市开发模式的项目来说,比技能和设计能力更为重要的是项目协调人员必须具有良好的人际和交流能力。因为为了建造一个成功的开发小组,需要项目的领导人员所作所为必须让参与者感兴趣并能够有参与的动力,使得参与者感到他们正在做的工作十分有趣(这是因为一般的项目是没有报酬的,大家按照兴趣参加),这不仅仅是项目的本身,与领导者的个人素质有很大的关系。

从Linux社区中还可以获得更多睿智的经验或者知识,例如Linus所持的一种观点:使用聪明的数据结构和笨拙的代码的搭配方式要比相反的搭配方式更好,可以作为软件开发的一种基本的常识。

1.8 小结

本章对Linux的形成历史进行了简单的介绍,并对其发展历程中起重要作用的5个要素进行了解释。与UNIX系统相比较,Linux操作系统有很多不同之处,特别是在版权方面。

Linux的发行版本数以百计,其中的Debian、Fedora Core、openSUSE,以及Ubuntu是比较有代表性的集中。本书中的例子均以Ubuntu为例进行介绍。本章还介绍了Linux的系统架构和Linux内核模块之间的关系,对GNU的通用公共许可证进行了介绍,特别是GNU的Copyleft概念。最后介绍了Linux开发模式的成功之处,对集市开发模式进行了简单的介绍。

目录

  • 前言
  • 第 1 篇 Linux网络开发基础
  • 第 1 章 Linux操作系统概述
  • 第 2 章 Linux编程环境
  • 第 3 章 文件系统简介
  • 第 4 章 程序、进程和线程
  • 第 2 篇 Linux用户层网络编程
  • 第 5 章 TCP/IP协议族简介
  • 第 6 章 应用层网络服务程序简介
  • 第 7 章 TCP网络编程基础
  • 第 8 章 服务器和客户端信息的获取
  • 第 9 章 数据的IO和复用
  • 第 10 章 基于UDP协议的接收和发送
  • 第 11 章 高级套接字
  • 第 12 章 套接字选项
  • 第 13 章 原始套接字
  • 第 14 章 服务器模型选择
  • 第 15 章 IPv6简介
  • 第 3 篇 Linux内核网络编程
  • 第 16 章 Linux内核中网络部分结构以及分布
  • 第 17 章 netfilter框架内报文处理
  • 第 4 篇 综合案例
  • 第 18 章 一个简单Web服务器的例子SHTTPD
  • 第 19 章 一个简单网络协议栈的例子SIP
  • 第 20 章 一个简单防火墙的例子SIPFW