經過一番辛苦調教,總算把 WSL 調整成可推廣到團隊使用的地步。下一步就是要輸出成 WSL 公版。

謹以此文記錄匯出與匯入 WSL 映像檔的步驟與除雷經驗。

前置作業:查看已安裝的軟體清單

在匯出成公版之前,先查看已安裝了哪些軟體:

# 查看已用 apt install 安裝了哪些軟體
% apt list --installed

# 查看已用 brew install 安裝了哪些軟體
% brew list

# 查看手動下載安裝了哪些軟體
% ls -al /usr/local/bin

前置作業:清理內容

在匯出成公版之前,記得先清理一下機敏資料。譬如:

  • 檢視一下 ~/.ssh
  • 檢視一下 ~/.kube
  • 檢視一下 ~/.gitconfig
  • 檢視一下其他重要的 dotfiles

也記得清理一下足跡:

  • 清理一下 ~/.*_history
  • 清理一下 /var/log

前置作業:預設登入用戶

踩雷經驗:匯出再匯入 WSL 映像檔之後,再登入的身分會是 root。

為了避免此事發生,請在匯出映像檔之前,先編輯 WSL 設定檔 /etc/wsl.conf 如下:

[user]
default=預設的登入帳號名稱

匯出映像檔

先在 PowerShell 查看一下現在系統裡有哪些 WSL 設置:

wsl -l -v
---
  NAME            STATE           VERSION
* Ubuntu          Running         2
  Ubuntu-22.04    Stopped         2

假設 Ubuntu 就是我們想要匯出的標的,請輸入以下命令:

# 停止 "Ubuntu" 個體
wsl -t Ubuntu

# 將 "Ubuntu" 個體匯出至 "my-image.vhdx" 映像檔
wsl  --export Ubuntu  --vhd my-image.vhdx

映像檔可能很大。建議對它產生一份 hash,以供比對。1

匯入映像檔

假設我們想從 my-image.vhdx 映像檔匯入到一個名為 dev 的 WSL 個體,請輸入以下指令:

# 將 "my-image.vhdx" 映像檔匯入到名為 "dev" 的 WSL 個體,
# 並在 C:\WslDisk 建立虛擬硬碟
wsl --import dev  C:\WslDisk  my-image.vhdx  --vhd

# 看看是否匯入成功
wsl -l -v
---
  NAME            STATE           VERSION
* Ubuntu          Stopped         2
  dev             Stopped         2
  Ubuntu-22.04    Stopped         2

你在 Windows Terminal 應該可以看到多了一個名為 dev 的終端機選項:

測試

既然是要給研發團隊用的公版,自然要登入看看是否一切正常。就以這陣子在實驗的 Laravel Sail 環境為例 2

asciicast

如果有問題,就得卸載這份有瑕疵的 WSL 個體,回到源頭繼續修改:

# 停止 "dev" 個體
wsl -t dev

# 卸載 "dev" 個體
wsl --unregister dev

如果還有預設登入帳號的問題

在前置作業時,曾經透過 WSL 設定檔 /etc/wsl.conf 避免預設登入帳號變成 root 的問題。如果此法無效,請根據這份建議,用 Windows 登錄編輯程式 regedit.exe 去修改 Windows registry:

  • Key: HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\{某一個}
  • Name: DefaultUid
  • Type: 請切換成「十進位數字」
  • Data: 請設成 1000 (十進位數字)

萬一還無效,請參考 “How to set default user for manually installed WSL distro?” 一文的討論。


  1. 在 Windows 可透過 certutilGet-FileHash 指令取得檔案的 hash 值。詳見 “5 Ways to Generate and Verify MD5 SHA Checksum of Any File in Windows 10” 一文。 ↩︎

  2. 詳見〈用 Podman 執行 Laravel + Sail〉一文。 ↩︎