快轉到主要內容

不只Ubuntu!Windows WSL用Distrobox裝多重Linux容器

分類   Linux系統 虛擬機與容器技術
標籤   Distrobox Windows Subsystem for Linux Docker
🗓️ 民國112年 癸卯年
✍ 切換正體/簡體字
目錄

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程式。這樣等於是容器中有容器的概念。

圖源:Microsoft

我們甚至可以用 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
#

  1. 使用Windows 11電腦 安裝WSL2 Ubuntu

  2. 登入WSL2

wsl --distribution Ubuntu --user user
  1. 安裝Docker當作Distrobox後端。

  2. 安裝DistroBox套件。Ubuntu 22.04沒有人打包,所以採用指令稿安裝方式

curl -s https://raw.githubusercontent.com/89luca89/distrobox/main/install | sudo sh

3. Distrobox的使用方法
#

詳細Distrobox用法 請看這篇

  1. 首先解決path /tmp is mounted on / but it is not a shared or slave mount錯誤:
sudo mount --make-shared /
  1. 建立最新Fedora的容器,指定專屬家目錄
distrobox create --name fedora --image fedora --home ~/distrobox/fedora
  1. 進入Fedora環境
distrobox enter fedora
  1. 接著便可使用dnf指令安裝套件,例如Firefox
sudo dnf install firefox

4. VSCode連線到Distrobox的容器
#

Distrobox建立的跟一般Docker容器無異,是可以用VSCode連線的。

參考: Developing in WSL

  1. 在Windows端安裝VSCode

  2. 開啟VSCode,安裝 WSL Docker延伸模組

  3. 登入WSL,在Ubuntu啟動code server

code .
  1. 如此一來Distrobox的容器便會出現在VSCode的列表

3. 容器內跑Linux圖形程式
#

跟一般WSLg的程式一樣,Distrobox容器內的程式只要從終端機輸入執行檔名稱即可啟動

例如輸入firefox即會開一個新視窗。

將Distrobox內的程式加到開始選單
#

  1. 要從Windows的開始選單存取Distrobox內的圖形程式,在容器內使用distrobox-export指令匯出:
# 在容器內執行
 distrobox-export --app firefox

# 如果需要額外環境變數的改用這個,他會匯出一個指令稿
distrobox export --bin /usr/bin/firefox
  1. 登出容器,回到WSL Ubuntu
exit
  1. 將Distrobox建立的Desktop Entry移動到Windows會讀取的路徑
sudo mv ~/.local/share/applications/fedora-firefox.desktop /usr/share/applications
  1. 如此一來Windows的開始選單就會出現Firefox (on Feodra) (Ubuntu)的圖示

GPU加速問題
#

儘管WSL的Ubuntu有GPU硬體加速(DirectX <-> Mesa),但Docker容器裡面吃不到硬體加速,會變成llvmpipe軟體渲染。

如何確認?用glxinfo | grep OpenGL指令 (需要安裝mesa-utils套件)

看輸出結果即知道,如果有硬體加速,renderer string便是d3d(上),沒有的話就是llvmpipe(下)

此時有二種解法:

  1. 使用支援WSLg的發行版映像檔,設定 環境變數指定使用WSLg

  2. 使用VirGL伺服器,參見 在WSL跑virglrenderer

4. 容器內跑桌面環境
#

Distrobox試驗性支援跑桌面環境,包括GNOME、KDE Plasma、XFCE等。

承上面圖形程式的做法,參考 Distrobox跑桌面環境

相關文章

WSL Docker的GPU硬體加速:virglrenderer
分類   Linux系統 虛擬機與容器技術
標籤   VirGL Windows Subsystem for Linux Docker
讓WSL Docker的OpenGL程式可以使用Windows GPU硬體加速
分類   Linux系統 虛擬機與容器技術
標籤   Nvidia Windows Subsystem for Linux Docker
Distrobox使用例:Docker跑GNOME X11桌面環境
分類   Linux系統 虛擬機與容器技術
標籤   Distrobox GNOME Docker

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur連結。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。