Windows 11提供WSL2的技術,能在Windows系統跑Linux環境,用於開發程式,或者跑Linux的圖形程式。
除了Ubuntu外,不少Linux發行版也支援WSL2了,例如Fedora、openSUSE、Arch Linux、Debian、CentOS。
WSL預設安裝發行版為Ubuntu。但若是…
- 你想要Ubuntu以外Linux發行版的套件呢?
- 你想要為每個專案建立隔離的Linux環境呢?
- 你想要用同一個Linux發行版安裝多重環境呢?
你應該安裝多個WSL實例(instances),還是使用Docker容器解決方案呢?本文我將採用後者的作法,搭配「Distrobox」建立多個Linux發行版的容器環境。
1. WSL跑Distrobox的理由#
我的想法是,如果我「個別」安裝多個Linux發行版的wsl容器,則檔案總管會變這樣醜醜的。
且以WSL目前的設計來說,要建立同個發行版的多重環境是得手動匯入的,不如使用Docker方便。
此外我還有一個考量,那就是WSL安裝的圖形程式(如Firefox),Windows會在WSL執行時把它加到開始選單。但我不想什麼程式都往外跑啊!
如果我只是臨時想要特定發行版的套件,那用Docker/Podman容器可以做到了。容器技術可以無限複製多個Linux的環境。
參考WSL架構圖,我們在WSL跑Linux,然後再於裡面跑Docker,Docker裡面再裝Linux程式。這樣等於是容器中有容器的概念。
我們甚至可以用 Distrobox簡化建立容器的程序。Distrobox是方便建立多重Linux容器的前端工具,可以用Docker或Podman當後端。
好處是我只要保留一個WSL Ubuntu當做Linux的載體,剩下的Linux環境跑在容器裡面,家目錄可以指定統一塞在Ubuntu的家目錄。
Distrobox建立的發行版容器並不會跑到Windows外面,就算圖形程式也一樣。我可以在需要的時候才開啟Linux容器,並在我要的情況下才把容器內的程式加到Windows開始選單。
此外,Distrobox支援更多發行版。只要Docker Hub有提供映像檔,就算是遠古版本的CentOS 6也裝給你看。
不過還請注意Distrobox比較適合跑在真的Linux系統上。WSL本身就有虛擬化的成份。如果用Distrobox跑圖形程式遇到問題,Windows會比Linux更難以解決。
2. 在WSL安裝Distrobox#
使用Windows 11電腦 安裝WSL2 Ubuntu
登入WSL2
wsl --distribution Ubuntu --user user
安裝Docker當作Distrobox後端。
安裝DistroBox套件。Ubuntu 22.04沒有人打包,所以採用指令稿安裝方式
curl -s https://raw.githubusercontent.com/89luca89/distrobox/main/install | sudo sh
3. Distrobox的使用方法#
詳細Distrobox用法 請看這篇。
- 首先解決
path /tmp is mounted on / but it is not a shared or slave mount
錯誤:
sudo mount --make-shared /
- 建立最新Fedora的容器,指定專屬家目錄
distrobox create --name fedora --image fedora --home ~/distrobox/fedora
- 進入Fedora環境
distrobox enter fedora
- 接著便可使用dnf指令安裝套件,例如Firefox
sudo dnf install firefox
4. VSCode連線到Distrobox的容器#
Distrobox建立的跟一般Docker容器無異,是可以用VSCode連線的。
code .
- 如此一來Distrobox的容器便會出現在VSCode的列表
3. 容器內跑Linux圖形程式#
跟一般WSLg的程式一樣,Distrobox容器內的程式只要從終端機輸入執行檔名稱即可啟動
例如輸入firefox
即會開一個新視窗。
將Distrobox內的程式加到開始選單#
- 要從Windows的開始選單存取Distrobox內的圖形程式,在容器內使用
distrobox-export
指令匯出:
# 在容器內執行
distrobox-export --app firefox
# 如果需要額外環境變數的改用這個,他會匯出一個指令稿
distrobox export --bin /usr/bin/firefox
- 登出容器,回到WSL Ubuntu
exit
- 將Distrobox建立的Desktop Entry移動到Windows會讀取的路徑
sudo mv ~/.local/share/applications/fedora-firefox.desktop /usr/share/applications
- 如此一來Windows的開始選單就會出現
Firefox (on Feodra) (Ubuntu)
的圖示
GPU加速問題#
儘管WSL的Ubuntu有GPU硬體加速(DirectX <-> Mesa),但Docker容器裡面吃不到硬體加速,會變成llvmpipe軟體渲染。
如何確認?用glxinfo | grep OpenGL
指令 (需要安裝mesa-utils套件)
看輸出結果即知道,如果有硬體加速,renderer string
便是d3d(上),沒有的話就是llvmpipe(下)
此時有二種解法:
使用支援WSLg的發行版映像檔,設定 環境變數指定使用WSLg
使用VirGL伺服器,參見 在WSL跑virglrenderer
4. 容器內跑桌面環境#
Distrobox試驗性支援跑桌面環境,包括GNOME、KDE Plasma、XFCE等。
承上面圖形程式的做法,參考 Distrobox跑桌面環境