跳轉到

1994 - Linux 1.0 與發行版(從玩具到系統)#

案件摘要#

1994 年 3 月 14 日,Linux 1.0 發布——約 176,250 行程式碼,支援 TCP/IP 網路、X Window System、SCSI。 同年 Slackware 1.0(1993.7)已先行、Red Hat(1994.10)隨後——「發行版」讓 Linux 從「核心+手工拼裝」變成可安裝的完整系統。

\[ \text{Linux 1.0(核心)} + \text{發行版(工具+安裝器)} = \text{可用的作業系統}. \]

前因 -- 為什麼會有這個案子#

  • 1.0 的門檻:0.01–0.99 期間經過 2 年的社群演化,1991 年還沒有網路的 0.01,到 1.0 已有完整 TCP/IP——網路支援是「玩具→系統」的分水嶺。
  • 彌補的缺陷:1992–93 年裝 Linux 要自己湊 GNU 工具、自己 mount 磁碟、自己編譯——安裝體驗極差。發行版把「核心+工具+安裝器+套件」打包。
  • Red Hat 的 RPM(1995):Red Hat Package Manager——二進位套件 + 依賴聲明,使用者不用再自己編譯原始碼。

線索與推理 -- 1.0 版的技術面貌(1994)#

技術 1.0 版狀態 版本與年份脈絡
網路 TCP/IP、SLIP、PPP 0.96 版(1992.7)首次加入初步 TCP/IP
檔案系統 Minix FS、ext FS、Xia FS ext(1992,Remy Card)突破 14 字元檔名
行程 fork/exec、訊號、管線 與 0.01 相比完備
圖形 X11R5 支援 透過 XFree86(1992)
程式碼量 176,250 行 0.01 的 17 倍——網路協作的兩年成果

C 範例:1.0 版的 ext 檔案系統突破#

/* ext (1992):突破 Minix FS 的 14 字元檔名與 64MB 檔案上限 */
struct ext_dir_entry {
    __u32 inode;              /* 檔案的 inode 號 */
    __u16 rec_len;            /* 目錄項長度 */
    __u8  name_len;           /* 檔名長度(最長 255) */
    char  name[EXT_NAME_LEN]; /* 檔名本體 */
};

Shell 範例:發行版的安裝革命#

# 1992 年(無發行版):自己拼裝
$ fdisk /dev/hda
$ mke2fs /dev/hda1
$ mount /dev/hda1 /mnt
$ # 手動解壓 GNU 工具、手動設定 lilo...

# 1995 年(Red Hat + RPM):一個指令
$ rpm -ivh gcc-2.7.2-1.i386.rpm    # 安裝二進位套件
$ rpm -q --requires gcc            # 查依賴聲明

Python 範例:RPM 依賴聲明的模型#

# RPM (1995):套件帶著依賴聲明——安裝器可檢查
rpm_gcc = {
    "name": "gcc", "version": "2.7.2",
    "requires": ["glibc >= 2.0", "binutils >= 2.6"],
}
def can_install(pkg, installed):
    return all(any(dep_name in p for p in installed)
               for dep_name in [r.split()[0] for r in pkg["requires"]])

結案 -- 後果與影響#

  • RPM → YUM(2003)→ DNF(2014):依賴解決從「聲明」進化到「自動求解」。
  • Debian(1993.8)+ dpkg/APT(1998):另一支發行版傳統(見 ../UNIX/1993-發行版與FreeBSD誕生.md)。
  • 1.2(1995):加入 Alpha、SPARC 平台支援——Linux 第一次跨出 x86(可移植性的勝利)。
  • 歷史教訓:核心與發行版是兩件事——核心要自由,發行版要好用。

關鍵人物與文獻#

  • L. Torvalds:Linux 1.0 (1994)。
  • R. Card:ext 檔案系統 (1992)。
  • M. Ewing:RPM (1995, Red Hat)。
  • 相關案件:1991-Linux0.01誕生.md、1996-Linux2.0與SMP.md。