Unix 與 Linux 歷史:從 1969 年到現在
了解 Unix 如何從 Bell Labs 的 1969 年起源,經 AT&T 授權、Berkeley BSD 與 1992 年訴訟,最終讓 Linux 而非 BSD 進入伺服器機架。
Unix 與 Linux 的簡史
Unix 與 Linux 的歷史,核心是一場持續爭論:誰有權擁有原始碼。Unix 於 1969 年在 Bell Labs 開始發展。Linux 於 1991 年在 Helsinki 開始發展,且未使用任何 Unix 原始碼。兩者之間延續的是設計理念與一組公開介面:檔案、程序、管線,以及能將小型程式串接起來的 shell。Unix 在 1970 年代透過大學廣泛傳播,原因是 1956 年的反托拉斯和解協議禁止 AT&T(American Telephone and Telegraph)銷售軟體,因此 Bell Labs 改以低價授權原始碼。Unix 最終遍布各處,但在 AT&T 以外沒有其他擁有者;後續的授權爭議,則決定了最終進入你伺服器機架的免費 Unix-like 系統。
1969:一台備用 PDP-7,以及延續至今的構想
Bell Labs 在 1969 年退出 Multics 專案。Multics(multiplexed information and computing service)是由 MIT、General Electric 與 Bell Labs 共同開發的大型分時系統。Bell Labs 認為這個系統過於龐大,無法完成。Ken Thompson 保留他認同的構想,捨棄其餘部分,並在一台淘汰的 PDP-7 小型電腦上撰寫小型分時系統。Dennis Ritchie 也加入了他。Unix 這個名稱是用來嘲諷 Multics 的玩笑。
1970 年,系統移植到 Bell Labs 為專利部門打字員購買的 PDP-11,因為文字處理工具比作業系統更容易取得經費。該機器配備 24 KB 核心記憶體,由系統與使用者程式分用。這次偶然的經費安排,促成了第一份 Unix 手冊;該手冊的日期為 1971 年 11 月,內容是一組經過排版的文件。這也是你至今仍會輸入 man 5 crontab 的原因。該手冊中的章節編號,就是你手上手冊的章節編號。
兩項變更讓這套設計固定下來。管線在 1973 年的 Version 3 中加入,因為 Doug McIlroy 多年來一直主張,程式應能首尾相接;Thompson 也加入 | 運算子,讓一個程式的輸出成為下一個程式的輸入。接著,1973 年稍晚推出的 Version 4 改以 C 重寫。以可移植語言撰寫的作業系統,可以移植到原本未針對其開發的硬體上。這就是 Unix 能存續至今,並超越最初執行它的每一台機器的原因。
Unix 為何普及:AT&T 不得販售 Unix
1956 年的同意裁決解決了針對 AT&T 的反托拉斯案件。AT&T 保留電話服務的壟斷地位,並接受一項限制作為交換:不得經營電信以外的業務。軟體就是其中一項。因此,當大學要求取得 Unix 時,Bell Labs 不能將它作為產品販售。Bell Labs 以象徵性費用授權原始碼,且不提供支援或保固。
這造成了重大影響,而且並非 AT&T 原先的計畫。1975 年發布的 Sixth Edition Unix,連同完整原始碼進入數百個電腦科學系所。University of New South Wales 的 John Lions 將該核心原始碼印製出來,逐行加上註解並據此授課。整整一代人透過閱讀真正的作業系統,學會作業系統的運作方式。
接著,授權條款改變了。1979 年的 Seventh Edition 授權禁止在課堂上使用原始碼,因此 Lions 的註解只能以一份又一份影印本的形式流傳。整個故事就是如此。Unix 同時到處存在,卻不是自由軟體;因此,任何人所做的每項改進,都是對他人專有程式碼的改進。
Berkeley:你實際會輸入的 Unix 部件
Ken Thompson 在 1975 至 1976 學年度任職於 University of California, Berkeley,並留下了一個非常活躍的 Unix 團隊。Berkeley 的 Computer Systems Research Group (CSRG) 發行包含本地改良內容的磁帶,這些磁帶後來成為 BSD,也就是 Berkeley Software Distribution。Bill Joy 負責早期大量開發工作:1978 年推出 1BSD,接著在 1979 年推出包含 vi 編輯器與 C shell 的 2BSD。
C shell 是 !! 和 !$ 的來源。Bash 繼承了這套語法,因此四十多年後,在雙引號中輸入驚嘆號時,bash 的歷程記錄展開仍會讓人感到意外。
DARPA(US Defense Advanced Research Projects Agency)接著資助 Berkeley,將新的網際網路協定加入 Unix。4.2BSD 於 1983 年 8 月發行,提供 TCP/IP(transmission control protocol over internet protocol)與 socket application programming interface。伺服器上的每個網路服務仍會依序呼叫 socket()、bind()、listen() 和 accept(),因為這些名稱是 Berkeley 在 1983 年選定的。
有一項細節決定了接下來十年的發展。BSD 磁帶不是完整的系統,而是 AT&T Unix 的一組附加內容;若要合法執行,必須持有有效的 AT&T 原始碼授權。Berkeley 花了數年時間逐一檔案替換 AT&T 的部分,改用自己的程式碼。這些替換是否確實完整,成了後來提交法院審理的問題。
1984:拆分,以及隨後的 Unix 戰爭
Bell System 於 1984 年 1 月 1 日拆分,讓 AT&T 無法經營軟體業務的同意令也隨之失效。AT&T 現在可以將 Unix 作為產品銷售,而且確實這麼做了。商業原始碼授權變得昂貴,因此 Unix 不再是大學提供給學生使用的低成本軟體。
各家廠商早已將它分支。每家工作站公司都在自有硬體上推出自有的 Unix,因此到了 1980 年代末期,為某個系統撰寫的程式,通常都必須移植到下一個系統。1988 年,產業分裂成兩個標準陣營:一方是 Open Software Foundation,另一方是 Unix International。雙方多年來持續推出彼此不相容的系統,同時爭論哪一家的 Unix 才是真正的 Unix。
POSIX(可攜式作業系統介面)就是在這片混亂中形成的。IEEE 1003.1 於 1988 年發布,明確定義類 Unix 系統必須執行的內容:系統呼叫、shell 行為、標準工具,以及 C library 介面。這件事的重要性超乎表面,因為標準是規格,不受任何授權條款涵蓋。三年後,一名學生依據這些文件撰寫了 kernel。
Minix,以及它留下的空缺
Andrew Tanenbaum 在 1987 年發布 Minix,作為其作業系統教科書的教學系統。Minix 是小型 Unix-like 系統,原始碼隨書附上,而且能在學生實際擁有的平價 PC 上執行。它可以合法地在教室中閱讀,而 Seventh Edition Unix 已不再具備這項條件。
Minix 刻意維持小巧,因為必須能在書中說明清楚;Tanenbaum 也拒絕了可能使其成為 production system 的修補程式。其授權條款也不是 free:你必須購買該書,而且無法自行決定是否重新發布修改後的 Minix。因此到了 1991 年,學生可以閱讀一個可運作的 Unix-like kernel,卻無法以它建立任何能長久維持的成果。
GNU 擁有除 kernel 之外的一切
Richard Stallman 在 1983 年 9 月宣布 GNU project,目標是建立完整的自由 Unix-like system。到了 1991 年,GNU 已經完成 kernel 周邊的大部分元件:GCC compiler、GNU C library、binary utilities,以及 bash。bash 是 Brian Fox 在 1989 年撰寫的 shell,也是目前 server 啟動後讓你使用的 shell。GNU kernel Hurd 則一直延遲完成。
GNU General Public License version 2 於 1991 年 6 月發布。它的規則很簡單。你可以使用並修改程式碼;如果散布修改後的成果,就必須依照相同條款散布原始碼。這項規則會在兩個 section 之後成為本故事的關鍵。
1991 年 8 月:發表至 comp.os.minix 的貼文
1991 年 8 月 25 日,赫爾辛基的一名學生在 Usenet 群組 comp.os.minix 發表了一則貼文:
Hello everybody out there using minix -
I'm doing a (free) operating system (just a hobby, won't be big and
professional like gnu) for 386(486) AT clones.Version 0.01 於 1991 年 9 月發布。它沒有與 Unix 或 Minix 共用程式碼。這是為 386 開發的新核心,在 Minix 機器上開發,依據 POSIX 介面撰寫,並搭配當時已存在的 GNU 工具。1992 年 1 月,Tanenbaum 告訴 Torvalds,單體式核心是過時的設計。就設計而言,他的觀點確實有道理;但 Torvalds 回答的是另一個問題:如何讓程式在學生擁有的那台廉價電腦上良好運作。
1992 年 2 月,Version 0.12 依 GPL 重新授權。Torvalds 後來稱這是他做過最好的決定。原始的 Linux 授權禁止任何金錢交易,這會阻礙後來出現的 CD 供應商與支援公司。GPL 允許商業活動,同時要求所有散布的修改都回到同一個共享程式碼樹。
訴訟:1992年4月至1994年2月
Berkeley 於1991年6月發布 Networking Release 2 (Net/2):這是一套幾乎完整的 BSD 系統,但已移除源自 AT&T 的檔案。其中缺少6個核心檔案。Bill 和 Lynne Jolitz 撰寫替代版本,於1992年3月發布 386BSD 0.0,接著於1992年7月14日發布 386BSD 0.1。此時,386 平台已經有一套免費、完整且成熟的 BSD;Linux 仍只是業餘核心。Berkeley Software Design, Inc. (BSDi) 販售附支援服務的商業版本 BSD/386,並使用電話號碼 1-800-ITS-UNIX 進行宣傳。
1992年4月,當時擁有 Unix 的 AT&T 子公司 Unix System Laboratories (USL),在 New Jersey 聯邦法院以營業秘密與 Unix 商標為由起訴 BSDi。之後,訴訟追加 University of California 的 Regents 為被告。University 於1993年在 California 反訴,主張 AT&T 將 Berkeley 程式碼放入 System V 發布,卻未提供其自身授權條款要求的著作權標示。
法律爭議的核心於1993年瓦解。Judge Dickinson Debevoise 拒絕 USL 提出的初步禁制令,認為 USL 對較早期 32V 程式碼提出的著作權主張很可能無效,因為 AT&T 多年來發布該程式碼時都未附著作權標示。Novell 於1993年年中向 AT&T 收購 USL,而 Novell 管理階層希望結束這場爭議。案件於1994年2月和解。Berkeley 發布的約18,000個檔案中,有3個遭到移除,約70個檔案則新增 USL 著作權標示。
Berkeley 於1994年6月發布 4.4BSD-Lite,該版本在法律上沒有問題。FreeBSD 與 NetBSD 都是在1993年以有爭議的 Net/2 程式碼為基礎成立,因此必須以新的基礎重新建置系統;這項工作占用了1994年剩餘時間的大部分。Linux 1.0 於1994年3月發布,正值這項重建工作的中期。
Linux 為什麼取得了伺服器市場,而不是 BSD?
訴訟是最常見的答案,而且確實是原因之一。在 1992 年 4 月到 1994 年 2 月之間,任何想為產品選用免費 Unix 的人,都必須在 AT&T 律師提出的有效法律主張,以及一名無人能據此提告的芬蘭學生所開發的 kernel 之間做取捨。這正是 web 開始普及、第一批 Linux distributions 出現的時期:Slackware 於 1993 年 7 月推出,Debian 於 1993 年 8 月推出,接著是 Red Hat 與 SUSE。
另外 4 項因素的重要性不亞於法院案件。
- 硬體。Linux 從第一行程式碼開始,就以普及型 386 PC 為目標,而這正是價格逐漸降低的硬體。BSD 的核心平台是 VAX 與 workstation,386 port 則是由 2 人在體系外完成的工作。
- 授權條款。GPL 要求發布修改版 kernel 的公司公開變更內容,因此廠商的工作會回流至同一個程式碼樹。BSD license 允許公司將變更保留為私有內容,而公司確實這麼做了。
- 開發模式。Torvalds 快速合併陌生開發者提交的 patch,並持續發布新版本。386BSD 的發布速度太慢,以致其使用者在 1993 年分叉出 NetBSD 與 FreeBSD,並在 1995 年再次分叉出 OpenBSD。
- 動能。開發者會前往其他開發者已經聚集的地方,而 driver 也會為使用者最多的系統撰寫。
必須如實看待這個技術問題。1994 年的 BSD 是較完整的系統,具備一致的基礎、完整記錄的發展歷史,以及 Linux 花了數年才追上的 networking code。1994 年沒有人因為 Linux 比較好而選擇它。人們選擇 Linux,是因為它已經可以取得、不受法律束縛、能在既有硬體上執行,而且每週都在改進。
BSD 保留了什麼,以及目前在哪裡運作
BSD 持續發展。它失去的是預設地位。最明確的證據就在你的電腦上:OpenBSD 專案於 1999 年建立了 OpenSSH,而如今幾乎每個推出的 Linux 系統都以它作為 SSH server。因此,值得學習的 SSH key 使用習慣在這兩個系統家族中完全相同。
Netflix 透過 FreeBSD appliance 提供影片串流。Juniper router 使用的作業系統 Junos,其底層是 FreeBSD。PlayStation 系統軟體也源自 FreeBSD。Apple 的 macOS 與 iOS 在 kernel 及整個 userland 中都包含 BSD 程式碼。讓 BSD 失去共用 server 程式碼樹的寬鬆授權,反而使 BSD 程式碼進入大量完全不提及 BSD 的硬體。
如果你現在要做選擇,問題在於實務,而不是歷史。比較 Linux 與 FreeBSD 作為 server,重點在於 ZFS、jails、ports tree,以及第三方軟體對底層 Linux 的依賴程度。FreeBSD 15 作為 server是目前仍受維護的系統,不是博物館展品。至於 Linux 與 Windows Server 的比較,則是另一個問題,答案取決於你的 application stack。
你今天在 VPS 上使用的 1969 年設計
以下每一項都比大多數使用者的年齡更大。
- 管線。
who | wc -l會統計已登入的使用者,因為 1973 年的 Version 3 Unix 讓一個程式的輸出可以成為另一個程式的輸入。 - 手冊章節。
man 1 ls和man 5 crontab使用 1971 年 11 月手冊中的編號方式。 - 檔案系統分割。
/usr的存在,是因為 1971 年那台 PDP-11 的 root 磁碟已經滿了,開發人員便將檔案移到第二個磁碟組。此後各發行版逐漸取消這項分割:在 Ubuntu 24.04 或 Debian 13 上執行ls -ld /bin,會得到一個指向usr/bin的 symbolic link。 - socket 呼叫。Berkeley 在 1983 年為 4.2BSD 撰寫了這些呼叫,而每個 network daemon 至今仍在使用它們。
- POSIX。根據標準撰寫的
#!/bin/shscript,不需修改即可在 Linux、FreeBSD、macOS 和 Solaris 上執行,因為這項標準正是它們共同實作的內容。
當你租用虛擬專用伺服器並登入時,你是在一個為擁有 24 KB 記憶體、且需要服務專利部門的機器所設計的介面上輸入指令。這個介面之所以延續至今,是因為它曾被公開、反覆討論並標準化,之後又由從未獲准查看原始程式碼的人員重新實作。
FAQ
Linux 是否包含任何原始 Unix 程式碼?
沒有。Linus Torvalds 從 1991 年開始自行撰寫 kernel,目標是 POSIX 介面,而不是任何 AT&T 原始碼。Unix 的傳承體現在設計與公開介面,包括檔案、程序、管線及系統呼叫名稱。kernel 周邊的 GNU 工具也從 1983 年開始自行撰寫。這種獨立性使 AT&T 針對 BSD 程式碼提起的訴訟完全未波及 Linux。
AT&T 何時對 BSD 提起訴訟?這起訴訟是否摧毀了 BSD?
擁有 Unix 的 AT&T 子公司 USL 於 1992 年 4 月起訴 BSDi,之後又將 University of California 列為被告。1993 年,法官拒絕核發初步禁制令,認定針對較早期 32V 程式碼提出的著作權主張很可能無效。Novell 於 1993 年年中收購 USL,雙方於 1994 年 2 月和解;約 18,000 個檔案中有 3 個被移除,約 70 個檔案加上新的著作權聲明。這起訴訟沒有摧毀 BSD。它只是在全球選擇免費 Unix 的兩年間,凍結了 BSD 的採用。
Linux 為何取代 BSD,成為伺服器的主流?
法律上的確定性是其中一個原因:在 1992 年至 1993 年間,Linux 沒有面臨訴訟,而 BSD 正在應訴。其他原因包括從第一天就以 386 為目標、GPL 讓廠商的修改回流至單一程式碼樹,以及足夠快速的合併流程,能在 386BSD 分裂成 3 個分支時持續吸引貢獻者。技術優勢並不是決定因素,因為 BSD 在 1994 年是完成度較高的系統。
FreeBSD 現在仍值得使用嗎?
值得,理由很具體:ZFS 已整合至 base system、jails 是成熟的隔離模型、base system 以一致的整體方式開發,以及持續保持準確的文件。代價是相容性處理,因為大多數第三方伺服器軟體、容器工具及廠商支援都以 Linux 為前提。當 FreeBSD 在儲存與網路方面的優勢足以抵銷這項代價時,再選擇 FreeBSD,而不是出於對較早期系譜的忠誠。