WSL2:在Windows系統中開發Linux程式的又一神器

IOT物聯網小鎮 發表於 2021-07-20
Linux

WSL2:在Windows系統中開發Linux程式的又一神器

作 者:道哥,10+年的嵌入式開發老兵。

公眾號:【IOT物聯網小鎮】,專注於:C/C++、Linux作業系統、應用程式設計、物聯網、微控制器和嵌入式開發等領域。 公眾號回覆【書籍】,獲取 Linux、嵌入式領域經典書籍。

轉 載:歡迎轉載文章,轉載需註明出處。

作為一名嵌入式軟體開發工程師,在 Linux 系統下寫程式碼、編譯、除錯是避免不了的事情。

但是很少有同學會直接拿一臺 Linux 真機來作為工作平臺,除非是那種利用遠端伺服器來編譯的場景。

更普遍的使用場景是:在一臺 Windows/Mac 系統中,安裝虛擬機器,然後在虛擬機器中安裝 Linux 作業系統。

Windows 系統中常用的虛擬機器有:VirtualboxVMWareMac 系統中一般都是用 Parallels Desktop,速度確實比較快!

在很久以前,我參與的專案主要是物聯網閘道器,只需要編譯 Linux 系統下的可執行程式,因此在日常工作中,都是直接在 Ubuntu 虛擬機器中敲程式碼(編輯器:VSCodeSubLime)、編譯、除錯。

後來需要開發跨平臺的應用,開發模式就變成了:

  1. 敲程式碼:indows 系統中中的 Visual Studio;

  2. 編譯 Windows 應用程式: 直接用 Visual Studio 中的 VC 編譯器來編譯;

  3. 編譯 Linux 應用程式:通過遠端部署的方式,把程式碼同步到 Ubuntu 虛擬機器中,然後遠端編譯、除錯;

這樣的開發模式是屬於比較常見的,只不過每次 Ubuntu 虛擬機器比較耗費資源,啟動比較慢而已!

編寫跨平臺的程式碼,使用 CMake 工具來管理構建過程,也是非常方便的。

之前寫過 2 篇相關的文章:

《使用 cmake 來搭建跨平臺的應用程式框架:C語言版本》

《使用 cmake 來搭建跨平臺的應用程式框架:C++版本》

2 篇總結,算是一個簡單的工程模板吧。

平時如果我需要寫一些簡單的 Demo 發給別人,我就會直接複製一下,然後新增上演示程式碼就可以了。

說了這麼多,都是在描述跨平臺開發的工作場景,或者說是開發模式

其實,在 Windows 系統中,還有一種安裝 Linux 系統的方式,這就是 WSL/WSL2

下面,我就把自己的安裝、配置過程與大家分享一下!

什麼是 WSL?

這部分沒有什麼好掰扯的,直接從微軟官網摘錄如下:

WSL(Windows Subsystem for Linux)Windows 系統中的一個子系統,在這個子系統上可以執行 Linux 作業系統。

可以讓開發人員直接在 Windows 上按原樣執行 GNU/Linux 環境(包括大多數命令列工具、實用工具和應用程式),且不會產生傳統虛擬機器或雙啟動設定開銷。

WSL2:在Windows系統中開發Linux程式的又一神器

什麼是 WSL2?

WSL2 是適用於 LinuxWindows 子系統體系結構的一個新版本,它是對基礎體系結構的一次重大改造。

它使用虛擬化技術和 Linux 核心來實現其新功能,主要目標是提高檔案系統效能和新增完全的系統呼叫相容性。

個人理解

WSL並不是一個真正的 Linux 作業系統,僅僅是 Linux 應用程式與 Windows 作業系統之間的一個適配層。

在這個適配層之上,可以執行 Linux 應用程式,有點類似於以前的 cygwin 的方式。

WSL2:它就是一個虛擬機器,類似於 Vitual Box,在這個虛擬機器之上,執行一個完整的 Linux 作業系統。

相對於 Virtual BoxVMWare 來說,WSL2提供更全面的相容性、與 Windows 系統的互操作性更好、執行速度更快、佔用系統資源更少

啟用 WSL 服務

Win+X, 啟動 Windows PowerShell (管理員),注意:是帶有管理員的這個啊:

或者直接在搜尋視窗中輸入 Power, 然後選擇以管理員方式執行:

WSL2:在Windows系統中開發Linux程式的又一神器

PowerShell 的視窗是:

WSL2:在Windows系統中開發Linux程式的又一神器

可以把 PowerShell 理解成升級版的、功能更強勁的 cmd

PowerShell 視窗中,輸入如下指令來啟用 WSL 服務:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

此時,提示需要重啟系統(不用說,肯定選擇 Y):

WSL2:在Windows系統中開發Linux程式的又一神器

電腦重啟之後,按下 Win + R,調出命令輸入視窗。輸入指令 appwiz.cpl

點選左側的 【啟動或關閉 Windows 功能】

WSL2:在Windows系統中開發Linux程式的又一神器

彈出下面這個視窗:

WSL2:在Windows系統中開發Linux程式的又一神器

可以看到:【適用於 Linux 的 Windows 子系統】這一欄已經被勾選了,說明 WSL 服務已經啟動。

接下來要做的事情,就是安裝 Ubuntu 作業系統。

安裝 Ubuntu-18.04 作業系統

啟動 【Windows Store】:

WSL2:在Windows系統中開發Linux程式的又一神器

在右上角的搜尋欄中,輸入: Ubuntu

WSL2:在Windows系統中開發Linux程式的又一神器

我們這裡就選擇 Ubuntu-18.04 吧,這也是我工作中使用的版本。

WSL2:在Windows系統中開發Linux程式的又一神器

下載速度挺快的:

WSL2:在Windows系統中開發Linux程式的又一神器

安裝完成之後,點選【啟動】按鈕:

WSL2:在Windows系統中開發Linux程式的又一神器

第一次開啟速度稍微慢一些,大約 1 分鐘左右吧,提示設定使用者名稱、密碼,然後就進入我們熟悉的視窗了:

WSL2:在Windows系統中開發Linux程式的又一神器

這樣,Ubuntu-18.04 系統就安裝好了!

我一般在系統安裝之後,會把 root 使用者的密碼也設定一下,以後總會需要使用 root 身份來登入系統的。

$ sudo passwd

WSL2:在Windows系統中開發Linux程式的又一神器

系統安裝之後,第一件事情一般都是更換軟體源

可以選擇阿里、清華或者中科大的源,這裡就直接使用清華的軟體源:

$ cd /etc/apt
$ sudo cp sources.list source.list.bak
$ sudo vim sources.list

把下面軟體源複製、貼上進去:

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse

儲存之後,執行更新指令:

$ sudo apt-get update
$ sudo apt-get upgrade

這個步驟,請同學們耐心等待,稍安勿躁。出現提示輸入,選擇 Y 就行了。

通過 ssh 遠端登入

如果您覺得這個黑乎乎的視窗有點醜,那麼可以通過 Windows 系統中的 Xshell 工具來遠端登入(ssh)。

為了這個目的,我們需要在 Ubuntu-18.04 中重新安裝 sshd 服務:

$ sudo apt purge openssh-server
$ sudo apt install openssh-server

安裝完畢之後,需要修改配置檔案,以執行遠端登入:

$ sudo vim  /etc/ssh/sshd_config

修改1:把 13 行的 #Port 22 改為 Port 22

修改2:把 32 行的 #PermitRootLogin prohibit-password 改為 PermitRootLogin yes

修改3:把 56 行的 #PasswordAuthentication yes 改為 PasswordAuthentication yes

修改之後,啟動 sshd 服務

$ sudo service ssh restart

WSL2:在Windows系統中開發Linux程式的又一神器

此時,啟動 Windows 系統中的 Xshell 來遠端登入一下,主機名只需要填寫:localhost 即可:

WSL2:在Windows系統中開發Linux程式的又一神器

建立連結的時候,需要儲存祕鑰:

WSL2:在Windows系統中開發Linux程式的又一神器

然後輸入使用者名稱和密碼:

WSL2:在Windows系統中開發Linux程式的又一神器

WSL2:在Windows系統中開發Linux程式的又一神器

如果出現下面這個提示,先不用理會它,直接選擇【】,這是與 Linux 的圖形視窗相關的,後面會解釋。

WSL2:在Windows系統中開發Linux程式的又一神器

此時,就可以在 Xshell 中愉快的操作 Ubuntu 的命令列視窗了。

WSL2:在Windows系統中開發Linux程式的又一神器

是不是感覺少了點什麼東西?那些 DesktopDocumentsPicture 等預設資料夾怎麼都不見了?

這個問題,後面在演示 WSL2 的時候就見分曉了!

編譯 Hello,World!

最後,我們來編譯一個應用程式。首先安裝 gcc 編譯器:

$ sudo apt-get install gcc

再寫一個 hello.c 檔案:

#include <stdio.h>

int main()
{
        printf("Hello,World! \n");
        return 0;
}

然後編譯、執行:

[email protected]:~/tmp$ gcc hello.c -o hello
[email protected]:~/tmp$ ./hello
Hello,World!

完美!


------ End ------

接下來要介紹的就是 WSL2 以及 圖形視窗了,過程我已經驗證完畢,等整理好之後再分享給大家,謝謝!

推薦閱讀

【1】C語言指標-從底層原理到花式技巧,用圖文和程式碼幫你講解透徹
【2】一步步分析-如何用C實現物件導向程式設計
【3】原來gdb的底層除錯原理這麼簡單
【4】內聯彙編很可怕嗎?看完這篇文章,終結它!

其他系列專輯精選文章C語言Linux作業系統應用程式設計物聯網

WSL2:在Windows系統中開發Linux程式的又一神器

星標公眾號,能更快找到我!

WSL2:在Windows系統中開發Linux程式的又一神器</stdio.h>