Plan9

**貝爾實驗室九號計畫**（英語：Plan 9 from Bell Labs，常簡稱為 **Plan 9**）是一個分散式作業系統，由貝爾實驗室的計算科學研究中心在 1980 年代中期至 2002 年開發，以作為 UNIX 的後繼者。它現在仍然被作業系統的研究者和愛好者開發使用。

Plan 9 的特色功能有：將所有本地和遠端資源以檔案形式組織的 9P 協定，union mounts，改進的行程檔案系統以及原生的 Unicode 支援。在 Plan 9 中，所有的系統介面（如網路和使用者介面介面），都是作為檔案系統的一部分呈現，而不像其他作業系統上一樣擁有自己獨立的介面。

Plan 9 得名於艾德・伍德 1959 年拍攝的 B 級科幻電影外太空九號計劃
，而它的標誌格倫達來自同一導演拍攝的另一部電影忽男忽女。

2021 年 3 月 21 日，目前所屬諾基亞旗下的貝爾實驗室，宣布將一切智慧財產權以及未來開發工作轉交給新成立的九號計畫基金會 (Plan 9 Foundation)。

## 歷史

九號計畫在貝爾實驗室中取代 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）的程式，並藉由額外的檔案伺服器及歸檔儲存系統提供長期的資料儲存。現有的桌上型電腦亦可以在內部使用多個虛擬機器重現此種架構。

## 設計概念

九號計畫的設計者對與微核心類似的目標感興趣，但是以不同的架構與設計細節來達成這些目標。九號計畫的設計目標如下：

* _以檔案系統為基礎的裝置_: 把所有的資源都列在階層式檔案系統中，以節點（Node）表示。
* _命名空間_: 從應用程式的觀點來看，網路是種單一且清楚的命名空間，能展現階層式檔案系統，也能代表近端或遠端實體分離的資源。每個程式的命名空間皆能獨立建置，使用者也能同時使用採用各式命名空間的應用程式。
* _標準通訊協定_: 採用名為 9P 的標準協定，用來存取近端或遠端的所有資源。

### 一體化的輸入 / 輸出模型

在 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

列出所有執行中**行程**的 `/proc` 目錄，描繪出這些功能是如何在共同運作時能夠帶來更好的整體結果。九號計畫特別的 "檔案系統" 也為 Linux 及其他之後的作業系統所採用。不同於其他核心資源的是，行程以 `/proc` 目錄下的命名物件（內含資訊與控制檔案的子目錄）的形式表現，並給予使用者一組動態的輸入 / 輸出通道來對行程傳送指令及讀取資料。使用者無須使用受限的系統呼叫來與編譯過的程式核心互動，相反的，它可以使用如 `ls` 以及 `cat` 等指令來搜尋、查詢、以及操作行程。

使用者也可以從其他的機器上將 `/proc` 目錄（以及任何其他特定的檔案系統）掛載到自己的命名空間中，就如同這些程式是在本機端一般地與它們互動。結果就是利用個別的機器架構出一套分散式運算環境，這些機器可能是使用者桌上的終端機、儲存長期資料的檔案伺服器、提供較快 CPU 及運算能力、使用者稽核、閘道器等服務之其他伺服器，全部都採用為大多數電腦使用者所熟悉的既有的階層式目錄 / 命名系統。使用者可以藉由終端機來收集檔案伺服器、伺服器上所運行的應用程式、網路上的印表機等裝置，繫結進自己的命名空間進而 "建構" 出一套系統。

### /net

九號計畫並沒有使用任何系統呼叫來處理眾多的通訊協定或裝置驅動程式的介面。舉例來說，`/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`[1] 的指令所提供的功能類似，只是掛載的目錄不是 `/net` 而是 `/p`，提供的網路協定也只有 `/tcp` 而已。

### 網路與分散式運算

九號計畫雖然是基於 UNIX，但是設計上則是想達成運算系統核心功能間彼此溝通的觀念。所有系統資源都被當成檔案般地命名及存取，並提供可根據在特定機器上各個程式設定的多種分散式系統視圖（view）。這種讓伺服器以類似傳統檔案的方式，把任何資訊都呈現給使用者及應用程式的實作方式，增進了應用程式設計上的一般化與模組化的能力。

九號計畫支援網路通透性的關鍵在於採用一種新的底層網路協定 9P。9P 協定實作了連結到命名網路物件並以類檔案（file-like）系統呈現的方式。藉由快速的位元導向（而非區塊導向），分散式檔案系統可以把任何物件視覺化的呈現，而非透過遠端機器上的一個 NFS 伺服器再加以呈現。這個協定可以用來跟行程、程式、資料、以及包含使用者介面及網路以及彼此之間進行通訊。在第四版中，這個協定作了一些修改並且更名為 9P2000。

### Unicode

九號計畫的系統採用 Unicode 作為編碼機制。九號計畫中運用由 Ken Thompson 提出重大修改的 UTF-8 作為整個系統中的原生編碼，並在 1992 年將整個系統提供作一般使用。不過九號計畫僅支援 Unicode 中基本多文種平面中有定義的部份。

## 實作

除了 x86 架構下有可安裝的實行環境之外、九號計畫也移植到 MIPS、DEC Alpha、SPARC、PowerPC、ARM 及其他硬體平台上。系統以衍生自 ISO/ANSI C 的語言所編寫。部分應用程式原先以 Alef 撰寫，但目前皆以 C 語言改寫。九號計畫支援以 POSIX 應用程式透過 APE 來類比柏克萊介面介面。近來有一套新的應用程式 _linuxemu_ 被開發用來執行 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 在他的著作 _The Art of Unix Programming_ 中則推測九號計畫缺乏被接受度。

> "九號計畫會失敗單純只是因為它的改進程度沒大能取代 Unix。與九號計畫相較，雖然 UNIX 看來破破爛爛又有明顯缺失，但是它還是能好好的把工作完成，這就足以保住它的地位了。這件事情給那些有雄心壯志的系統架構的一堂課是：比更佳解決方案相比之下來的最危險的敵人是那些能把事情已經做的夠好的程式。"
> 
> 

對於九號計畫的評論像是在作業系統設計中把九號計畫列為糟糕的更好的典範，其他常見的評論則有九號計畫作業系統中缺乏「優雅」（polish）及開發環境、九號計畫中達到商業化程度的軟體支援量不足。

九號計畫的支持者和開發人員聲稱阻礙其發展的問題已被解決，原先作為分散式系統、開發環境、研究平台的目標也都已經達成，而且也慢慢地開始有人採用。可透過 Inferno 的代管能力將九號計畫的技術帶給其他系統，形成異構網格運算中的一部份。

## 授權

完整的原始碼 （頁面存檔備份，存於網際網路檔案館）可以免費的在朗訊公共許可證 1.02 版的授權之下取得，而且被開放原始碼促進會認為是開放原始碼軟體及自由軟體基金會認為是自由軟體。它雖然有通過 Debian 自由軟體指導方針，不過不相容於 GNU 通用公共許可證。
2021 年 3 月 23 日之後，所有版本以 MIT License 授權。

## 參照

### 九號計畫標準程式庫

* rc - 九號計畫所採用的 shell
* Sam (文字編輯器) - 文字編輯器
* acme - 提供給程式設計師用的使用者介面
* plumber - 行程間通訊
* mk - 建立軟體用的工具，跟 UNIX 的 make 程式類似
* acid - 偵錯器
* rio - 新的九號計畫視窗系統
* 8½ - 舊的九號計畫視窗系統
* Fossil 及 Venti - 新的歸檔系統及長期資料儲存

### 實作介面

* 9P（或 Styx） - 檔案系統的協定
* rendezvous - 基礎的同步機制
* Brazil - 變成九號計畫第四版的專案

### 影響

* Plan 9 from User Space - 將九號計畫函式庫及應用程式移植到類 UNIX 作業系統
* Inferno - 跟隨九號計畫腳步的分散式作業系統
* B 計畫 （頁面存檔備份，存於網際網路檔案館） - 基於九號計畫的實驗作業系統
* Octopus （頁面存檔備份，存於網際網路檔案館） - B 計畫的新成果
* 9wm - 複製九號計畫介面的 X 視窗管理員
* wmii - 採用類似 9P 協定介面的檔案系統的 X 視窗管理員
* Glendix （頁面存檔備份，存於網際網路檔案館） - 將 Plan 9 from User Space 的工具移植到 Linux

## 參見

* Haiku – 開源桌面作業系統
* FreeRTOS – 微核心，即時作業系統（RTOS）
* Redox - Rust 實現的微核心作業系統
* QNX – 符合 POSIX，微核心即時作業系統（RTOS）
* INTEGRITY – 微核心即時作業系統（RTOS）
* L4 微核心系列 – L4 系列，小而快的開源微核心
* MINIX 3 – 類 Unix 微核心作業系統

## 參考文獻

## 外部連結

### 貝爾實驗室

* 九號計畫的網站（頁面存檔備份，存於網際網路檔案館）
* 九號計畫的鏡像網站 （頁面存檔備份，存於網際網路檔案館）
* 概觀 （頁面存檔備份，存於網際網路檔案館）
* 第四版的檔案 （頁面存檔備份，存於網際網路檔案館）
* 其他檔案資料 （頁面存檔備份，存於網際網路檔案館）
* 第二版的讀我檔案 （頁面存檔備份，存於網際網路檔案館）by Brian W. Kernighan
* 可供瀏覽的完整原始碼 （頁面存檔備份，存於網際網路檔案館）
* 九號計畫的 Wiki （頁面存檔備份，存於網際網路檔案館） - powered by wikifs
* 檔案索引 （頁面存檔備份，存於網際網路檔案館）
* 使用者手冊 （頁面存檔備份，存於網際網路檔案館）
* 下載頁面 （頁面存檔備份，存於網際網路檔案館）
* 安裝注意事項 （頁面存檔備份，存於網際網路檔案館）
* 常見問答 （頁面存檔備份，存於網際網路檔案館）
* GSoC 的九號計畫專案 （頁面存檔備份，存於網際網路檔案館）
* 採用九號計畫與 inferno 的組織列表 （頁面存檔備份，存於網際網路檔案館）

### 檔案

* FOSDEM 2006 的投影片及 視訊檔 （頁面存檔備份，存於網際網路檔案館）
* Plan 9 is not dead at FAST-OS 2005

### 其他原生及虛擬機器

#### 原生

* 九號計畫 Vita Nuova Holdings 的盒裝版

#### 虛擬

* 九號計畫（頁面存檔備份，存於網際網路檔案館）Qemu 映像檔
* 九號計畫 VMware VMPlayer 虛擬機器
* 九號計畫 （頁面存檔備份，存於網際網路檔案館）Vx32 擴充環境的二進位映像檔

### 其他資源

* 9fans Archive.is 的存檔，存檔日期 2013-02-21，`http://9fans.net` 網站上的九號計畫郵件列表
* Ninetimes （頁面存檔備份，存於網際網路檔案館），九號計畫、Inferno、Unix，以及貝爾實驗室作業系統的新聞頁面
* #plan9，freenode 架設的九號計畫 IRC 頻道
* Reinventing UNIX: An introduction to the Plan 9 operating system, by Hancock, B., Giarlo, M.J., & Triggs, J. A., published in _Library Hi Tech_, 21(4), 471-476.
* Introduction to OS abstractions using Plan 9 from Bell Labs, by Francisco J Ballesteros
* _Das Netzbetriebssystem Plan 9._, 1999, ISBN 3-446-18881-9 by Hans-Peter Bischof, Gunter Imeyer, Bernhard Wellhöfer (born as Kühl), Axel-Tobias Schreiner. 此書已絕版，但可透過隨選列印的服務供應商取得，如 Lulu.com。