Linux 黑話解釋:什么是上游和下游?
“上游upstream” 和 “下游downstream”這兩個術語是相當模糊的,我認為一般人并不會真正使用它們。如果你只是一個 Linux 用戶,并且不編寫或維護軟件,那么很有可能這些術語對你來說毫無意義,但它們對 Linux 世界中各個社區(qū)之間的交流方式有益的。
這些術語被用于網(wǎng)絡、編程、內(nèi)核,甚至在非計算機領域,如供應鏈。當我們談論上游和下游的時候,討論背景是很重要的。
在其最簡單的形式中,上游和下游是信息流動的方向。
由于我們都是在連接到互聯(lián)網(wǎng)的情況下閱讀這篇文章的,讓我們看看適用于互聯(lián)網(wǎng)服務提供商(ISP)的上游/下游例子。這里,ISP 關注的是流量。上游流量是指數(shù)據(jù)是從不同的 ISP 的用戶處傳來的。例如,如果你有一個提供訂閱通訊的網(wǎng)站,我發(fā)送的訂閱信息就是上游數(shù)據(jù)。
下游流量是指從一個用戶發(fā)送到不同 ISP 的另一個用戶的數(shù)據(jù),它被認為是下游流量。使用同樣的訂閱例子,假設我的訂閱請求被批準,我在一封郵件中收到“歡迎”說明,在又一封郵件中收到最新的新聞簡報。在這種情況下,數(shù)據(jù)是順流而下的,因為它是由你(好吧,可能是作為代表你進行操作的自動化軟件)發(fā)送給我,一個來自另外 ISP 的用戶。
總結:我需要或想要的東西(你的通訊)是上游的。你提供給我的東西(歡迎詞和實際的通訊)是下游的。
數(shù)據(jù)是在上游還是在下游,對我們用戶來說可能并不重要,但對監(jiān)控帶寬使用的服務器管理員,以及發(fā)行商distributor(發(fā)行版的制作者)和程序員來說卻很重要。
在 Linux 世界里,上游和下游有兩個主要背景。一個是關于內(nèi)核的,另一個是關于應用程序的。還有其他的,但我希望我可以通過這兩個來表達我的想法。
Linux 內(nèi)核背景下的上游和下游
Linux 就是 內(nèi)核。在創(chuàng)建發(fā)行版時,Linux 發(fā)行版首先使用未經(jīng)修改的內(nèi)核源代碼。然后添加必要的補丁,對內(nèi)核進行配置。內(nèi)核的配置是基于發(fā)行版想要提供的功能和選項。一旦決定了,就相應地創(chuàng)建了內(nèi)核。
原始內(nèi)核來自發(fā)行版的上游。當發(fā)行版得到源代碼時,它就流向下游。一旦發(fā)行版得到了內(nèi)核代碼,它就會留在發(fā)行商那里,同時對它進行改造。它仍然是我們用戶的上游,直到它準備好被發(fā)布。
發(fā)行版創(chuàng)建的內(nèi)核版本將添加補丁和啟用某些功能和選項。這種配置是由發(fā)行商決定的。這就是為什么有幾種 Linux 流派的原因,例如,Debian 與 Red Hat。發(fā)行商會決定向他們的用戶群提供哪些選項,并相應地編譯內(nèi)核。
一旦這項工作完成,它就會放在一個倉庫中準備發(fā)布,我們就可以獲得一份副本。這個副本向下游流向我們。
同樣地,如果發(fā)行商發(fā)現(xiàn)了內(nèi)核中的一個錯誤,修復了它,然后將補丁發(fā)送給內(nèi)核開發(fā)者,這樣他們就可以為下游的每個人修補內(nèi)核。這被稱為對上游的貢獻,因為這里的流量是向上流向原始來源的。
在應用程序背景下的上游和下游
同樣,從技術上講,Linux 是內(nèi)核,其他都是附加軟件。發(fā)行商也會在他們的項目中加入額外的軟件。在這種情況下,有幾個上游。一個發(fā)行版可以包含任何數(shù)量的應用程序,如 X、KDE、Gnome 等等。
讓我們想象一下,你在使用 nano 編輯器時發(fā)現(xiàn)它不能正常工作,于是你向發(fā)行版提交了一份錯誤報告。發(fā)行商的程序員會查看它,如果發(fā)現(xiàn)他們在 nano 中插入了一個錯誤,他們將修復它并在其倉庫中發(fā)布一個新版本。如果他們發(fā)現(xiàn)不是他們制造了這個錯誤,發(fā)行商將向上游的 nano 程序員提交一份錯誤報告。
當涉及到像錯誤報告、功能請求等事情時,最好是將它們發(fā)送到上游的發(fā)行商那里,因為他們維護著你所使用的發(fā)行版的內(nèi)核和附加應用程序。例如,我在幾臺機器上使用一個叫做 Q4OS 的發(fā)行版。如果我發(fā)現(xiàn)一個程序中的錯誤,我會把它報告給 Q4OS 的人。如果你碰巧使用的是 Mint,你會把它報告給 Mint 項目。
比如說,如果你在一個普通的 Linux 論壇上發(fā)布一個問題,而你提到你在使用 Mint,你肯定會得到這樣的回復。“這個問題最好在 Mint 論壇上處理”。用之前的 nano 錯誤的例子,有可能是 Mint 的程序員對 nano 進行了修改,使其在他們的發(fā)行版中運行得更好。如果他們確實犯了一個錯誤,他們會想知道這個錯誤,而且在犯了這個錯誤之后,他們會是修復它的人。
一旦修復,更新的程序就會被放入你可以使用的倉庫。當你得到更新時,它就會順流而下到你那里,像這樣:
如果發(fā)行商進行了修復,新版本就會在發(fā)行倉庫中提供。
如果該應用程序的程序員進行了修復,它將被發(fā)送到測試新代碼的發(fā)行商那里。一旦發(fā)現(xiàn)它工作正常,它就會被放在倉庫中,向下游流去。
自動流向下游
曾經(jīng)有一段時間,用戶得自己獲取更新。用戶會得到更新的源代碼并編譯一個新的可執(zhí)行文件。隨著時間的推移,像 apt 這樣的工具被創(chuàng)造出來,允許用戶從軟件庫中提取更新的二進制文件(可執(zhí)行文件)。apt 程序是 Debian 的,但其他發(fā)行版也有他們自己的用于此用途的類似程序。
像 apt 這樣的程序負責處理上游/下游的工作。如果你用升級選項運行 apt,像這樣:
sudo apt upgrade
它將查看(上游)發(fā)行倉庫,找到任何需要的更新包,并將它們拉到你的機器上(下游)并安裝它們。
有些發(fā)行版會更進一步。發(fā)行版的程序員和維護者總是在檢查他們的產(chǎn)品。很多時候,應用程序的程序員會對他們的程序進行改進。系統(tǒng)庫會經(jīng)常更新,安全漏洞也會被堵上,等等。這些更新會提供給發(fā)行商,然后由發(fā)行商在發(fā)行倉庫中提供新的版本。
與其讓你每天運行 apt,一些發(fā)行版會提醒你有可用的更新并詢問你是否需要它們。如果你想要,只要接受,更新就會被發(fā)送到你的機器上并安裝。
總結
上游和下游實際上只是數(shù)據(jù)流的方向。這個數(shù)據(jù)在上游或下游流動的方式取決于最終需要誰來處理它。基本上,程序員是上游,用戶是下游。
同樣,作為用戶,我們真的不需要關心這些術語,但這些概念確實有助于軟件的開發(fā)和維護。通過將工作引向適當?shù)男〗M,避免了重復工作。這也確保了標準的維護。例如,Chrome 瀏覽器可能需要做一些細微的改變,以便在某個發(fā)行版上運行,但它的核心是 Chrome 瀏覽器,它的外觀和行為都不會有大的變化。
如果你發(fā)現(xiàn)你的發(fā)行版中的任何程序有錯誤,只需向發(fā)行版的維護者報告,這通常是通過他們的網(wǎng)站進行的。你將會把它發(fā)送到上游,但你是否記得你在向上游發(fā)送報告并不重要。