跳至內容
Bluebean 的筆記
Go back

在 Windows 上執行 Linux Desktop

我自己在體驗 Linux Desktop 時都是會額外建立一個虛擬環境 這樣蠻耗費資源的,因為需要兩個 Linux 的硬碟空間,其中一個是平常用的 Ubuntu Server

在粗略的碰過 Docker 之後,開始在想能不能夠透過 Docker 來執行 GUI 程式 一來環境本身隨用隨棄,二來移除時也比較方便,比較沒有負擔

用 Docker 執行 Linux GUI 程式

在這個想法出來的時候,我便上網去尋找相關內容 很快的就找到了 firefox 的執行範例

其實還蠻有趣的 因為 X-Window 是 Client-Server 的架構 所以這個 Docker 就只是安裝 firefox,然後把本機的 X-Window socket 分享給它

但我的 Host 機器本身是架在 VMware 上的 Linux VM 沒有裝 X-Window ,所以沒辦法分享 socket 所以還要想辦法讓 GUI 可以在 Windows 上執行

在 Windows 上執行 GUI 程式

考慮到 X-Window 的 Client-Server 架構 在 Windows 上執行應該是可行的 所以就找了 Windows 用的 X-Server : VcXsrv

依照使用情況決定要怎麼顯示 X-Window 的應用程式

image-20220813181947294

如果連線本身來自外部, Disable access control 需要開啟

image-20220813182116099

導向 X-Window 的封包到 Windows 上

這邊我採取了一個簡單的作法 就是開啟 putty ,然後透過 SSH 連線時,開啟 X-Forwarding

image-20220813165723067

使用後就可把 X-Windows 的封包導向到 Windows 上 缺點就是這個 SSH 連線必須一直開著

接著依照前面放的 Stackoverflow 上的回答 然後把 DISPLAY 帶入 host.docker.internal 連到 Linux 本機

docker run -d --name firefox -e DISPLAY=host.docker.internal:0 jess/firefox

這樣連線就會先連到 Linux 再經過 X-Forwarding 連到 Windows 上的 X-Server 就可以在 Windows 上使用 Linux 的火狐了!

image-20220813164807463

中文輸入問題

簡單的使用 firefox 之後,很快的遇到了一個問題:中文輸入 沒辦法打中文,這樣就沒辦法隨意瀏覽,只能用英文

目前我還找不到直接使用輸入法的方式 即使透過執行 bash 去手動安裝 ibus 也無法將 daemon 啟動 因此目前只能夠使用 desktop 環境來使用輸入法而已

在 Windows 上執行 Linux Desktop

自從能夠使用 firefox 之後,我就在想能不能直接把整個桌面搬過來 於是開始建置有安裝 xfce 桌面環境的 Docker Image

結論是可行的 不過網路上已經有 desktop 的 docker 了,就直接拿來用了 :)

然後基於這個 Image 之上,另外安裝了中文字型、新酷音輸入法、以及 Firefox 這樣就有一個基本的桌面環境了 使用上特別對環境做了一些調整

最後就有了以下這個 Dockerfile

FROM x11docker/xfce

## 安裝語系、中文字型、Firefox、新酷音
RUN sed -i "s@http://deb.debian.org@http://debian.csie.ntu.edu.tw@g" /etc/apt/sources.list && \
    apt-get update && \
    apt-get -y install \
        locales locales-all \
        fonts-arphic-ukai fonts-arphic-uming \
        firefox-esr \
        ibus ibus-chewing

## 設定時區
RUN ln -fs /usr/share/zoneinfo/Asia/Taipei /etc/localtime && \
    dpkg-reconfigure -f noninteractive tzdata

## 安裝個 sudo
RUN apt-get update && apt-get install -y sudo

## 建立使用者 docker 然後以使用者 docker 來執行桌面環境
## 密碼是 password
RUN useradd -ms /bin/bash -G sudo docker && echo "docker:password" | chpasswd
USER docker
WORKDIR /home/docker

## 註冊 ibus 讓輸入法隨著桌面環境開啟而啟動
## 不自動的話,就需要手動執行 ibus-daemon -drx
RUN mkdir -p ~/.config/autostart/ && \
    echo "\
[Desktop Entry]\n\
Encoding=UTF-8\n\
Version=0.9.4\n\
Type=Application\n\
Name=ibus\n\
Comment=ibus\n\
Exec=ibus-daemon -drx\n\
OnlyShowIn=XFCE;\n\
RunHook=0\n\
StartupNotify=false\n\
Terminal=false\n\
Hidden=false\n\
" > ~/.config/autostart/ibus.desktop

## 最後將畫面導向 Linux 主機本身
ENV DISPLAY=host.docker.internal:0 

## 執行程式的部份就交給 x11docker/xfce 了

最後的執行畫面長這樣:

image-20220813181813455

聲音

看起來桌面環境都沒問題了 但還有一點美中不足,那就是沒辦法將聲音輸出 後來發現 x11docker 在 github 的 wiki 上有提供兩種方案:

ALSA

ALSA 的操作雖然比較簡單,但是需要分享 /dev/snd 對 VM 加入硬體,分享 /dev/snd 後,依然沒辦法輸出聲音 最後實在是研究不出什麼東西 所以就不使用了

PulseAudio

PulseAudio 本身就是 Client-Server 架構 如果是一般的配置方式,那會比 ALSA 複雜 但是如果是使用 tcp 連線到 Windows 播放,那就簡單很多

PulseAudio 官方有 Windows 版本

在開啟之前需要對一些檔案進行一些修改:

最後執行 bin/pulseaudio.exe

image-20220813194412111

然後就可以在桌面上調整音量了

image-20220813200923181

後續問題

CPU 消耗量大

僅僅是看一個 Youtube 影片,就可以占走 74.5 % 的 CPU 了 VM 本身的運行加上網路的運作以及 VcXsrv 就占走大部分的資源

image-20220813201724145

而我配給 Linux VM 的 CPU 只有自身核心的 1/3 ,共兩顆核心 所以應該有 33% 是耗在 CPU ,而約 17% 耗在其他硬體模擬 再來就是網路上使用又會耗掉 16% 的 CPU 至少用這樣的方式來看影片或是使用 firefox 都不是個好方案 但是單純使用 desktop 的話,全部幾乎吃不到 10%

輸入法啟用問題

由於目前還沒找到可以在 Desktop 環境開啟前設定 ibus 的方法 所以沒辦法直接 build 設定好中文輸入法的環境 每次開啟時都必須自己添加語系切換或是直接下 ibus engine chewing 開啟輸入法 這也造成使用上的麻煩

安全性

在這篇使用了接受所有人連入的 X-Window Server 以及 PulseAudio Server 這本身就不是多安全的事情,畢竟任何人都可以連入 因為 Docker 本身只能使用 host.docker.internal 連線到 Linux VM 然後再透過 X-Forwarding 給 Windows 在這方面造成了連入的 IP 會是 Docker 的 IP 而非 localhost 迫使我只能關閉 Access Control 跟監聽 0.0.0.0 來接受這個 Docker 的連入

如果 X-Window 的主機在 Linux 上 則是直接將 X-Window 的 socket 給掛上去 似乎也不是個好的作法

結語

這些東西花我好幾天去找尋各種資料 從最一開始的 firefox 、中文字型、Desktop、中文輸入、背景啟動,最後到聲音

大致上運行上都沒什麼問題 除了瀏覽器的花費比想像中還大,有可能是用了 VM 的關係

至於安全性的部份還需要進一步研究才行 目前沒辦法保證這樣有比較安全 頂多可以不保留本機上的相關紀錄,而且隨用隨丟 所以還是玩玩就好,要不要拿來使用就看個人了

WSL 的部份也是可以這麼玩 因為我本身會用到 VMware 的 VT-x 去模擬巢狀虛擬化 所以沒有辦法使用 WSL 要用 WSL 的話,可以參考下面的影片: XFCE 4 Linux Desktop on WSL (windows subsystem for linux) with Pulse Audio - YouTube

相關連結

參考

更新


分享文章:

Previous
第一篇用 Github Action 部屬的文章
Next
設計模式筆記—Command Pattern