介紹好用工具:WSL (Windows Subsystem for Linux) | The Will Will Web

The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

介紹好用工具:WSL (Windows Subsystem for Linux)

WSL (Windows Subsystem for Linux) 對於想開始學習 Linux 的人來說,是個超級棒的入門工具,我未來也預計開設 Linux 新手上路課程,敬請期待。同時你也可以利用 WSL 幫助你管理遠端的電腦,也可以利用成千上百個 Linux 命令列工具幫助你進行開發、測試與整合作業。本篇文章教你如何安裝與使用,並且深入了解關於 WSL 的各項細節。

安裝 WSL 功能

在 Windows 10 安裝 WSL 功能其實相當簡單,只要先以系統管理員身分開啟 PowerShell 並執行以下命令即可安裝完成:

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

安裝完成後,必須「重新開機」後才會生效。

安裝 Linux 發行版本

剛安裝好 WSL 功能後,預設並沒有安裝任何 Linux 發行版本 (distribution),所以你必須先從 Microsoft Store 安裝好任何一套 Linux 才能開始使用。

你可以開啟瀏覽器,直接在網址列輸入以下網址就會自動開啟 Microsoft Store 視窗,並自動搜尋出所有 WSL 相容的應用程式。

關於 ms-windows-store:// 網址,你可以參考 Launch the Microsoft Store app - Windows UWP applications 文件說明。

以下這幾套是目前 Microsoft Store 上面比較有特色的版本,我個人是只有安裝 Ubuntu 18.04 LTS 而已。

想了解如何開啟 Microsoft Store 並直接進入 App 安裝畫面的部分,可以參考 Link to your app 文件說明。

另外還有幾套付費的版本,提供更完整的技術支援與更快的更新:

另外還有一點必須額外提及,曾經安裝過 WSL 的朋友,可能會很習慣的在「命令提示字元」下輸入 bashwsl 來啟動程式,而在一台新電腦上第一次輸入該命令,會看到以下訊息:

適用於 Linux 的 Windows 子系統沒有任何已安裝的發行版本。
您可以透過瀏覽 Microsoft Store 來安裝各種發行版本:
https://aka.ms/wslstore
請按任意鍵繼續...

這裡的 https://aka.ms/wslstore 網址,在台灣這邊的 Windows 10 會開啟一個不存在的 Collections,所以會完全找不到相容於 WSL 的 Linux 發行版本。

image

解決辦法就是直接連到 ms-windows-store://search/?query=WSL 直接搜尋出所有 WSL 相關的應用程式,或在 Microsoft Store 右上角搜尋 WSL 即可快速找出所有可安裝的應用程式。

WSL 可以讓你自訂 Linux 發行版本,詳情請見 Creating a Custom Linux Distro for WSL

第一次使用 WSL 的步驟

在你安裝好 Linux 發行版本之後,就可以準備第一次啟動在 Windows 環境下的 Linux 作業系統。

基本你有兩種啟動方式:

  1. 開啟 Microsoft Store 並找到你安裝的那個應用程式,點擊畫面右上角的「啟動」按鈕。

  2. 透過「命令提示字元」或「Windows PowerShell」輸入 bashwsl 也可以啟動程式。如果你安裝的是 Ubuntu 18.04 LTS 的話,也可以使用 ubuntu1804 來啟動程式。

第一次啟動後,大概會花上幾分鐘的時間進行初始化設定,請耐心等待 ...

由於 WSL 並非使用 Hyper-V 這類的虛擬化技術,而是採用系統核心 API 轉譯的方式執行,所以執行在 WSL 中的程式,完全是跑在 Linux 原生的 ELF (Executable and Linkable Format) 執行檔格式。所以你完全可以將 WSL 環境視為一個「真正的 Linux 作業系統」,對你執行的應用程式來說,執行在 WSL 與執行在原生 Linux 並沒有什麼差異。

不過,跑在 WSL 底下的 Linux 與原生 Linux 還是有部分不相容的地方,例如:使用者帳號。

基本上,你在第一次啟動 Ubuntu 18.04 應用程式的過程中,會提示你先設定一組一般權限的 Linux 帳號、密碼。

image

關於 WSL 中 Linux 帳號權限的細節,可以參考 User Accounts and Permissions for Windows Subsystem for Linux 文件說明。

設定完帳號、密碼後,以後開啟 WSL 不需要再輸入帳號密碼,預設會自動登入。不過,若你要透過 sudo su - 變身為 root 管理者身分時,還是要輸入一次密碼才能成功變身為 root 帳戶。

如果你希望以後執行 sudo su - 不要再輸入密碼的話,可以透過以下命令完成:

echo "will ALL = (root) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/will

請注意:執行上述指令之前,請將 will 換成你設定的初始 Linux 帳號名稱!

更多技術細節

你在 Windows 10 從 Microsoft Store 安裝的所有應用程式,其主要執行檔預設都會放在 %LOCALAPPDATA%\Microsoft\WindowsApps 目錄下,所以各 Linux 發行版本的主要啟動檔也都會放在這裡。當你在 Microsoft Store 中按下「啟動」按鈕時,其實只是到這個資料夾下執行相對應的執行檔而已。

image

例如 ubuntu1804.exe 就是 Ubuntu 18.04 LTS 的主要啟動檔。

相對的,當你處在「命令提示字元」的時候,除了可以輸入 wslbash 進入預設 Linux 發行版本外,其實也可以輸入 ubuntu1804 指定進入特定的 Linux 發行版本 (因為你可以安裝多個不同版本)。我以上圖為例,你執行 ubuntu1804 就會自動進入 Ubuntu 18.04 LTS 作業系統。

以上介紹過的執行檔,分別的完整路徑如下:

  1. C:\Windows\System32\wsl.exe
  2. C:\Windows\System32\bash.exe
  3. %LOCALAPPDATA%\Microsoft\WindowsApps\ubuntu1804.exe

你可以看到 wslbash 都被放置於 Windows 系統目錄下,也就是說這兩支程式其實是 WSL 的主要進入點,他被放置在 C:\Windows\System32 目錄下,就知道他的重要性。這兩支程式其實也只有指令參數不同而已,所做的事情是一樣的,就是呼叫由 Microsoft Store 安裝的 Linux 應用程式。

我通常都以 wsl.exe 做為 WSL 的主要進入點!

活用 WSL 執行 Linux 工具

如果只是在 Windows 執行一套 Linux 作業系統,那 WSL 就不值得一提了。WSL 真正的強項,其實是可以跟 Windows 無縫整合,甚至於可以說 WSL 無限延伸了 Windows 的既有能力,以前在 Windows 做不到,在 Linux 卻很輕鬆的情況,現在已經不存在這種說法了,因為 WSL 可以直接在 Windows 環境執行 Linux 內上千種好用、實用的命令列工具!以下就是一些常見的應用情境:

  1. 執行 WSL 環境下的命令

    wsl [command]
    
    bash -c "[command]"
    
    ubuntu1804 run [command]
    
  2. 透過 SSH 連線至遠端 Linux 伺服器

    wsl ssh will@172.16.4.4
    
    bash -c "ssh will@172.16.4.4"
    
    ubuntu1804 run ssh will@172.16.4.4
    
  3. 透過 SSH 直接執行遠端 Linux 伺服器中的命令

    wsl ssh will@172.16.4.4 tail -f /var/log/syslog
    
    bash -c "ssh will@172.16.4.4 tail -f /var/log/syslog"
    
    ubuntu1804 run ssh will@172.16.4.4 tail -f /var/log/syslog
    
  4. 透過 WSL 中的 vim 編輯 Windows 下的檔案

    wsl vim .gitignore
    
    bash -c "vim .gitignore"
    
    ubuntu1804 run vim .gitignore
    
  5. 使用 Linux 的 grep 過濾 PowerShell 的執行結果

    PS> Get-Service | wsl grep -i winrm
    
    PS> Get-Service | bash -c "grep -i winrm"
    
    PS> Get-Service | ubuntu1804 run grep -i winrm
    
  6. 使用 Linux 的 find 查詢特定檔案名稱

    wsl find . -name '*.ahk' -type f
    
    bash -c "find . -name '*.ahk' -type f"
    
    ubuntu1804 run find . -name '*.ahk' -type f
    
  7. 使用 Linux 的 sed 批次修改所有 *.txt 檔案的內容

    wsl sed -i 's/123/456/g' *.txt
    
    bash -c "sed -i 's/456/789/g' *.txt"
    
    ubuntu1804 run sed -i 's/789/000/g' *.txt
    
  8. 在 Linux 環境下開啟 Visual Studio Code 編輯 Linux 中的檔案

    1. 先進入 Windows 特定資料夾,再進入 WSL 環境 (Linux)

      wsl
      
      bash
      
      ubuntu1804
      
    2. 在 Linux 環境下直接執行 code . 也可以在 Windows 透過 VSCode 開啟此專案

      此時 WSL 會自動找到 Windows 下的應用程式執行,非常聰明!

      code .
      

相關連結