是什麼構成了 GNU 發行版?

是什麼構成了 GNU 發行版?

所以GNU/Linux是一個作業系統,至少由幾個程式組成:Linux kenel、gcc、gnu-binutils、Gnome桌面等。

  • 是什麼造就了 Linux 發行版 GNU?是編譯核心的工具嗎?是發行版附帶的工具嗎?

  • 是否存在基於 Linux 但不是 GNU 的功能齊全的桌面作業系統?

答案1

自由軟體基金會認為大多數 Linux 發行版實際上都是 GNU 系統,恰好使用 Linux 核心。他們的這項主張基於以下事實:在 Linux 出現之前,GNU 是一個開發自由作業系統的長期項目,並且內核只是最後缺少的部分。他們是對的,因為幾乎所有基於 Linux 的桌面和伺服器發行版都至少使用一些 GNU 元件,也許最重要的是GNU C 函式庫(glibc),GNU 核心實用程式(coreutils) 和重擊殼。此外,Linux 核心開發本質上與 GCC 相關,因為GCC 擴展的利用

一些嵌入式系統,也許最著名的是 Google 的 Android,不使用任何 GNU 元件或函式庫。例如,在 Android 中,GNU C 函式庫被 Google 自己的、基於 BSD 的 Bionic C 函式庫取代。 FSF 同意將此類系統稱為“GNU 系統”或“GNU/Linux”,但另一方面他們也不希望這些系統只是被稱為「Linux」系統。至少我們可以得出這樣的結論:使用 GNU 工具建立核心似乎已經達成共識:不是使系統成為“GNU 系統”。

答案2

GNU/Linux 術語的歷史可以追溯到 20 世紀 90 年代初。

1991 年,Linus Torvalds 在赫爾辛基的臥室裡開始了 Linux 核心專案。不久之後,在網路興起的幫助下,Linux 核心開始獲得巨大的關注。

Richard Stallman 的 GNU 專案當時仍計劃使用 HURD 微內核作為計劃中的 GNU 作業系統的核心。然而,當 Linux 發行版(基於 Linux 核心的免費類 Unix 作業系統)開始圍繞新的 Linux 核心專案形成時,Stallman 開始感興趣。 1993 年 Debian 計畫在 Ian Murdock 的領導下啟動時,FSF 為這個年輕的計畫提供了一些財政支持。然而,Debian 開發人員很快就與 Stallman 和 FSF 分道揚鑣,部分原因是技術問題。例如,一個問題是 Stallman 希望在程式中保留調試符號,而 Debian 希望刪除它們。

Debian 和 FSF 分道揚鑣後,斯托曼要求 Debian 將自己稱為 GNU/Linux。這個請求是向布魯斯·佩倫斯提出的,因為默多克已將領導權移交給了他。由於這些組織已經友好地分手,並且有著共同的目標,Debian 開發人員按照他的要求做了。當然,Stallman 確實獨立推廣了此類名稱,但實際的基於 Linux 的作業系統在引用自己時的合作對於推廣此類名稱的使用具有重要意義。

Stallman 給出的理由包括:(a) 除了 Linux 核心之外,系統的核心主要是 GNU 工具,(b) Linux 核心在某種意義上是 GNU 專案的頂峰/完成,GNU 專案一直在努力獲得一個工作核心已經有一段時間了,所以它應該使用這個名稱作為承認和提醒人們GNU 專案理想的一種方式。原因 (a) 往往被更頻繁地提及,儘管當時並不完全正確,現在更不正確,儘管基於 Linux 的作業系統的明顯重要部分依賴於 GNU 工具,例如 bash、gcc、binutils、gdb, libc 等,在某些情況下這些可以被其他工具取代。因此,這樣的論點至少是值得商榷的,而且確實已經引起了很多爭論。

據我所知,只有 Debian 及其(部分)衍生版本(跟隨其父版本)將自己稱為 GNU/Linux。然而,其他所謂的 Linux 發行版,如 Fedora、Gentoo 等,本質上與 Debian 沒有什麼不同——它們大多是相同的軟體。因此,我們有同樣充分的理由將它們稱為 GNU/Linux。

沒有很多系統在沒有 GNU 用戶空間的情況下使用 Linux 內核,因為兩者在很大程度上一起開發並以各種方式交織在一起。 (例如,Linux 核心是用 gcc 的擴展(GNU)C 編寫的,並且不會使用標準 C 編譯器構建。)正如 Thomas 所說,最明顯的例子是 Android,但由於它已被 Google 大量分叉儘管有人談論未來的合併/協調,但將Android 核心稱為Linux 是否正確仍值得懷疑。

順便說一句,不幸的是 Stallman 和 FSF 顯然對 GNU/Linux 術語的使用相當嚴格。例如,喬納森·科貝特在 LWN 評論中寫道FSF 拒絕與他交談,除非他使用 GNU/Linux 一詞。 Jon 除了是 LWN 創辦人之外,也是一位備受尊敬的資深核心開發人員。評論全文如下:

需要澄清的是:我們多年前就不再向 FSF 徵求意見,因為如果我們事先沒有承諾我們會說什麼以及我們會使用哪些術語,FSF 就會拒絕與我們交談。我們不願意做出這樣的承諾。如果 FSF 對此類事情的政策發生變化,我們將很高興知道。

這顯然是對 GNU/Linux 術語等方面的堅持的引用。

Glyn Moody 的《Rebel Code》第 6 章(「Boot then Root」)詳細介紹了上述歷史。

答案3

作業系統是核心和使用者態的組合。基本上,內核管理硬件,而用戶區為用戶提供全面的介面。

在常見的 GNU/Linux 發行版中,Linux提供內核,同時GNU專案帶來用戶層工具。 GNU 的誕生早於 Linux,並提供了大量實用程式來建立完整的作業系統。

然而,他們缺少一個內核。雖然他們有赫德內核,準備時間太長了。進而來了Linux在巨大熱情的幫助下,它的發展速度比赫德更快。

您現在擁有來自兩個不同項目的用戶空間和核心。由於每個人對於擁有一個作業系統都是必不可少的,為什麼不命名該協會GNU/Linux那麼每個專案都有自己的功勞嗎?

您還有其他使用者區,例如 BSD utils 或忙碌盒。然而,與 GNU 實用程式相比,它們或多或少是完整的,並且某些軟體只能在 GNU 用戶空間中運行。例如,大多數 BSD 作業系統都使用 GCC 作為編譯器,而LLVM很快就會改變這種狀況。

作為通用作業系統,您可以運行具有 FreeBSD 核心和 GNU 用戶區的 Debian

答案4

是什麼造就了 Linux 發行版 GNU?是編譯核心的工具嗎?是發行版附帶的工具嗎?

是的,是的。核心是一個整體獨立的可執行檔。一切其他位於“使用者區」。一般來說,用戶態應用程式至少使用一個系統庫,即標準 C 庫。1除了 各種實用函數之外,它還提供對系統呼叫的存取權——請求系統(即核心)執行的操作有些東西——即使是非常基本的任務(例如處理文件)也是必需的。

Linux 核心本身是用 C 語言編寫的,並且還需要一個 C 函式庫才能運作——除了在這種情況下,必要的部分是在內部編譯的,而不是在外部編譯的。通常用於此目的的編譯器是 GCC(“GNU 編譯器集合”),而 C 函式庫是 glibc。

由於幾乎所有使用者空間都是針對 glibc 編譯的,因此它是系統上繼核心之後最重要的東西之一。另一個重要元件是連結器,它將可執行檔連接到外部程式庫。那也是 GNU 產品。

為了說明這一點,您可以使用ldd各種可執行文件,包括庫(它們是可執行的,但不能單獨使用)。如手冊頁所述,「ldd 列印命令列上指定的每個程式或共用庫所需的共用庫」。例如:

> ldd /bin/bash
    linux-vdso.so.1 =>  (0x00007fff7348e000)
    libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007fdbdae7f000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007fdbdac7b000)
    libc.so.6 => /lib64/libc.so.6 (0x00007fdbda8c3000)
    /lib64/ld-linux-x86-64.so.2 (0x00007fdbdb0c8000)

注意「libc.so.6」——這是 glibc(不要將它與 glib 混淆,glib 是 Linux 的另一個基礎 GNU 產品,但不像 glibc 那麼基礎)。如果您查看提到的所有其他內容(除了第一個內容,如下所述),您會發現它們都連結到 libc 本身。讓我們看看 libc.so.6 本身:

> ldd /lib64/libc.so.6
    /lib64/ld-linux-x86-64.so.2 (0x00007f9cefa04000)
    linux-vdso.so.1 =>  (0x00007fffb21ff000)

「ld-linux-x86-64.so.2」是上面提到的連結器(通常是ld,並且有一個手冊頁)。你不能在上面運行 ldd,但file說它是動態鏈接的,我猜想是 libc(這聽起來可能是循環的,但事實並非如此)和 linux-vdso。最後一個有點有趣,因為您會注意到=>.那是因為它實際上是核心的一部分。

C 庫,AFAIK,是僅有的系統上不連結到 C 庫的共享物件——它位於中心整個混亂的局面。甚至其他編譯語言的基礎函式庫也使用libc,例如:

> ldd libstdc++.so.6.0.17 
    linux-gate.so.1 =>  (0xf77b8000)
    libm.so.6 => /lib/libm.so.6 (0xf7684000)
    libc.so.6 => /lib/libc.so.6 (0xf74d2000)
    /lib/ld-linux.so.2 (0xf77b9000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xf74b5000)

請注意,庫和連結器具有透過符號連結實現的各種假名(例如,/lib64/ld-linux-x86-64.so.2 實際上是/lib64/ld-2.15.so)。

另請注意gcc,「本機」編譯器(因為它編譯核心和 C 函式庫)不必存在於系統上,但 libc 和 ld 可以,否則什麼都無法運作。


這並不是 GNU 提供的唯一一組東西。他們還負責bashshell 和其他核心工具和實用程序,使系統類似於 *nix 並(大部分)與 POSIX相容。 GNOME 是最早的 Linux DE 之一,也是使用最廣泛的 Linux DE 之一。還有前面提到的 glib,它提供了許多高階函數來支援 GNOME 和其他 DE 等。 GNOME 是基於 GTK 建造的,GTK 最初是為 GIMP 開發的。 GTK 也是其他各種 DE 的基礎; GTK 和 GIMP 也是 GNU 產品。他們做了很多事。


1有一種用戶態應用程式不連結到任何函式庫;這些被稱為靜止的可執行文件,這本質上意味著它們已將該庫的部分內容編譯到其中(就像內核一樣)。

相關內容