Try   HackMD

[教學2020] 如何將 WSL Distro (發行版) 安裝至其他硬碟

歡迎引用本文,但請標明本網址


前言:

  • 名詞解釋
    • WSL
      • Windows Subsystem for Linux 的簡稱,中譯全名為「適用於 Linux 的 Windows 子系統」,是由微軟開發的 Linux 相容的核心介面,使用的資源少於虛擬化的機器,是目前在 Windows 環境中執行 Linux 軟體的最直接方式。可以於 Windows OS 中操作 Linux,效能極佳。
    • Distro
      • Linux Distribution 的簡稱,WSL 的官方中譯為「發佈」,亦有譯為 Linux 的「發行版」。(作者認為發行版比發佈更好理解,因此下文皆採用發行版作為 Distro 的中譯)
      • WSL 可以相容多種發行版,並可透過兩個途徑安裝特定發行版:(1) 使用Windows10 內建的 Windows Store (2) 使用 Docker
  • 撰文目的:
    1. WSL 預設的發行版安裝路徑為 C 槽,為了避免套件越裝越多導致容量不足,可以選擇將發行版移動至其他硬碟。
    2. 鑑於目前網路上對於如何變更 WSL 發行版安裝位置的教學文錯誤繁多,因此撰寫本文提供完整詳細的中文教學。
    3. 本文提供的方法除了能更改發行版的安裝路徑,其實也相當於備份發行版,由於 Linux 儲存空間是用 Mount (掛載) 的方式,因此原本紀錄的使用者帳戶、已安裝的套件、資料檔案都會跟著搬遷,非常完善。
    4. 於 PowerShell 輸入「wsl help」可以看到軟體的官方參數說明,本文的參數名稱與官方命名稍有變化,用意是使讀者更容易理解指令。
  • 限制與狀況
    • 若原本的 WSL 發行版是採用 Windows Store 安裝,由於該應用程式似乎是發行版自動安裝檔兼執行檔,裡面的設定無法變更 (無法更改欲啟動的發行版,也無法更改預設的安裝位置),因此即使依照本教學改變 WSL 預設開啟的發行版,如果依舊使用該應用程式開啟 Bash (Bourne-Again SHell),該程式仍會直接啟用原本安裝於 C 槽的發行版 (或自動重新安裝一個發行版至 C 槽)。這部分目前無解,但其實沒有太過影響 WSL 的使用,只是捨棄直接從開始列 (Start List) 開啟 Bash,但是間接透過 PowerShell 開啟發行版的 Bash 是完全沒有問題的,也可以直接使用 Remote VScode 整合的 Bash 進行開發。

操作步驟:

  1. 以右鍵「以系統管理員身分執行」開啟 Windows 10 內建的 「Windows PowerShell」。

  2. 檢查目前 WSL 已註冊的 Linux 發行板名稱

    • 輸入以下指令查詢 Distro (發行板):

      ​​​​​​​​wsl --list
      

      ​​​​​​​​wsl -l
      

      您將會看到類似於以下的訊息:

      Windows 子系統 Linux 版發佈:
      Ubuntu-20.04 (預設值)

      意思是目前安裝於電腦的 WSL 發行版只有 「Ubuntu-20.04」這個版本。

    • 註 1: 作者當初是直接透過 Windows Store 安裝 Ubuntu-20.04

    • 註 2: WSL 預設的發行版安裝路徑為

      C:\Users<MyUserName>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_xxxx\LocalState

      • <MyUserName> 是您 Windows 的使用者名稱 (User ID),預設為 user。
      • CanonicalGroupLimited.Ubuntu20.04onWindows_xxxx 結尾的 xxxx 為變數。
  3. 匯出 (將發行版壓縮並備份至指定位置)

    • 指令格式及參數說明 (共兩個參數)
      ​​​​​​​​wsl --export <DistroName> <ExportPath><ExportFileName.tar>
      
      • <DistroName>: <發行版的名稱>,就是您欲匯出 (備份) 的子系統 (發行版),如上個步驟查詢到的子系統名字是 Ubuntu-20.04。若您已安裝多個發行版,請代換為欲匯出的發行版名稱。
      • <ExportPath>: <匯出目的地路徑>,這可以自定義,填入你要存放的資料夾路徑即可。若欲存放的位置尚未建立資料夾,請先手動建立。 本範例的路徑為「c:\k_temp\」。
      • <ExportFileName.tar>: <命名匯出檔名>,這也可以自行命名,但副檔名必須為「.tar」,並且這個參數請直接接續在<ExportPath>後面 (中間不加空格)。
        本範例命名為「wcc-ubuntu-20-04-wsl.tar」。
    • 完整的匯出範例指令
      ​​​​​​​​wsl --export Ubuntu-20.04 c:\k_temp\wcc-ubuntu-20-04-wsl.tar
      
      輸入後 PowerShell 的 Command Line (命令行) 會持續閃爍底線符號「_」,請等待幾分鐘讓系統完成匯出,當畫面重新出現類似「PS C:\WINDOWS\system32>」的訊息表示匯出完畢,並且在 c:\k_temp 資料夾中可以看到檔案 wcc-ubuntu-20-04-wsl.tar。
  4. 匯入 (將發行版備份檔匯入並同時註冊於 WSL)

    • 指令格式及參數說明 (共三個參數)
      ​​​​​​​​wsl --import <NewDistroName> <ImportPath> <ExportFilePath>
      
      • <NewDistroName>: <為新的發行版命名>,完成匯入之後,當您再次輸入指令「wsl -l」便會看到此名字。本範例命名為「Ubuntu-20.04-InDiskD」,因為要改放在 D 槽因此用此名稱區分系統。
      • <ImportPath>: <匯入目的地路徑>,可自定義,此範例存放於 D 槽的 wsl 資料夾內。
      • <ExportFilePath>: <匯出檔的路徑>,請填入剛才匯出檔案的檔案路徑。
    • 完整的匯入範例指令
      ​​​​​​​​wsl --import Ubuntu-20.04-InDiskD d:\wsl\ubuntu-InDiskD c:\k_temp\wcc-ubuntu-20-04-wsl.tar
      
      輸入後同樣請等待數分鐘讓系統完成匯入及檔案註冊,完成後可於 d:\wsl\ubuntu-InDiskD 資料夾找到一個發行版的檔案,本範例的檔名是「ext4.vhdx」,此名稱應與 WSL 預設路徑中存放的檔名相同。
  5. 檢查 WSL Distor (發行版) 是否新增成功
    再次輸入指令

    ​​​​wsl -l
    

    應會看到此訊息

    Windows 子系統 Linux 版發佈:
    Ubuntu-20.04 (預設值)
    Ubuntu-20.04-InDiskD

    子系統列表中增加了「Ubuntu-20.04-InDiskD」

  6. 變更 wsl 的發行版預設

    • 指令
      ​​​​​​​​wsl --setdefault <DistroName>
      
      • <DistroName>: 請輸入您欲設定為預設版本的發行版名稱,本範例為「Ubuntu-20.04-InDiskD」。
    • 範例
      ​​​​​​​​​wsl --setdefault Ubuntu-20.04-InDiskD
      
  7. 以指定的使用者執行特定發行版本

    • 指令
      ​​​​​​​​wsl -d <DistroName> -u <wslUserName>
      
      • <DistroName>: 說明同上個指令
      • <wslUserName>: <wsl的發行版名稱>,為當初您建立發行版時設定的 Linux 使用者帳戶名稱,本作者的名稱為「kuihao」。
      • -d: 指定版本
      • -u: 指定使用者
    • 範例
      ​​​​​​​​wsl -d Ubuntu-20.04-InDiskD -u kuihao
      
  8. 將 C 槽的發行版檔案取消註冊 (刪除 C 槽的發行版)

    • 指令

      ​​​​​​​​wsl --unregister <DistroName>
      
      • <DistroName>: 填入您要取消註冊的版本名稱,此範例為位於 C 槽的「Ubuntu-20.04」。
    • 範例

      ​​​​​​​​wsl --unregister Ubuntu-20.04
      

      輸入之後會看到以下訊息

      取消註冊中

      完成之後輸入「wsl -l」會發現 Ubuntu-20.04 已刪除,並至原 wsl 預設路徑亦可發現原檔案已刪除。

      登入後請記得更新 Linux 套件。

本教學文完畢,祝您開發順利。

Reference


tags:wsl Windows10 上適用於 Linux 的 Windows 子系統 Subsystem for Linux Linux 20.04 Microsoft Store PowerShell export import 將WSL(Windows上的Bash)根檔案系統移動到另一個硬碟? 通过wsl命令迁移 將 WSL Distro 移動到不同磁碟機 WSL Distro 變更檔案路徑 Exporting and Importing WSL Linux Distributions on Windows 10 發行版 發佈