贝尔实验室九号项目(英语:Plan 9 from Bell Labs,常简称为Plan 9)是一个分布式操作系统,由贝尔实验室的计算科学研究中心在1980年代中期至2002年开发,以作为UNIX的后继者。它现在仍然被操作系统的研究者和爱好者开发使用。
Plan 9的特色功能有:将所有本地和远程资源以文件形式组织的9P协议,union mounts,改进的进程文件系统以及本地的Unicode支持。在Plan 9中,所有的系统接口(如网络和用户界面接口),都是作为文件系统的一部分呈现,而不像其他操作系统上一样拥有自己独立的接口。
Plan 9得名于艾德·伍德1959年拍摄的B级科幻电影外太空九号计划,而它的标志格伦达来自同一导演拍摄的另一部电影忽男忽女。
九号项目在贝尔实验室中取代UNIX成为组织中主要的研究开发平台。与原先的UNIX模型相较,其发展出来的数种改变改善了系统的使用及程序开发,尤其是在分布式多用户环境中。起先在1980年中期,九号项目只是贝尔实验室的内部计划。到了1992年,贝尔实验室提供第一个公开版本提供给学院使用。在1995年,商业化的第二版发布提供一般大众使用。1990年代后期,朗讯科技继承了贝尔实验室后,对商业化九号项目失去了兴趣。到了2000年发布了非商业化的第三版,采用开放源代码授权。而2002年的第四版更采用自由软件授权。
一个包括现任和前任贝尔实验室成员与麻省理工学院成员参与的用户与开发人员社群,仍每天以光盘影像档的形式持续提供每日更新发布的文件。贝尔实验室也仍旧承续九号项目的开发。开发中的源代码文件可以透过9P及HTTP协议加以访问并用于既有安装文件的更新。除了光盘映像档中操作系统所包含的官方包以外,贝尔实验室也架设了一个空间供外部开发的应用程序与工具存放。
贝尔实验室九号项目主要是由贝尔实验室计算科学研究中心(Computing Sciences Research Center)的成员所开发,该团体也曾开发UNIX及C语言。九号项目团队原先由罗勃·派克、肯·汤普逊、Dave Presotto及Phil Winterbottom所带领,及计算科学研究中心主管丹尼斯·里奇所支持。在多年的开发过程中,有许多开发人员对这项项目做出了不小的贡献,如布莱恩·柯林汉、Tom Duff、道格拉斯·麦克罗伊、比雅尼·斯特劳斯特鲁普、Bruce Ellis、Steve Simon等人。
九号项目是针对现代分布式环境而从开始就设计成一种网络操作系统并加以开发。不同于UNIX是在设计后才增加图形用户界面的功能,九号计划打一开始就内置了。虽然仍未成为大受欢迎的UNIX派生系统,但仍有持续成长的开发者社群。
九号项目具备了分布式架构,它可以被安装并使用于单一自含系统上,也有能力把操作系统的功能包散布于分散的硬件平台上。在标准的九号项目安装系统中,用户会以一个轻量化的终端运行Rio 图形用户界面透过网络连接到CPU服务器来处理计算密集型(computation-intensive)的程序,并借由额外的文件服务器及归档存储系统提供长期的数据存储。现有的台式机亦可以在内部使用多个虚拟机重现此种架构。
九号项目的设计者对与微核心类似的目标感兴趣,但是以不同的架构与设计细节来达成这些目标。九号项目的设计目标如下:
在UNIX之前,多数的操作系统都各自有不同的机制来访问不同类型的设备。举例来说,访问磁盘的API与自串行端口发送或接收的API、又或是操作打印机所使用的API,彼此之间都有所不同。
UNIX借由透过磁盘索引节点(disk inodes)运行所有输入/输出操作来尝试移除这些差异。每个设备都被要求必须要支持带有意义的和操作用以作为控制的手段。这也允许用户无须了解底层的实现细节,便能利用如cp及dd等指令从任一设备提交数据给其他的设备。然而在此同时,许多关键的概念(如控制行程的状态)并没有一致地对应到文件系统上。如同柏克莱接口与X窗口系统等的新功能被开发出来以后,以文件系统之外的方式实现。新的硬件功能(如在软件中使光盘驱动器退片的功能)也建议采用特定硬件(hardware-specific)控制的机制,如使用ioctl系统调用等。
九号项目不采用这些不同的实现,而且回归到以文件系统为中心(file system-centric)的系统观点。无论是网络或者用户界面、甚至是视窗本身,所有可用资源对于每个九号项目的程序来说,都是层次结构式文件系统的一部分,而非特定的接口。
九号项目扩展系统到超越文件的概念,来到了“名称”的层次。无论是电脑的文件、显示器、用户或电脑本身,都是一个独一无二的路径名称。这些都是透过既有的UNIX标准来处理,并扩展至所有的对象皆可以用一致的方式来命名及定址。这跟万维网所使用的URI的概念很相似。在UNIX中,像打印机这样的设备会透过软件转换的方式在/dev
以名称代表,但这种定址方式只对实体连接到硬件上的设备有效,并不能套用到网络设备上。在九号项目系统中,所有的打印机都会以文件的方式呈现,而且可以透过网络被任何工作站访问。
九号项目的另一个创新点则是用户可以对相同的“真实世界”对象各自分别取不同的名称。每个用户都可以借由在他们的名字空间中收集各式各样不同的对象来创造属于他们自己的个人化环境。UNIX也有类似的观念,用户可以复制其他用户来获取权限。但是九号项目则把这种作法扩展到所有的对象,用户可以轻易地产生自身的“复制品”,加以修改,就算移除这些复制品也不会影响他们创造过的资源。
UNIX允许从不同的资源透过“链接”或文件系统“挂载”的观念来创建文件系统。这些功能会屏蔽掉原先的目录,如果有人在名为“net”的目录下挂载了新的文件系统,会导致无法访问先前可以在“net”目录下访问的内容,除非取消挂载的操作。
九号项目则采用的想法,从不同媒体或网络资源合并的目录会以透明(transparently)的方式绑定。举例来说,可以把别台电脑的/bin
(应用程序)目录跟本机端绑定,接下来这个目录就会同时有本地端以及远程的应用程序在里面,用户可以无障碍的访问近端或是远程的程序。使用相同系统的情况下,九号项目所控制的外部设备与资源可以绑定到/dev
目录下,这可以让设备不需要任何额外的程序,就可以透过网络进行分享。
现今有许多Linux发行版的Live CD,一定程度上的以合并挂载的方式实做了这个功能。
列出所有运行中行程的/proc
目录,描绘出这些功能是如何在共同运作时能够带来更好的整体结果。九号项目特别的"文件系统"也为Linux及其他之后的操作系统所采用。不同于其他核心资源的是,行程以/proc
目录下的命名对象(内含信息与控制文件的子目录)的形式表现,并给予用户一组动态的输入/输出通道来对行程发送指令及读取数据。用户无须使用受限的系统调用来与编译过的程序核心交互,相反的,它可以使用如ls
以及cat
等指令来搜索、查询、以及操作行程。
用户也可以从其他的机器上将/proc
目录(以及任何其他特定的文件系统)挂载到自己的名字空间中,就如同这些程序是在本机端一般地与它们交互。结果就是利用个别的机器架构出一套分布式运算环境,这些机器可能是用户桌上的终端、存储长期数据的文件服务器、提供较快CPU及运算能力、用户审核、网关等服务之其他服务器,全部都采用为大多数电脑用户所熟悉的既有的层次结构式目录/命名系统。用户可以借由终端来收集文件服务器、服务器上所运行的应用程序、网络上的打印机等设备,绑定进自己的名字空间进而"建构"出一套系统。
九号项目并没有使用任何系统调用来处理众多的通信协议或设备驱动程序的接口。举例来说,/net
目录下包含了所有TCP/IP的API,并可借由使用脚本语言或命令行接口的工具来撰写可以控制文件对连线进行写入或读取的程序。底下的子目录如/net/tcp
和/net/udp
等目录用来对应各种协议的接口。用户可以借由挂载一台具有公开(public)IP地址的外部机器的/net
目录,来让使用9P网络协议的内部网私有(private)IP地址,能透过该外部机器进行连线的方式,进而达到实做NAT的效果。又或者用户可以借由挂载远程网关的/net
目录,在公开网络上使用加密(secured)的9P协议达成实做VPN的效果。
以下是在/net
目录中采用合并(或称堆栈(stack))目录的例子:就像面向对象编程语言的继承观念一样,你可以把一个(可能是远程的)/special
目录绑定到其他的本地端特定目录下,增加一些控制文件以及是需要隐藏其他的文件。这个合并目录线再就像是原先目录的子对象一般,原先的功能可以仅更动一部分就好。对照到/net
文件系统的情况,用户可以借由更动或隐藏底下的/net/udp
子目录,增加本地端过滤程序来达成控制或扩展UDP接口的功能,而不会更动到原本正在运行的(可能是远程机器上的)/net/tcp
子目录的数据。名字空间是针对每个行程来设置的,如果用户更动对/net
合并目录来一个不受信任的应用程序设置限制,就可以限制该程序访问网络的能力。
这让程序员很容易就可以在采用文件系统的标准命名格式、访问控制、安全机制的情况下,从不同的系统上使用不同的语言合并“对象”或文件系统,大大增加了使用上的透明度。
这也跟BSD的mount_portal
的指令所提供的功能类似,只是挂载的目录不是/net
而是/p
,提供的网络协议也只有/tcp
而已。
九号项目虽然是基于UNIX,但是设计上则是想达成运算系统核心功能间彼此沟通的观念。所有系统资源都被当成文件般地命名及访问,并提供可根据在特定机器上各个程序设置的多种分布式系统视图(view)。这种让服务器以类似传统文件的方式,把任何信息都呈现给用户及应用程序的实现方式,增进了应用程序设计上的一般化与模块化的能力。
九号项目支持网络通透性的关键在于采用一种新的底层网络协议9P。9P协议实现了链接到命名网络对象并以类文件(file-like)系统呈现的方式。借由快速的比特导向(而非区块导向),分布式文件系统可以把任何对象可视化的呈现,而非透过远程机器上的一个NFS服务器再加以呈现。这个协议可以用来跟行程、程序、数据、以及包含用户界面及网络以及彼此之间进行通信。在第四版中,这个协议作了一些修改并且更名为9P2000。
九号项目的系统采用Unicode作为编码机制。九号项目中运用由Ken Thompson提出重大修改的UTF-8作为整个系统中的原生编码,并在1992年将整个系统提供作一般使用。不过九号项目仅支持Unicode中基本多文种平面中有定义的部分。
除了x86架构下有可安装的实行环境之外、九号项目也移植到MIPS、DEC Alpha、SPARC、PowerPC、ARM及其他硬件平台上。系统以派生自ISO/ANSI C的语言所编写。部分应用程序原先以Alef撰写,但目前皆以C语言改写。九号项目支持以POSIX应用程序透过APE来模拟柏克莱接口接口。近来有一套新的应用程序被开发用来运行Linux的程序,目前仍有许多要改进的地方。
九号项目也被用在具代表性的超级电脑上,像是IBM BG/L Supercomputer以及Blue Gene。
UNIX其中一个中心概念是所有系统接口皆可以一组文件的形式呈现,而九号项目成功地把这个概念以现代分布式系统实现出来。九号项目的一些功能,像是Unicode中的UTF-8编码,也被其他操作系统所实现。一些类UNIX操作系统,例如Linux,也实现9P、九号项目的文件系统,以及部分实现的类rfork指令的系统调用。除此之外,在Plan 9 from User Space中许多九号项目所采用的应用程序及工具,例如rc shell,也被移植到UNIX以及LINUX系统上,而且还有一定程度的人气。Glendix这个项目则尝试以GNU/Linux操作系统取代九号项目,或者是说,以Linux核心来取代九号项目的核心。
然而,九号项目并未能像UNIX一样热门,变成主要只是一种研究用的工具。九号项目被评为"作用看来不过是能在操作系统研究领域产生有趣论文的设备"。Eric S. Raymond在他的著作中则推测九号项目缺乏被接受度。
"九号项目会失败单纯只是因为它的改进程度没大能取代Unix。与九号项目相较,虽然UNIX看来破破烂烂又有明显缺失,但是它还是能好好的把工作完成,这就足以保住它的地位了。这件事情给那些有雄心壮志的系统架构的一堂课是:比更佳解决方案相比之下来的最危险的敌人是那些能把事情已经做的够好的程序。"
对于九号项目的评论像是在操作系统设计中把九号项目列为糟糕的更好的典范,其他常见的评论则有九号项目操作系统中缺乏“优雅”(polish)及开发环境、九号项目中达到商业化程度的软件支持量不足。
九号项目的支持者和开发人员声称阻碍其发展的问题已被解决,原先作为分布式系统、开发环境、研究平台的目标也都已经达成,而且也慢慢地开始有人采用。可透过Inferno的托管能力将九号项目的技术带给其他系统,形成异构网格运算中的一部分。
完整的源代码可以免费的在朗讯公共许可证1.02版的授权之下获取,而且被开放源代码促进会认为是开放源代码软件及自由软件基金会认为是自由软件。它虽然有通过Debian Free Software Guidelines,不过不兼容于GNU通用公共许可证。