第一篇:WSL 原理介紹
第二篇:本篇
第三篇:WSL 補充內容
第四篇:WSL 搭配 VSC
附上近期投影片教學 (wsl 2版),未來會在 notion 上重寫
首先,請檢查一下手邊的機器有無達到以下條件:
WSL2
Windows 10 S版不支援
最後,您本人有無達到以下條件
本教學適用 Ubuntu 20.04 LTS 以及 Ubuntu 21.10 版
歡迎搭配以下兩篇一起服用~
Windows Subsystem for Linux 環境配置 ( 1709 版)
Windows 10 上適用於 Linux 的 Windows 子系統安裝指南
WSL 更新資訊:
使用系統管理員權限開啟 Power Shell,輸入下述指令:
DISM /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
DISM /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
重新啟動電腦以完成安裝。
到「控制台 > 程式集 > 程式與功能」,點擊「開啟或關閉 Windows 功能」。
從開啟的小視窗中點選啟用「適用於 Linux 的 Windows 子系統」和「虛擬機器平台」,確定後重新啟動電腦。
Ubuntu 20.04 LTS 可以從 Windows 商店 取得,沒有標註的預設會安裝穩定版 LTS (目前是 20.04),App 更新不影響版本,筆者這裡使用最新 20.04 版來說明。
Ubuntu 提供 18.04 與 20.04 特定 LTS 選擇,不同 App 視為不同的 distro。
安裝好後請打開 App,第一次開啟會需要等他安裝組建,完成後需要新增帳號密碼來建立使用者,密碼主要用於 sudo
。
Windows 終端機(Windows Terminal) 是 Microsoft 公司在 2019 年的 Microsoft Build 大會上宣佈推出一款全新的 Windows 終端機,能夠取代 PowerShell 的命令提示字元。
Windows 終端機可啟用多個索引標籤 (在多個 Linux 命令列、Windows 命令提示字元、PowerShell、Azure CLI 等之間快速切換)、建立自訂按鍵繫結 (開啟或關閉索引標籤、複製+貼上等的快速鍵)、使用搜尋功能及自訂佈景主題 (色彩配置、字型樣式和大小、背景影像/柔邊/透明度)。官方的介紹短片
Windows 終端機可以從 Windows 商店 取得
如果在傳統應用程式介面覺得字型大小不好看的話,可以右鍵開啟 App 內容,在裡面調整顯示設定,關於 TrueType 字型在 zsh 會有詳細說明。
1803 版之前 App 的內容配置,每次重開似乎都會自動變回新細明體。
設定成功後就會進到此畫面,前面是你的帳號,@後面是你的電腦名稱。
除了透過 App,我們還可以透過命令提示字元 (cmd) 或是執行 (Win
+R
) 並輸入以下任一種來啟動 WSL:
bash
:進入 預設 Linux distro 的 bash shellwsl
:進入 預設 Linux distro 的 default shellubuntu
或 ubuntu2004
:執行特定 App .exe前兩項會根據目前 WSL 預設的 distro 執行,因為目前只安裝 Ubuntu,所以都可以視為相同。
/mnt/c
也就是 mount C,是用來支援原生 Windows 檔案系統,詳情可以查看上一篇。
需要注意使用者名稱和根目錄並非同一個位置,前者存取的是 Windows 下的 Users,後者為專屬 WSL 的檔案系統。
1703 版前舊版 WSL 的路徑有些不同。
由於 WSL 支援多種 Linux distro,所以我們可以在 cmd 透過 wslconfig
來管理,下圖可以看到目前的預設的 distro (App 名稱)。
1703 版前舊版 WSL 要透過
lxrun
管理。
上面都沒問題的話就更新一下 Ubuntu 的資料庫,最好定期執行。
由於 WSL 內建的 apt 伺服器使用的是位於歐洲(英國)的 http://archive.ubuntu.com/ubuntu ,下載軟體的時間會因各 ISP 的因素導致下載速度緩慢,因此建議修改成離自己地區最近的鏡像站,可以從 這裡 查詢各地區的鏡像站。
以下使用台灣的 國家高速網路與計算中心(NCHC) 進行修改,提供的頻寬有 20 Gbps 不怕你下載跑不滿。
使用 sed 的指令將 /etc/apt/sources.list 裡面的 archive.ubuntu.com 和 security.ubuntu.com 替換成 free.nchc.org.tw
$ sudo sed -i 's/archive.ubuntu.com/free.nchc.org.tw/g' /etc/apt/sources.list
$ sudo sed -i 's/security.ubuntu.com/free.nchc.org.tw/g' /etc/apt/sources.list
Ubuntu 24.04 LTS 的軟體來源從 /etc/apt/sources.list 改到 /etc/apt/sources.list.d/ubuntu.sources
$ cat /etc/apt/sources.list.d/ubuntu.sources
Types: deb
URIs: http://free.nchc.org.tw/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Types: deb-src
URIs: http://free.nchc.org.tw/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Enabled: no
Types: deb
URIs: http://free.nchc.org.tw/ubuntu
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Types: deb-src
URIs: http://free.nchc.org.tw/ubuntu
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Types: deb
URIs: http://archive.ubuntu.com/ubuntu
Suites: noble noble-updates
Components: main restricted
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Types: deb
URIs: http://security.ubuntu.com/ubuntu
Suites: noble-security
Components: main restricted
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
之後執行以下動作
$ sudo apt clean all # 清除伺服器先前已取得的檔案清單
$ sudo apt update # 更新伺服器的檔案清單
$ sudo apt upgrade # 更新套件
有安裝後續 zsh 的 debian 就可以直接用
ad
和adg
。
目前 18.04 版在更新套件時會看到 ebtables 的 error,不過這可以先忽略。
do-release-upgrade
(目前測試是沒有辦法找到新 release)wsl --unregister
取消註冊一言以蔽之就是實用,像是命令列補全、可載入模組等等,主要都會選擇搭配下面提到的 oh-my-zsh 一起使用。
參考資料:zsh wiki
$ sudo apt-get install zsh
$ zsh --version
zsh 5.8 (x86_64-ubuntu-linux-gnu)
$ cat /etc/shells
# /etc/shells: valid login shells
/bin/sh
/bin/bash
/bin/rbash
/bin/dash
/usr/bin/tmux
/usr/bin/screen
/bin/zsh
/usr/bin/zsh
$ chsh -s $(which zsh)
.zshrc
,只要沒有此檔案都會一直回到這個畫面。$ echo $SHELL
/usr/bin/zsh
$ $SHELL --version
zsh 5.4.2 (x86_64-ubuntu-linux-gnu)
$ sh -c "$(wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"
$ sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
由於部分主題像是 agnoster 系列,都會用到特殊符號,這種時候就要安裝 Powerline 字型來解決,一部分原因也是因為 Windows 內建字型較少等寬 (monospace)。
無論是 App 或 VSC 來執行 WSL,字型都是從 Windows 安裝的來選擇,安裝在 WSL 並沒有意義。
這邊介紹一款好用的字體:更紗黑體
在 Windows 終端機上面套用的方式也很簡單
打開 Windows 終端機,在新分頁右邊的「下拉式按鈕」,選擇「設定」
在右邊的設定檔選擇 Ubuntu-20.04,標籤切換到外觀,在字體的地方選擇「等距更紗黑體」
字體選擇完畢以後,文字上方可以即時顯示套用的字體
在終端機設定做任何變更請記得在右下角按「儲存」
先輸入以下指令開啟設定檔,由於我們初始設定選擇 0,所以會看到滿滿註解的 .zshrc
,同時也可以看到 oh-my-zsh 的安裝路徑。
$ vim ~/.zshrc
使用 App 在
.zshrc
暫時沒有高亮,筆者是在 VSCode 下使用。
內建的 Themes 會位於 ~/.oh-my-zsh/themes
,可以直接在上圖 .zshrc
中的 ZSH_THEME
替換想要的主題,並套用變更。
其他需要下載的主題可以從 awesome-zsh-plugins 查看,目前筆者使用的是 bullet-train,以下教學都可以類推適用。
先切換目錄到 $ZSH_CUSTOM/themes
底下,再使用 wget
下載該主題的 raw 檔。
$ cd $ZSH_CUSTOM/themes
$ wget https://raw.githubusercontent.com/caiogondim/bullet-train-oh-my-zsh-theme/master/bullet-train.zsh-theme
確認下載至對應路徑後,回到 ~/.zshrc
更改主題並套用,結果如下,雖然有受到 VSC 佈景影響,但整體效果仍相當不錯。
需要注意的是主題和套件都會影響 zsh 的啟動速度,請自行衡量。
啟用終端機的 256 色模式。
$ echo 'export TERM="xterm-256color"' >> ~/.zshrc
如果是在 VSC 裡執行 WSL,內部顏色會被 VSC 的佈景顏色影響,App 則不會有太大影響,以下是 24 bits color 測試結果:
如果是像 powerlevel9k 這類 agnnoster 主題,尾端或是游標的顯示在 App 或 VSC 有可能跑掉,這必須自己測試主題了。
目前 VSC 的終端機顏色只能透過佈景主題去調整,詳見 Color theme for VS Code。
各種支援套件都可以在此找到:plugins 列表、plugins 分類,內建套件會位於 ~/.oh-my-zsh/plugins
。
如同上面提到,awesome-zsh-plugins 詳列許多 zsh 框架,以及各式套件與主題,想簡化安裝步驟的可以使用 Antigen 等套件管理工具。
安裝於 $ZSH_CUSTOM/plugins
底下。
$ git clone https://github.com/zsh-users/zsh-autosuggestions $ZSH_CUSTOM/plugins/zsh-autosuggestions
$ git clone https://github.com/zsh-users/zsh-completions $ZSH_CUSTOM/plugins/zsh-completions
$ git clone https://github.com/zsh-users/zsh-syntax-highlighting $ZSH_CUSTOM/plugins/zsh-syntax-highlighting
$ git clone https://github.com/zdharma-continuum/fast-syntax-highlighting $ZSH_CUSTOM/plugins/fast-syntax-highlighting
$ZSH_CUSTOM
的 git repos$ git clone https://github.com/TamCore/autoupdate-oh-my-zsh-plugins $ZSH_CUSTOM/plugins/autoupdate
.zshrc
,所以不用特別啟用,但務必確保設定在檔案最底端。$ sh -c "$(curl -fsSL https://gist.githubusercontent.com/jsdryan/1af3a7fab6b7497ae5a99640c501363f/raw/1628761c581fe90cc3d616985ddcdefbd5bce8c4/install.sh)"
指令 | 說明 |
---|---|
n-aliases | browses aliases, relegates editing to vared |
n-cd | browses dirstack and bookmarked directories, allows to enter selected directory |
n-functions | browses functions, relegates editing to zed or vared |
n-history | browses history, allows to edit and run commands from it |
n-kill | browses processes list, allows to send signal to selected process |
n-env | browses environment, relegates editing to vared |
n-options | browses options, allows to toggle their state |
n-panelize | loads output of given command into the list for browsing |
可以不用加
-
,Ctrl
+R
可以快速使用nhistory
。
x
等同 extract
,只要加上要解壓縮的檔名,剩下就會自動處理,需要先安裝 unzip$ sudo apt-get install unzip
$ cd ~
$ git clone https://github.com/clvv/fasd.git
$ cd fasd
$ sudo make install # 可能會需要安裝 make
$ echo 'eval "$(fasd --init auto)"' >> ~/.zshrc
除了直接呼叫 fasd
加上參數, 一般會使用內建的縮寫:
指令 | 說明 |
---|---|
a | any |
s | show / search / select |
d | directory |
f | file |
sd | interactive directory selection |
sf | interactive file selection |
z | cd, same functionality as j in autojump |
zz | cd with interactive selection |
$ sudo apt-get install aptitude
指令 | 說明 |
---|---|
as [search term] | Search for packages |
ad | Update packages |
adg | Updgrade packages |
ai [packages to install] | Install package(s) |
ar [package to remove] | Remove package |
app | Apt policy |
acs [search term] | Search packages in cache |
ac | Clean apt cache |
age [parameters] | apt-get [parameters] |
api [parameters] | aptitude [parameters] |
aps [search term] | Search with aptitude |
afs [search term] | Search files in packages |
asrc [parameters] | apt-get source [parameters] |
aac | Autoclean |
abd | Build dependencies |
adu | Update & (safe)upgrade |
afu | Update & full-upgrade |
ag | Upgrade (safe) |
ail [list of packages] | Install all packages in list |
ap | Purge |
ads | Dselect upgrade |
dia | Install all ./*.deb |
di [glob] | Install all glob |
kclean | Remove unused kernel images |
allpkgs | Print all installed packages |
mydeb | Create .deb package |
apt-list-packages | List packages by size |
kerndeb | Kernel-package building shortcut |
apt-copy | Creates script to install all current packages on other machine |
apt-history | Prints apt history |
ls
的搭配Esc
兩次,可以直接在 command 前加上 sudo
在 ~/.zshrc
這地方依序打上需要啟用的套件 (資料夾名稱) 並套用變更。
plugins=(
git
zsh-autosuggestions
zsh-completions
zsh-syntax-highlighting
fast-syntax-highlighting
autoupdate
extract
fasd
debian
last-working-dir
colored-man-pages
command-not-found
common-aliases
sudo
)
可以發現 plugins 後面才
source oh-my-zsh.sh
。
source ~/.zshrc
在 1703 版後,用戶的 Windows 環境變數會自動加到 WSL 裡,所以可以很容易地透過 WSL 開啟 Winodws 的程式,所以在 WSL 執行 code
會直接開啟 VSC。
1805 新版的 oh-my-zsh,啟用 completion 相關的套件可能顯示如下警告,詳見 Folder permission issue。
請直接在 ~/.zshrc
前面加上下面指令,務必要在載入 oh-my-zsh 之前。
ZSH_DISABLE_COMPFIX=true
$ upgrade_oh_my_zsh
$ uninstall_oh_my_zsh
~/.profile
和 ~/.bashrc
由於我們已更改預設 shell,所以不會被 zsh 載入,一般前者為 login 載入,後者為 non-login 載入。
zsh
有專屬的 ~/.zprofile
和 ~/.zshrc
,一般只會修改後者。
在預設的情況下,WSL2 的虛擬磁碟檔案(ext4.vhdx)會放在 C 槽的位置。但有時候我們可能有一些原因(例如:C 槽容量不足、系統常常重灌、想隨身攜帶)會想要放到其他地方而官方預設又不讓你轉移存放,這邊找到一個變通的辦法可以讓您暢行無阻
C:\Users\[使用者名稱]\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState)
關於還原的部分,由於同一個名稱只認一個安裝位置, 假如你新的電腦已經安裝了 WSL2 的 Ubuntu-20.04 你就必須要先將其解除安裝或是重新命名,否則接下來的還原會發生失敗,接下來就以新的電腦有安裝過 Ubuntu-20.04 做示範
wsl --unregister Ubuntu-20.04
在 Ubuntu-20.04 尚未註冊到系統之前,不要提前將您自己的 ext4.vhdx 丟到解壓縮的資料夾內
否則會還原會失敗
wsl --shutdown
如果有遇到還原之後預設登入帳號為 root ,而非使用者帳號時,可參考以下解決辦法
root 帳號下執行此指令
# id -u <username>
(理論上應該回傳 1000)
修改登錄檔
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\{MY-UUID}
修改 DefaultUid
登錄檔的十進制為 1000
PowerShell:
PS > wsl —shutdown
PS > wsl
這時登入帳號應該就會是 username 了!
原本早期的版本 Ubuntu 的指令介面還是具備中文顯示的,但後期到現在的版本全部改成英文
這邊提供各位還原的辦法
sudo apt install language-pack-zh-hant
sudo dpkg-reconfigure locales
zh-TW.UTF-8
,然後按 Tab
鍵切換到 OK,然後按 Enter
下一步zh-TW.UTF-8
,然後按 Enter
下一步locale
進行確認,語系會全部變成 zh-TW.UTF-8
在新版的 zsh 上,如果需要顯示 git branch 於 Prompt,需將 language 改回 en_US.UTF-8,並且需要重新建立 .zshrc (source ~/.zshrc 沒有用)
Update: ohmyzsh/git async prompt does not appear
Microsoft 提供的 WSL Ubuntu 發行版為 LTS 的分支。
為因應部分特殊需求,Microsoft 仍然保留修改發行版更新通道的設定檔。
這邊提供升級的方法:
sudo apt update && sudo apt-get full-upgrade -y
sudo vim /etc/update-manager/release-upgrades
將 Prompt=lts
更改成 Prompt=normal
sudo do-release-upgrade
Ubuntu 24.04 尚未提供 Prompt=lts
直接升級
需要使用 -d
參數
sudo do-release-upgrade -d
基本上,你一次只能從 Microsoft Store 或是手動安裝一種 WSL Distro 版本,如果想準備多個不同的開發環境,但都使用同一個 WSL Distro 怎麼辦呢?
其實很簡單,你先找到一個執行個體,並且把基本設定都搞定,當成 WSL Distro 範本,接著先匯出,再匯入多個版本即可!
底下這個例子(PowerShell),就是將現有的執行個體先匯出,然後匯入成兩個不同的 WSL Distro 名稱 (指定使用 WSL 2 版本):
PS > cd $env:USERPROFILE
PS > wsl --export Ubuntu-21.10 Ubuntu-2110_backup.tar
PS > wsl --import Ubuntu-21.10 K:\WSL2\Ubuntu21.10 Ubuntu-2110_backup.tar --version 2
PS > wsl --import Ubuntu-21.10-Dev K:\WSL2\Ubuntu21.10-Dev Ubuntu-2110_backup.tar --version 2
如果要指定啟動特定 WSL Distro 的話,只要加上 -d <Distro> 參數即可:
wsl -d Ubuntu-21.10-Dev
如果要指定關閉特定 WSL Distro 的話,只要加上 -t <Distro> 參數即可:
wsl -t Ubuntu-21.10-Dev
處理辦法原文:使用 WSL 2 打造優質的多重 Linux 開發環境
參考資料:
鳥哥
Zsh not hitting ~/.profile
Ubuntu 如何快速替換軟體來源的鏡像站(Mirror)?