安裝/啟用 WSL 2
如果你現在用的是 Win11 (或者 Win10 21H2), 那麼恭喜你, 你只要以系統管理員身分執行以下指令即可 "啟用執行 WSL 並安裝 Linux 的 Ubuntu 發行版本".
wsl --install
WSL 安裝畫面
然後, 記得電腦要重新開機.
舊版 WSL 2 安裝說明
如果你用的是 Win10 ver.2004 但又不想安裝更新, 其實也可以使用 WSL 2, 只是步驟很麻煩.
Step 1: 請你以系統管理員身分執行:
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
然後, 記得電腦要重新開機.
註一: 這一步其實也可以用圖形介面操作: 請在 Windows 的搜尋框中輸入 "開啟或關閉 Windows 功能" (部份即可, 不必全部輸入), 即可找到 "開啟或關閉 Windows 功能" 這個對話框. 然後勾選 "Windows 子系統 Linux 版" 和 "虛擬機器平台" 這二個功能 (如下圖 1). 系統就會完成安裝並要求重新開機.
Step 2: 重新開機之後還要安裝
WSL2 Linux 核心更新套件 (適用於 x64 電腦).
Step 3: 然後再將 WSL 改為預設使用 WSL 2.
wsl --set-default-version 2
Step 4: 再來, 是到 Windows 的搜尋框上輸入 'store', 連線到 Microsoft Store 去下載 "Ubuntu 發行版" (如下圖2).
下載完成後, (依指示) 啟用 "Ububtu 發行版".
注意: WSL 2 的 Ubuntu 發行版已經升級過一次, 之前 WSL2 預設的 Ubuntu 發行版是 Ubuntu-20.04 版 (目前則是 Ubuntu-22.04). 而且預設的使用者家目錄 (user home directory) 就是使用者在 Windows 的家目錄. 但是目前這個版本已經下載不到了.
下載 Ubuntu 發行版.
WSL 指令常用參數
日常使用
- 列出已安裝的 Linux distro 及其狀態
wsl -l -v # 或者是 wsl --list --verbose
輸出範例:
NAME STATE VERSION CentOS7 Stopped 2 CentOS8 Stopped 2 * Ubuntu Running 2 Ubuntu-22.4 Stopped 2
註: 前面有 * 者為預設連線的 distro.
- 連線至某個已安裝的 <Distro> (使用預設帳號).
wsl -d <Distro> # 或者是 wsl --distribution <Distro>
- 使用其他帳號 (連線預設 <Distro>).
wsl -u <user_name> # 或者是 wsl --user <user_name>
例如:
wsl -u root
- 在 Windows 裡查詢 Linux <Distro> 的 ip addr
wsl -d <distro> ip addr show eth0
輸出範例:
查詢 Linux distro 的 ip addr
Windows 與 WSL distro 互動
- 在 Windows 直接執行某個 Linux 指令 (預設 <Distro>)
指令多於一個可依 bash 習慣使用 ; (或者 &&, ||) 連結在一起wsl <linux-command>
例如: 列出家目錄中所有的檔案資訊:
wsl ls -al ~
輸出範例:
指令 wsl ls -al ~ 輸出範例
- 在 <Distro> 裡, 也可以使用 windows 應用程式.
# 取得網路設定 ipconfig.exe /all # 打開檔案總管 explorer.exe . # 使用 Windows 的 ping ping.exe google.com
- 混用二者的指令其實也是可以的. 例如在 WSL distro 裡:
ipconfig.exe | grep IPv4 | cut -d: -f2
或者在 Windows 裡:
wsl ls -la | FIND /I "CUDA"
- 如果你想在 WSL distro 裡使用 docker, 不用安裝 Linux 版的. 請安裝 Docker Desktop for Windows, 它可以設設定讓 WSL distro 也可以使用 docker 指令.
- 如果你想在 WSL distro 裡使用 VS Code, 不用安裝 Linux 版的 VS Code, 直輸入:
code .
自動安裝 VS Code Server
連接上 WSL distro 的 VS Code 圖示
相互存取路徑寫法
- 在 Windows 存取 <Distro> 內的檔案, 檔案路徑寫法:
- / 改為 \
- 前面加一段 \\wsl$\<Distro>
例如: 想存取自己在的 Ubuntu home 目錄裡的檔案 /home/myName/sample.txt 則應該將檔案路徑改為
\\wsl$\Ubuntu\home\myName\sample.txt - 在 <Distro> 存取 Windows 裡的檔案, 檔案路徑寫法:
- 磁碟機代號改為 /mnt/<drive>
- \ 改為 /
例如: 想存取 D:\Data\mySQL\test.sql 應該改為
/mnt/d/Data/mySQL/test.sql
設定
- 設定特定 <Distro> 使用 WSL 2
wsl --set-version <Distro> 2
- 設定 WSL 預設使用 WSL 2
wsl --set-default-version 2
- 設定預設連線的 Linux <Distro>
wsl -s <Distro> # 或者是 wsl --set-default <Distro>
進階設定: 啟用 systemd
WSL 預設將 systemd 關閉, 但有許多程式需要 systemd 才能使用. 啟用步驟:
- 修改 /etc/wsl.conf (第一次此檔不存在)
sudo vi /etc/wsl.conf
[boot] systemd=true
- 退出 distro, 確實停止整個 WSL 行程, 再重新連線該 distro
wsl --shutdown
- 驗證 systemd 已啟用
systemctl list-unit-files --type=service
使用 GUI
新版的 WSL 核心已經包含執行 GUI 程式必需的元件. 我們只要安裝想用的 Linux GUI 程式即可.
安裝前一般要先更新一下軟體倉儲的資料:
# 更新軟體倉儲資料
sudo apt update
- 安裝 gedit:
# 安裝 gedit sudo apt install gedit -y
- 安裝 giggle:
# 安裝 giggle (GUI 介面 for Git) sudo apt install giggle -y
- 安裝 GIMP:
# 安裝 GIMP sudo apt install gimp -y # 修復錯誤訊息 "(gimp:30464): Gtk-WARNING **: 23:59:40.884: Unable to locate theme engine in module_path: "pixmap" sudo apt install gtk2-engines-pixbuf
- 安裝 Nautilus:
# 安裝 Nautilus sudo apt install nautilus -y
- 安裝最新版 libreoffice:
# 安裝最新版 libreoffice sudo add-apt-repository ppa:libreoffice sudo apt update sudo apt install libreoffice -y
- 安裝 vlc:
# 安裝 vlc sudo apt install vlc -y
- 安裝 x11-apps:
# 安裝 x11-apps sudo apt install x11-apps -y
- 安裝 Mozilla Firefox:
# 安裝 Mozilla Firefox sudo apt install firefox # Mozilla Firefox 安全性更新 sudo add-apt-repository ppa:ubuntu-mozilla-security/ppa sudo apt-get update sudo apt-get upgrade
- 安裝最新版 Mozilla Firefox:
# 安裝最新版 Mozilla Firefox sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A6DCF7707EBC211F sudo add-apt-repository "deb http://ppa.launchpad.net/ubuntu-mozilla-security/ppa/ubuntu bionic main" sudo apt update sudo apt install firefox
- 安裝 Google Chrome:
# 安裝 Google Chrome cd /tmp sudo wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb sudo dpkg -i google-chrome-stable_current_amd64.deb sudo apt install --fix-broken -y sudo dpkg -i google-chrome-stable_current_amd64.deb
- 安裝 Microsoft Teams:
# 安裝 Microsoft Teams cd /tmp sudo curl -L -o "./teams.deb" "https://teams.microsoft.com/downloads/desktopurl?env=production&plat=linux&arch=x64&download=true&linuxArchiveType=deb" sudo apt install ./teams.deb -y
- 安裝 Microsoft Edge Dev Browser:
# 安裝 Microsoft Edge Dev Browser sudo curl https://packages.microsoft.com/repos/edge/pool/main/m/microsoft-edge-dev/microsoft-edge-dev_101.0.1193.0-1_amd64.deb -o /tmp/edge.deb sudo apt install /tmp/edge.deb -y
遠端桌面 (使用 xrdp + xfce4)
- 安裝: (注意: 這一套作法 systemd 不可啟動)
# Update package repo and do upgrade sudo apt update && sudo apt -y upgrade # 清除套件快取 sudo apt-get purge xrdp # 安裝套件 xrdp, xfce4, xfce4-goodies sudo apt install -y xrdp sudo apt install -y xfce4 sudo apt install -y xfce4-goodies
- 修改設定檔 /etc/xrdp/xrdp.ini: 每個安裝遠端桌面的 Linux distro 都需要一個唯一的 TCP port, 故更動 TCP port 3389.
sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini sudo sed -i 's/max_bpp=32/#max_bpp=32\nmax_bpp=128/g' /etc/xrdp/xrdp.ini sudo sed -i 's/xserverbpp=24/#xserverbpp=24\nxserverbpp=128/g' /etc/xrdp/xrdp.ini
- 新增設定檔 ~/.xsession:
echo xfce4-session > ~/.xsession
- 修改批次檔 /etc/xrdp/startwm.sh:
sudo nano /etc/xrdp/startwm.sh
# test -x /etc/X11/Xsession && exec /etc/X11/Xsession # exec /bin/sh /etc/X11/Xsession
附加以下二行
- 啟動: (每次 Linux distro 重新啟動時都需要再啟動一次)
sudo /etc/init.d/xrdp start
netstat -na | find "3390"
TCP [::1]:3390 [::]:0 LISTENING
- 連線: 使用 Windows "Remote Desktop Connect" (遠端桌面連線) 即可連線 (連線地址為 localhost:3390)
使用 "遠端桌面連線" 連線 localhost:3390
"遠端桌面連線" 連線時的告警訊息
# xfce
startxfce4
Linux distro 安裝/維護
- 安裝預設的 Ububtu distro
wsl --install
- 列出網路上可供安裝的 Linux distro
wsl -l -o # 或者是 wsl --list --online
- 加裝特定 <Distro> (<Distro> 為 wsl -l -o 列表中的 Linux distro)
wsl --install -d <Distro>
- 將 <Distro> 關機 (terminate)
wsl -t <Distro> # 或者是 wsl --terminate <Distro>
- 全部關機 (shutdown WSL)
wsl --shutdown
- 刪除 (unregister) 某個 <Distro>
wsl --unregister <Distro>
進階維護
- 新裝好的 distro 或許有許多需要客製的地方, 例如: 更新, 加裝一些套件/安裝包...
以下是我自己在測試時經常使用的, 所以把它們滙集成一個檔案 new_wsl.sh:#!/usr/bin/env bash # Bash Quick Operation (tab key) echo "set completion-ignore-case On" > ~/.inputrc # history Related echo " # Enable Ctrl-R/Ctrl-S key hit for history search stty -ixon shopt -s extglob HISTIGNORE=\"@(clear|history)?( )*\"" >> ~/.bashrc # Python Related sudo apt update; sudo apt upgrade sudo apt install python-is-python3 sudo apt install python3-venv # Install Newest git sudo add-apt-repository ppa:git-core/ppa sudo apt update sudo apt install git
- 使用 Windows 的家目錄
上一個版本的 distro 會將使用者的家目錄, 設在 Windows 的家目錄上. 目前版本的 distro 則都設在 /home/<username> 上. 透過修改/etc/passwd檔, 我們可以將它改回原先的設定 /mnt/c/Users/<username>動手之前, 建議你先將 /home/<username> 裡的幾個重要檔案拷貝到 /mnt/c/Users/<username>.
- .bashrc
- .inputrc (如果有的話)
- .profile
- .bash_profile (如果有的話)
- .bash_login (如果有的話)
- .ssh子目錄 (如果有的話)
不過如果你已經安裝了 git for windows, 那麼搬檔案時要小心一些, 因為 git for windows 也會在 Windows 的家目錄 裡產生這些檔案.
完成修改/etc/passwd檔之後, 需要重啟 WSL.
sc stop LxssManager sc start LxssManager
/etc/passwd檔的內容類似長這個樣子
uuidd:x:106:112::/run/uuidd:/usr/sbin/nologin tcpdump:x:107:113::/nonexistent:/usr/sbin/nologin jackting:x:1000:1000:,,,:/home/jackting:/bin/bash
- 搬動 <Distro> 的 Disk Image
- WSL 的 Linux distro 檔案系統在 Windows 中檔名固定為 ext4.vhdx
- 從 Microsoft Store 安裝的 WSL distro 是存放在以下位置
%LOCALAPPDATA%\Packages\- distro Ubuntu 存放在子目錄
CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\ - disstro Ubuntu 22.04 存放在子目錄
CanonicalGroupLimited.Ubuntuon22.04_79rhkp1fndgsc\LocalState\
- distro Ubuntu 存放在子目錄
想要搬個家需要三個步驟:
- export fs image of <Distro>
- unregister <Distro>
- import fs image of <Distro>
# Step 1: export mkdir D:\backup wsl --export <Distro> D:\backup\<distro>.tar # Step 2: unregister wsl --unregister <Distro> # Step 3: import mkdir D:\wsl wsl --import <Distro> D:\wsl\ D:\backup\<distro>.tar rmdir D:\backup
留言列表