把 Steam Deck 調到適合做部分工作

作者:   發佈於: ,更新於:   #SteamDeck

Steam Deck 的桌面模式基本上就是個 KDE Plasma 界面,拿來做不少工作很是夠用。

本文描述的幾項重點爲:

  1. 建立工作專用帳號 work
  2. work 身份而安裝 distrobox 並開設虛擬機。
  3. 調整虛擬機內外環境變數,使 GUI 程式也可顯示在桌面環境上,並能與桌面環境的 Fcitx 輸入法框架互通。

粗略想法

基本上直接使用 Steam OS 的「桌面模式」。在不做大幅度修改的前提之下,就可以完成不少工作事項。

在切換到桌面模式之後,右搖桿可當滑鼠來使用。R2 對應到滑鼠左鍵,L2 對應到滑鼠右鍵(注意:左右相反)。外出時接個好打的鍵盤,就可以進行不少文字工作。只是,一直低頭看小螢幕實在傷頸酸肩,最好還是準備個能將機器墊高一些的支架或站台,

這 Steam OS 提供的桌面模式有以下幾點不那麼容易克服的限制:

由於我還是會把 Steam Deck 拿來玩遊戲,所以基本上不會去試着突破以上這幾個限制,也不會嘗試去重新安裝成慣用的 Linux。附帶一提, 有人成功在 Steam Deck 上裝了 Windows,姑且算是個選項。

在不破壞前述幾項限制的前提之下,基本上能有的選項是:

  1. 只用 flathub 上現有的軟體,看能做到什麼地步。
  2. 跑虛擬機,直接在其內部建構整套工作站環境。
  3. 以上兩者的混合。

以軟體開發爲目的話,大致上會需要

  1. 文字編輯器 (Emacs, vim, ......)
  2. 程式碼編譯器 (clang, rustc, perl, ruby, ......)
  3. 諸多函式庫,隨時要能安裝與更新
  4. 能測試編譯結果的執行環境

flathub 上的軟體能提供文字編輯器,但要安裝其他三項都不那麼容易。因此必須使用虛擬機。

目前爲止試過能較快上手的是 distrobox -- 這基本上是依賴 podman,以及現有的 container 生態系統去快速做出新的 Linux 環境。

使用 podman 的主要原因它有提供特殊版本。讓 podman 本身可以裝在 $HOME 底下,所有執行時需要的資料等等也都放在 $HOME 底下。對於 Steam Deck 這種特殊的系統而言是十分有利的。只要能裝在 $HOME 底下,就可以活過系統更新,不必重新安裝。

以 distrobox 所準備出來的虛擬機有個不錯的特性:可以將任意目錄指定爲虛擬機內的家目錄,並且以 bind mount 方式讓內外的檔案系統直接互通。也就是說,在桌面環境下其啓動的文字編輯器也可以直接去修改 distrobox 內部的家目錄內容,只讓編譯與測試在虛擬機內完成。這需要對指令有一定的熟練度,似乎對 IDE 不太友善。但至少是個不錯的辦法。真的需要 IDE 的話,也可在虛擬機內全套裝好。

建立工作專用的帳號

建立工作用帳號的主要目的是便於區分家目錄底下的內容。讓 deck 帳號底下的內容全都是與遊戲相關的,並讓工作用帳號底下的內容全都是與工作相關的。

雖然根目錄是唯讀的,但是仍然可以透過指令或 KDE Plasma GUI 來建立其他使用者帳號,並且也能夠活過系統更新。只是,自遊戲模式切換到桌面模式時,固定是登入為 deck 帳號,無法 爲其設定登入密碼,也無法切換成其他使用者。只能開終端機出來用 su 變身成其他帳號。但這樣也就夠了。

假設工作用帳號爲 work ,那便以 deck 身份執行以下幾行指令來建立這個新帳號:

useradd -U -m work

建好之後可用 sudosu 來變身:

sudo su - work

開設工作用虛擬機

變身成爲 work 之後,首先是安裝 distrobox。依照 distrobox README.md 內的安裝說明,執行以下指令可將 distrobox 安裝到 ~/.local 底下:

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

安裝好後 distrobox 這個執行檔就會被放在 ~/.local/bin 底下。

再來是安裝 podman -- 同樣也是要安裝到 ~/.local 底下去。依照 distrbox 文件 ,使用他們提供的 install-podman 腳本就可以:

curl -s https://raw.githubusercontent.com/89luca89/distrobox/main/extras/install-podman | sh -s -- --prefix ~/.local

如此一來 podman 全體會被放在 ~/.local/podman/,而 podman 這個執行檔則是會被放在 ~/.local/podman/bin

最後是調整 PATH 變數內以便日後執行。慣例是在 ~/.profile 裡加入類似以下這一行的指令:

export PATH=~/.local/bin:~/.local/podman/bin:$PATH

最後就是實際上建出工作用虛擬機。假設要使用 alpine:latest 這個 container image,並將虛擬機命名爲 workstation,且將虛擬機內的家目錄指定爲 ~/distrobox/workstation/home 的話,就是這行指令:

distrobox create --image alpine:latest --name workstation --home ~/distrobox/workstation/home

如果不指定的話,預設家目錄就是跟 $HOME 一樣。但這樣一來虛擬機內所有程式的設定檔路徑都會跟機主 (Steam Deck) 的路徑相同。如果要開設多個虛擬機,可能會遇到設定檔或暫存檔互相衝突的問題。建議是給每個虛擬機自己一個專用的家目錄。機主家目錄 $HOME 會以 bind mount 的方式直接與虛擬機內互通。所以也不至於造成太多不便。

建好之後就可以進入虛擬機內逛逛了:

distrobox enter workstation

讓虛擬機的 GUI 程式顯示在桌面環境上

目前 Steam Deck 桌面環境是 Xorg,也就是說,其實也能加入一些調整,讓 distrobox 虛擬機內的 GUI 程式(如 Firefox)直接顯示在桌面環境上。

桌面環境:需要以 xhost 指令去讓跑在其他地方的 X client 可以在本機開視窗出來。以我的設定方式,所謂的「其他地方」是本機上的其他使用者。包括由虛擬機內開出來的 GUI 程式。

假設工作用帳號是 work ,那便在 /home/deck/.bash_profile 內加入以下幾行指令:

xhost +SI:localuser:work

alias work='sudo --preserve-env=DISPLAY su -w DISPLAY - work

依照這兩個月的使用經驗,DISPLAY 有時是 :0 有時是 :2,不是很確定爲何改變。但總之只要讓所有地方的 DISPLAY 都有正確地設定好就好。方法就是在以 sudo 變身時把目前的 DISPLAY 保留下來。

如此一來便能夠在 WezTerm 內以 work 爲切換到工作用帳號的指令。切換過去後,進入虛擬機:

distrobox enter workstation

並在虛擬機內直接執行 GUI 程式指令,例如 Firefox:

firefox &

過幾秒鐘後便可以看到 Firefox 視窗開出來了。

附帶一提,由此方法開出來的 GUI 視窗也是可以配合桌面環境上的 Fcitx 輸入法框架來輸入漢字。如果有程式對輸入法切換熱鍵沒反應,那就檢查看看 LANG 環境變數是否有設定爲 zh_TW.UTF-8。有些程式不一定需要 LANGzh_TW.UTF-8,只要是某個有效的值(有對應到存在於系統上的 locale 資料),設定爲 en_US.UTF-8 或許也可以。