貝爾實驗室九號計劃(英語:Plan 9 from Bell Labs,常簡稱為Plan 9)是一個分散式作業系統,由貝爾實驗室的計算科學研究中心在1980年代中期至2002年開發,以作為UNIX的後繼者。它現在仍然被作業系統的研究者和愛好者開發使用。[4][5]
Plan 9的特色功能有:將所有本地和遠端資源以檔案形式組織的9P協定,union mounts,改進的行程檔案系統以及原生的Unicode支援。在Plan 9中,所有的系統介面(如網絡和用戶介面介面),都是作為檔案系統的一部分呈現,而不像其他作業系統上一樣擁有自己獨立的介面。
Plan 9得名於艾德·伍德1959年拍攝的B級科幻電影外太空九號計劃 [6],而它的標誌格倫達來自同一導演拍攝的另一部電影忽男忽女。
2021年3月21日,目前所屬諾基亞旗下的貝爾實驗室,宣佈將一切知識產權以及未來開發工作轉交給新成立的九號計劃基金會(Plan 9 Foundation)。[7]
歷史
九號計劃在貝爾實驗室中取代UNIX成為組織中主要的研究開發平台。與原先的UNIX模型相較,其發展出來的數種改變改善了系統的使用及程式開發,尤其是在分散式多用戶環境中。起先在1980年中期,九號計劃只是貝爾實驗室的內部計劃。到了1992年,貝爾實驗室提供第一個公開版本提供給學院使用。在1995年,商業化的第二版釋出提供一般大眾使用。1990年代後期,朗訊科技繼承了貝爾實驗室後,對商業化九號計劃失去了興趣。到了2000年釋出了非商業化的第三版,採用開放原始碼授權。而2002年的第四版更採用自由軟件授權。
一個包括現任和前任貝爾實驗室成員與麻省理工學院成員參與的用戶與開發人員社群,仍每天以光碟影像檔的形式持續提供每日更新釋出的檔案。貝爾實驗室也仍舊承續九號計劃的開發[10]。開發中的原始碼檔案可以透過9P及HTTP協定加以存取並用於既有安裝檔案的更新[11]。除了光碟映像檔中作業系統所包含的官方套件以外,貝爾實驗室也架設了一個空間供外部開發的應用程式與工具存放。
概觀
貝爾實驗室九號計劃主要是由貝爾實驗室計算科學研究中心(Computing Sciences Research Center)的成員所開發,該團體也曾開發UNIX及C語言[12]。九號計劃團隊原先由羅勃·派克、肯·湯普遜、Dave Presotto及Phil Winterbottom所帶領,及計算科學研究中心主管丹尼斯·里奇所支援。在多年的開發過程中,有許多開發人員對這項專案做出了不小的貢獻,如布萊恩·柯林漢、Tom Duff、道格拉斯·麥克羅伊、比雅尼·史特勞斯特魯普、Bruce Ellis、Steve Simon等人[13]。
九號計劃是針對現代分散式環境而從開始就設計成一種網絡作業系統並加以開發。不同於UNIX是在設計後才增加圖形化使用者介面的功能,九號計劃打一開始就內建了。雖然仍未成為大受歡迎的UNIX衍生系統,但仍有持續成長的開發者社群。
九號計劃具備了分散式架構,它可以被安裝並使用於單一自含系統上,也有能力把作業系統的功能套件散佈於分散的硬件平台上。在標準的九號計劃安裝系統中,用戶會以一個輕量化的終端機執行Rio 圖形化使用者介面透過網絡連接到CPU伺服器來處理計算密集型(computation-intensive)的程式,並藉由額外的檔案伺服器及歸檔儲存系統提供長期的資料儲存。現有的桌上電腦亦可以在內部使用多個虛擬機器重現此種架構。
設計概念
九號計劃的設計者對與微核心類似的目標感興趣,但是以不同的架構與設計細節來達成這些目標。九號計劃的設計目標如下:
在UNIX之前,多數的作業系統都各自有不同的機制來存取不同類型的裝置。舉例來說,存取磁碟的API與自序列埠傳送或接收的API、又或是操作印表機所使用的API,彼此之間都有所不同。
UNIX藉由透過磁碟索引節點(disk inodes)執行所有輸入/輸出操作來嘗試移除這些差異。每個裝置都被要求必須要支援帶有意義的讀取和寫入操作用以作為控制的手段。這也允許用戶無須了解底層的實作細節,便能利用如cp及dd等指令從任一裝置送出資料給其他的裝置。然而在此同時,許多關鍵的概念(如控制行程的狀態)並沒有一致地對應到檔案系統上。如同柏克萊介面與X Window系統等的新功能被開發出來以後,以檔案系統之外的方式實作。新的硬件功能(如在軟件中使光碟機退片的功能)也建議採用特定硬件(hardware-specific)控制的機制,如使用ioctl系統呼叫等。
九號計劃不採用這些不同的實作,而且回歸到以檔案系統為中心(file system-centric)的系統觀點。無論是網絡或者用戶介面、甚至是視窗本身,所有可用資源對於每個九號計劃的程式來說,都是階層式檔案系統的一部份,而非特定的介面[10]。
九號計劃擴充系統到超越檔案的概念,來到了「名稱」的層次。無論是電腦的檔案、顯示器、用戶或電腦本身,都是一個獨一無二的路徑名稱。這些都是透過既有的UNIX標準來處理,並擴充至所有的物件皆可以用一致的方式來命名及定址。這跟萬維網所使用的URI的概念很相似。在UNIX中,像印表機這樣的裝置會透過軟件轉換的方式在/dev
以名稱代表,但這種定址方式只對實體連接到硬件上的裝置有效,並不能套用到網絡裝置上。在九號計劃系統中,所有的印表機都會以檔案的方式呈現,而且可以透過網絡被任何工作站存取。
九號計劃的另一個創新點則是用戶可以對相同的「真實世界」物件各自分別取不同的名稱。每個用戶都可以藉由在他們的命名空間中收集各式各樣不同的物件來創造屬於他們自己的個人化環境。UNIX也有類似的觀念,用戶可以複製其他用戶來獲取權限。但是九號計劃則把這種作法擴充到所有的物件,用戶可以輕易地產生自身的「複製品」,加以修改,就算移除這些複製品也不會影響他們創造過的資源。
UNIX允許從不同的資源透過「連結」或檔案系統「掛載」的觀念來建立檔案系統。這些功能會封鎖掉原先的目錄,如果有人在名為「net」的目錄下掛載了新的檔案系統,會導致無法存取先前可以在「net」目錄下存取的內容,除非取消掛載的操作。
九號計劃則採用合併目錄的想法,從不同媒體或網絡資源合併的目錄會以透明(transparently)的方式繫結。舉例來說,可以把別台電腦的/bin
(應用程式)目錄跟本機端繫結,接下來這個目錄就會同時有本地端以及遠端的應用程式在裏面,用戶可以無障礙的存取近端或是遠端的程式。使用相同系統的情況下,九號計劃所控制的外部裝置與資源可以繫結到/dev
目錄下,這可以讓裝置不需要任何額外的程式,就可以透過網絡進行分享。
列出所有執行中行程的/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
[1] 的指令所提供的功能類似,只是掛載的目錄不是/net
而是/p
,提供的網絡協定也只有/tcp
而已。
九號計劃雖然是基於UNIX,但是設計上則是想達成運算系統核心功能間彼此溝通的觀念。所有系統資源都被當成檔案般地命名及存取,並提供可根據在特定機器上各個程式設置的多種分散式系統視圖(view)。這種讓伺服器以類似傳統檔案的方式,把任何資訊都呈現給用戶及應用程式的實作方式,增進了應用程式設計上的一般化與模組化的能力。
九號計劃支援網絡通透性的關鍵在於採用一種新的底層網絡協定9P。9P協定實作了連結到命名網絡物件並以類檔案(file-like)系統呈現的方式。藉由快速的位元導向(而非區塊導向),分散式檔案系統可以把任何物件視覺化的呈現,而非透過遠端機器上的一個NFS伺服器再加以呈現。這個協定可以用來跟行程、程式、資料、以及包含用戶介面及網絡以及彼此之間進行通訊。在第四版中,這個協定作了一些修改並且更名為9P2000。
九號計劃的系統採用Unicode作為編碼機制。九號計劃中運用由Ken Thompson提出重大修改的UTF-8作為整個系統中的原生編碼,並在1992年將整個系統提供作一般使用[14]。不過九號計劃僅支援Unicode中基本多文種平面中有定義的部份。
實作
除了x86架構下有可安裝的實行環境之外、九號計劃也移植到MIPS、DEC Alpha、SPARC、PowerPC、ARM及其他硬件平台上。系統以衍生自ISO/ANSI C的語言所編寫。部分應用程式原先以Alef撰寫,但目前皆以C語言改寫。九號計劃支援以POSIX應用程式透過APE來模擬柏克萊介面介面。近來有一套新的應用程式linuxemu被開發用來執行Linux的程式,目前仍有許多要改進的地方。
影響
UNIX其中一個中心概念是所有系統介面皆可以一組檔案的形式呈現,而九號計劃成功地把這個概念以現代分散式系統實作出來。九號計劃的一些功能,像是Unicode中的UTF-8編碼,也被其他作業系統所實作。一些類UNIX作業系統,例如Linux,也實作9P、九號計劃的檔案系統,以及部份實作的類rfork指令的系統呼叫。除此之外,在Plan 9 from User Space中許多九號計劃所採用的應用程式及工具,例如rc shell,也被移植到UNIX以及LINUX系統上,而且還有一定程度的人氣。Glendix這個專案則嘗試以GNU/Linux作業系統取代九號計劃,或者是說,以Linux核心來取代九號計劃的核心。
然而,九號計劃並未能像UNIX一樣熱門,變成主要只是一種研究用的工具。九號計劃被評為"作用看來不過是能在作業系統研究領域產生有趣論文的裝置"[16]。Eric S. Raymond在他的著作The Art of Unix Programming中則推測九號計劃缺乏被接受度。
"九號計劃會失敗單純只是因為它的改進程度沒大能取代Unix。與九號計劃相較,雖然UNIX看來破破爛爛又有明顯缺失,但是它還是能好好的把工作完成,這就足以保住它的地位了。這件事情給那些有雄心壯志的系統架構的一堂課是:更好的解決方案最危險的敵人是現有的程式碼庫已經夠好了。"[16]
對於九號計劃的評論像是在作業系統設計中把九號計劃列為糟糕的更好的典範,其他常見的評論則有九號計劃作業系統中缺乏「優雅」(polish)及開發環境[17]、九號計劃中達到商業化程度的軟件支援量不足[18]。
九號計劃的支持者和開發人員聲稱阻礙其發展的問題已被解決,原先作為分散式系統、開發環境、研究平台的目標也都已經達成,而且也慢慢地開始有人採用。可透過Inferno的寄存能力將九號計劃的技術帶給其他系統,形成異構網格運算中的一部份[19][20][21][22]。
授權
完整的原始碼 (頁面存檔備份,存於互聯網檔案館)可以免費的在朗訊公共許可證1.02版的授權之下取得,而且被開放原始碼促進會認為是開放原始碼軟件及自由軟件基金會認為是自由軟件。它雖然有通過Debian自由軟件指導方針,不過不相容於GNU通用公共許可證。 2021年3月23日之後,所有版本以MIT License授權。[23]
參照
- 9P(或Styx) - 檔案系統的協定
- rendezvous - 基礎的同步機制
- Brazil - 變成九號計劃第四版的專案
參見
參考文獻
外部連結
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.