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 認為它規模過大,無法完成。Ken Thompson 保留自己認同的理念,捨棄其餘部分,使用一台淘汰的 PDP-7 小型電腦撰寫小型分時系統。Dennis Ritchie 也加入了他。Unix 這個名稱是拿 Multics 開玩笑。
1970 年,系統移植到 Bell Labs 為專利部門打字員購買的 PDP-11,因為文字處理工具比作業系統更容易取得經費。該機器只有 24 KB 核心記憶體,系統與使用者程式分別共用這些記憶體。這次經費上的巧合,促成了 1971 年 11 月出版的第一份 Unix 手冊採用格式化文件,也因此你至今仍會輸入 man 5 crontab。該手冊的章節編號,就是你手冊中的章節編號。
兩項變更讓這項設計固定下來。Pipe 在 1973 年的 Version 3 中加入,因為 Doug McIlroy 多年來主張,程式應能首尾相接,而 Thompson 加入 | operator,讓一個程式的輸出成為下一個程式的輸入。接著,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(美國國防高等研究計畫署)接著資助 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 分支化。每家工作站公司都在自有硬體上推出自有的 Unix,因此到了 1980 年代後期,為某一系統撰寫的程式,必須移植到下一個系統。1988 年,業界分裂成兩個標準陣營:一方是 Open Software Foundation,另一方是 Unix International。雙方多年來持續推出彼此不相容的系統,同時爭論哪一家的 Unix 才是真正的 Unix。
POSIX(可攜式作業系統介面)就是在這場混亂中誕生的。IEEE 1003.1 於 1988 年發布,明確規定類 Unix 系統必須提供的功能:系統呼叫、shell 行為、標準公用程式,以及 C 函式庫介面。這件事的重要性超乎表面,因為標準是規格,不受任何授權條款限制。3 年後,一名學生依照這些文件撰寫了核心。
Minix,以及它留下的空缺
Andrew Tanenbaum 在 1987 年發布 Minix,作為其作業系統教科書的教學系統。Minix 是小型的類 Unix 系統,書中附有原始碼,而且能在學生實際使用的廉價 PC 上執行。它可以在課堂中合法閱讀,因為第 7 版 Unix 已不再具備這項條件。
Minix 刻意維持小巧,因為必須能在書中說明清楚;Tanenbaum 也拒絕了會讓它成為正式生產系統的修補程式。它的授權同樣不是自由授權:你必須購買書籍,而且無法自行決定是否重新發布修改過的 Minix。因此到了 1991 年,學生可以閱讀可運作的類 Unix 核心,卻無法在其上建立任何能長久使用的成果。
GNU 唯獨缺少核心
Richard Stallman 在 1983 年 9 月宣布 GNU 計畫,目標是打造完整的自由 Unix-like 系統。到了 1991 年,GNU 已經完成核心周邊的大部分元件:GCC 編譯器、GNU C 函式庫、二進位公用程式,以及 bash。bash 是 Brian Fox 在 1989 年撰寫的 shell,也是伺服器目前啟動供你使用的 shell。GNU 的核心 Hurd 則一再延宕。
GNU General Public License version 2 於 1991 年 6 月發布。其規則很簡單。你可以使用並修改程式碼;如果要散布修改後的結果,就必須依相同條款散布原始碼。這項規則會在兩節之後成為本故事的關鍵。
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.0.01 版於 1991 年 9 月發布。它沒有與 Unix 或 Minix 共用程式碼。這是為 386 開發的新核心,在 Minix 電腦上完成開發,依照 POSIX 介面撰寫,並搭配當時已存在的 GNU 工具。Tanenbaum 在 1992 年 1 月告訴 Torvalds,單核心是過時的設計。他對設計確實提出了合理的觀點,但 Torvalds 回答的是另一個問題:一名學生擁有的那台廉價電腦,能夠順暢執行什麼系統。
1992 年 2 月,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。之後,USL 修改訴狀,將 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 律師提出的有效法律主張,與一名芬蘭學生開發、沒有人能對其提出訴訟的核心之間做出取捨。這正是 Web 出現、第一批 Linux 發行版問世的時期:Slackware 於 1993 年 7 月推出,Debian 於 1993 年 8 月推出,之後則是 Red Hat 與 SUSE。Red Hat 將這項先發優勢轉化為商業標準,而 從 Red Hat Linux 到 CentOS,再到 Rocky 與 AlmaLinux 的發展路徑,說明了為何一個成立於 1993 年的發行版,至今仍決定許多企業伺服器執行的內容。
另外 4 個因素與法院案件同樣重要。
- 硬體。Linux 從第一行程式碼起就以一般的 386 PC 為目標,而這正是後來價格大幅下降的硬體。BSD 的核心平台是 VAX 與工作站,386 移植則由外部的 2 人負責。
- 授權。GPL 要求發行修改過核心的公司公開其變更,因此廠商的工作會回流到同一個程式碼樹。BSD 授權允許公司將變更保留為私有內容,而公司也確實這麼做了。
- 開發模式。Torvalds 快速合併陌生開發者提交的修補程式,並持續發布新版本。386BSD 的發布速度不夠快,因此自己的使用者在 1993 年分別建立了 NetBSD 與 FreeBSD 這 2 個分支,並在 1995 年再次建立 OpenBSD。
- 動能。開發者會前往其他開發者已經聚集的系統,而驅動程式也會優先為使用者最多的系統開發。
必須如實看待這個技術問題。1994 年的 BSD 是較為成熟的系統,具備一致的基礎、完整記錄的發展歷史,以及 Linux 花了數年才追上的網路程式碼。1994 年沒有人選擇 Linux,是因為它比較好。人們選擇它,是因為它當時可用、不受法律限制、能在既有硬體上執行,而且每週都在進步。
BSD 保留了什麼,以及目前運行在哪裡
BSD 持續發展至今。它失去的是預設地位。最清楚的證據就在你的電腦上:OpenBSD 專案在 1999 年撰寫了 OpenSSH,而如今幾乎所有發行的 Linux 系統都使用它作為 SSH 伺服器,因此 值得學習的 SSH 金鑰使用習慣在這兩個家族上完全相同。
Netflix 透過 FreeBSD 設備提供影片串流服務。Juniper 路由器使用的作業系統 Junos,其底層是 FreeBSD。PlayStation 系統軟體源自 FreeBSD。Apple 的 macOS 與 iOS 在核心及整個 userland 中都包含 BSD 程式碼。讓 BSD 失去共用伺服器程式碼樹的寬鬆授權,反而使 BSD 程式碼進入大量完全不標示 BSD 的硬體。
如果你今天要做選擇,問題在於實務,而不是歷史。比較 Linux 與 FreeBSD 作為伺服器,重點在於 ZFS、jails、ports tree,以及有多少第三方軟體預設底層是 Linux。FreeBSD 15 作為伺服器是目前仍受維護的系統,不是博物館展品。至於 Linux 與 Windows Server 的比較,則是另一個問題,答案取決於你的應用程式堆疊。
你今天在 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 撰寫這些呼叫,而每個網路 daemon 至今仍使用它們。
- POSIX。依照標準撰寫的
#!/bin/shscript,可以在 Linux、FreeBSD、macOS 和 Solaris 上直接執行,因為這項標準正是它們共同實作的內容。
有一項繼承沒有延續下來:Linux 從 System V 採用的 shell-script 開機程序,現在幾乎已從所有發行版中消失,而以 systemd 取代它的論點,是最近一次關於 Unix-like 系統應有樣貌的爭論。
當你租用虛擬私有伺服器並登入時,你是在對著一個為 24 KB 記憶體、且需要服務專利部門的機器所設計的介面輸入指令。這個介面之所以延續至今,是因為它曾被公開、經過討論與標準化,之後又由從未獲准查看原始程式碼的人員重新實作。
FAQ
Linux 是否包含任何原始 Unix 程式碼?
沒有。Linus Torvalds 從 1991 年開始自行撰寫核心,目標是 POSIX 介面,而不是任何 AT&T 原始碼。Unix 的繼承關係體現在設計與公開介面上,包括檔案、程序、管線及系統呼叫名稱。核心周邊的 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 消失。它只是讓 BSD 的採用停滯了 2 年,正值全球選擇免費 Unix 的時期。
Linux 為何取代 BSD,成為伺服器平台?
法律上的確定性是原因之一:1992 年至 1993 年期間,Linux 沒有面臨訴訟,而 BSD 正在應訴。其他原因包括從第一天起就以 386 為目標、GPL 將供應商的修改帶回單一程式碼樹,以及足夠快速的合併流程,能在 386BSD 分裂成 3 個分支時持續吸引貢獻者。技術優勢並非決定因素,因為 BSD 在 1994 年是更完整的系統。
FreeBSD 現在仍值得使用嗎?
值得,原因很具體:ZFS 已整合至基礎系統、jails 提供成熟的隔離模型、基礎系統以一致的整體方式開發,以及文件內容能維持正確。代價是相容性處理,因為大多數第三方伺服器軟體、容器工具及供應商支援都以 Linux 為前提。選擇 FreeBSD 時,應確認其儲存與網路功能足以抵銷這項代價,而不是出於對較早期系統譜系的忠誠。