把 Steam Deck 調到適合做部分工作
作者:gugod 發佈於: ,更新於: #SteamDeckSteam Deck 的桌面模式基本上就是個 KDE Plasma 界面,拿來做不少工作很是夠用。
本文描述的幾項重點爲:
- 建立工作專用帳號
work
。 - 以
work
身份而安裝distrobox
並開設虛擬機。 - 調整虛擬機內外環境變數,使 GUI 程式也可顯示在桌面環境上,並能與桌面環境的 Fcitx 輸入法框架互通。
粗略想法
基本上直接使用 Steam OS 的「桌面模式」。在不做大幅度修改的前提之下,就可以完成不少工作事項。
在切換到桌面模式之後,右搖桿可當滑鼠來使用。R2 對應到滑鼠左鍵,L2 對應到滑鼠右鍵(注意:左右相反)。外出時接個好打的鍵盤,就可以進行不少文字工作。只是,一直低頭看小螢幕實在傷頸酸肩,最好還是準備個能將機器墊高一些的支架或站台,
這 Steam OS 提供的桌面模式有以下幾點不那麼容易克服的限制:
- 透過機器上左手邊的 "Steam" 按鈕進入桌面模式時,相當於登入
deck
這個帳號,並且不必輸入密碼就可以登入。 deck
帳號是wheel
管理員群組的一員,而且 無法 爲其設定登入密碼。- 系統用目錄全部爲唯讀的。在不透過指令修改檔案系統設定的前提之下,使用者只能自由修改 /home 以下目錄。
- 軟體安裝固定使用 flatpak 架構。只能安裝在 flathub 上登記有案的軟體套件。不過,可以自行添加任意 flathub 目錄站,。
- 系統更新後,系統用的目錄內容會全面被換掉。任何能把唯讀目錄區改掉的手法所造成的變更都活不過系統更新。
由於我還是會把 Steam Deck 拿來玩遊戲,所以基本上不會去試着突破以上這幾個限制,也不會嘗試去重新安裝成慣用的 Linux。附帶一提, 有人成功在 Steam Deck 上裝了 Windows,姑且算是個選項。
在不破壞前述幾項限制的前提之下,基本上能有的選項是:
- 只用 flathub 上現有的軟體,看能做到什麼地步。
- 跑虛擬機,直接在其內部建構整套工作站環境。
- 以上兩者的混合。
以軟體開發爲目的話,大致上會需要
- 文字編輯器 (Emacs, vim, ......)
- 程式碼編譯器 (clang, rustc, perl, ruby, ......)
- 諸多函式庫,隨時要能安裝與更新
- 能測試編譯結果的執行環境
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
建好之後可用 sudo
或 su
來變身:
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
。有些程式不一定需要 LANG
爲 zh_TW.UTF-8
,只要是某個有效的值(有對應到存在於系統上的 locale
資料),設定爲 en_US.UTF-8
或許也可以。