WSL 失去潛力

2021-10-11 21:09:33 字數 2797 閱讀 2242

如果你最近幾年在關注windows10系統,你應該知道windows subsystem for linux,或者簡稱為wsl是周邊開發人員的熱門話題。最終你可以在windows上以一等公民的身份執行你的linux工具,這意味著你無需學習powershell或忍受古老的cmd.exe控制台。

不幸的是,並非一切都像聽起來那麼美好。作為azure新角色的一部分,我現在必須在windows上開發。wsl仍然與本機windows環境分開的事實表明了:即使我滿懷希望,我也不能將wsl用作日常開發環境,因為我需要與「本地」 windows工具進行互動。

我相信事情不必如此,但是隨著最近wsl 2的推出。我認為,替代世界的潛力已經消失。 但是,這是什麼意思呢? 為此,我們必須首先了解wsl 1和wsl 2之間的區別以及對wsl 2的推動可能會關閉一些有趣的(技術)路徑。

讓我們先看看wsl 1,為此,我們必須看看這個令人尷尬的名字中有什麼。為什麼這個功能被命名為windows subsystem… for linux?這不是說反了嗎?這並不是linux中的子系統,它不能執行與windows相關的任何事情;事情正好相反!

額。你看,如果考慮到windows nt核心的設計,那麼該名稱在技術上是正確的。從維基百科的windows nt 架構頁面,我們(其實就是我)找到如下內容:

windows nt中的使用者模式由子系統組成,這些子系統能夠通過使用i/o管理器將i/o請求傳遞到適當的核心模式裝置驅動程式。window nt的使用者層由「環境子系統」組成,該子系統可以執行許多不同型別的作業系統編寫的應用程式,以及整合子系統,它代表環境子系統執行系統特定的功能。核心模式阻止使用者模式服務和應用程式訪問它們不應該訪問的作業系統的關鍵區域。

windows nt是從頭開始設計的,旨在支援多個作業系統中正在執行的程序,而win32則「僅僅是」這些環境子系統之一。有了這些堅實的基礎,wsl 1提供了乙個新的環境子系統——linux子系統,用於在windows nt核心上執行linux二進位制檔案。win32和linux子系統共享公共的整合子系統。

吶,這到底意味著什麼?

不同的系統呼叫前端,這就是它的意思。使用者空間程序是二進位制指令的集合,處理器不間斷地執行這些指令(不考慮中斷)。作業系統的核心不知道程序在做什麼,直到程序發出系統呼叫: 這時,核心重新獲得代表使用者執行操作的控制權,可以是讀取檔案或暫停幾秒鐘。

程序發出系統呼叫的方式以及這些系統呼叫的語義都是特定於作業系統的。例如,在舊的x86上:在win32上開啟乙個檔案是通過int 2eh呼叫的系統呼叫號17h,而在linux上開啟乙個檔案是通過int 80h呼叫的系統呼叫號5h。

但是…從概念上講,開啟檔案就是開啟檔案,對嗎? 它們之間系統呼叫號或軟體中斷號不同,事實並不是特別有趣。 這就是wsl 1的關鍵設計方面:簡單地說,nt核心中的linux子系統是在nt核心前面的linux系統呼叫層的實現。 這些系統呼叫以後將委託給nt核心,而不是win32呼叫。 重複這一點很重要:沒有從linux到win32系統呼叫的轉換。

考慮到在wsl 1下,一般如何對linux應用程式提供良好的支援,以及nt在內部與unix的不同方面(fork + exec是永恆的敵人),這是一項工程技術的壯舉。

該設計的真正優點在於,機器上執行的是單個核心,並且該核心具有其下所有程序的整體檢視。 核心了解有關win32和linux程序的所有資訊。 這些程序都與統一資源進行互動,例如單個網路堆疊,單個記憶體管理器和單個程序排程程式。

wsl 1如此的酷,為什麼還要有wsl 2呢?有以下兩點原因:

wsl 2丟棄了所有的linux子系統部分,並用乙個成熟的(但隱藏得非常好且快速的)虛擬機器替換了所有內容。然後,虛擬機器在其中執行乙個合適的linux核心、乙個合適的linux檔案系統和乙個合適的linux網路堆疊。

這意味著wsl 1設計美學已經消失了:windows nt核心不再能看到linux世界中發生的任何事情。 它所知道的是,內部有乙個大的黑匣子(虛擬機器)在其中進行「填充」,並且看到的只是虛擬機器的vmenter和vmexit掛鉤點以及虛擬磁碟上的塊級讀/寫請求。 nt核心現在不知道linux程序和檔案訪問。 同樣,linux核心也不能了解nt領域中的任何內容。

從使用者的角度來看,wsl 2感覺更好:linux應用程式現在執行得快得多,因為它們不受nt核心中笨拙的linux系統呼叫的「模擬」。 如果很難將ntfs與linux語義結合使用,那沒有問題,因為linux環境現在在虛擬磁碟上使用ext4。 而且對linux應用程式的支援可以更加完善,因為wsl 2是linux:如果您想用fuse命名,就可以了。

但這是以wsl的代價為代價的:

儘管這從未存在過,但我可以想象得到這樣乙個世界……而這是只有wsl 1設計才能提供的世界。 我能想到的原因是因為macos為您提供了這種模型(儘管是因為macos本質上是unix)。

這就是讓我感到沮喪的原因:即使我可以在用於azure的開發計算機上安裝wsl,也無法使用它。 我仍然必須通過cmd.exe與系統進行互動,因為我必須處理windows本地程序和資源,並且因為我必須處理的工具僅適用於windows。

如果不討論各種各樣的bsds,這篇文章就不夠完善。bsds總是落後於linux和其他商業作業系統,具有二進位制級別的相容性已經有很長時間了。我能找到的最早的問題是2023年netbsd核心中的linux相容性。那是25年前,在wsl 1首次亮相之前的21年。

而且,這不僅限於linux。 多年來,netbsd一直支援模擬各種不同的作業系統。 對svr4的支援始於2023年,並且暫時來說,netbsd甚至還支援……pe / coff二進位制檔案——win32二進位制檔案。 因此,在某種程度上,netbsd反向實現了wsl 1模型:它使你可以在2023年在netbsd核心之上執行win32二進位制檔案。

失去健康代表失去一切

網路摘錄 失去健康一切歸零!平安是福 上帝想聽相聲了,把侯耀文帶走了 上帝想看小品了,把高秀敏帶走了 上帝想看電影了,把傅彪帶走了 上帝想聽新聞聯播了,把羅京帶走了 上帝想聽 了,把梅艷芳帶走了 上帝想用蘋果手機了,把賈伯斯帶走了 上帝想找人經營公司了,把王君瑤帶走了 這些人走的時候都跟上帝說 我還...

WSL安裝桌面

這兩天折騰了一下wsl,想裝乙個視窗桌面,主要是根據上面這個教程來折騰,不過裝完了以後發現執行不了,所以有參考了多幾個教程,最後執行成功,這裡總結一下。安裝xfce4 1.安裝xfce4 apt get install y xfce4 2.安裝xubuntu桌面及附帶應用 apt get insta...

wsl重啟操作

wsl環境下reboot和shutdown都是沒有作用的,wsl可以通過windows命令列進行重啟,使用管理員許可權執行下面指令碼實現重啟 rem 以管理員許可權執行 net stop lxssmanager net start lxssmanager其他指令碼 linux 4.19.104 de...