Linux 與 Steam(完):在 chroot 下裝 SteamOS - Steam

Table of Contents

chroot,顧名思義,切換至另一個新的 root 目錄,
有點像是『虛擬機』或『沙盒』的作法。
所以我們可以準備一個 SteamOS 的環境,然後直接 chroot 進去,
那就和原生的 SteamOS 系統有 87% 相像了。
畢竟能儘量使用貼近於 SteamOS 的環境來跑 Steam 是再好不過了。

chroot 提供的雖然只是很簡易的虛擬環境,
但因為操作簡便、加上提供近乎原生系統 100% 的效能,
所以很受 Linux 開發人員歡迎。

但近期的 Linux 自從引入 systemd 後,
chroot 就被 systemd-nspawn 所取代了。
敝人剛好是 systemd hater,所以就不討論 systemd-nspawn 了。
有興趣可以自行測試。應該差不多... 吧?

Debian 有提供一個名為 debootstrap 的套件可以用來方便建立 chroot 環境。
請安裝該套件、備份 /usr/sbin/debootstrap 後,修改如下:

DEF_MIRROR="http://repo.steampowered.com/steamos"
DEF_HTTPS_MIRROR="http://repo.steampowered.com/steamos"

然後進入 /usr/share/debootstrap/scripts/,
以 sid 為範本(因為 SteamOS 是 Debian Jessie Based):

ln -s sid brewmaster

然後執行:(其中的 SteamOS 是您的 CHROOT 目錄)

debootstrap --no-check-gpg --arch amd64 brewmaster SteamOS

注:Steam 系統混合了 i386 及 amd64 程式,
比如說主程式 steam 及遊戲中介面 gameoverlayui 是 32bit,
但另一個重要程式 steamwebhelper 卻是 64bit。
所以您必須準備 amd64 版的 chroot 環境。

大概稍等幾分鐘,原汁原味的 SteamOS 環境就成功建立了。
然後就能 chroot 進去 SteamOS 把玩了:
(下面指令中 $CHROOT 指的是您的 CHROOT 目錄)

chroot $CHROOT /usr/bin/env -i HOME=/root TERM=xterm PATH=/bin:/usr/bin:/sbin:/usr/sbin DISPLAY=:0 /bin/bash --login +h

另,包括 Debian、Ubuntu 及 Steam 都有提供 debootstrap 套件。
但如果您是使用其它的 Linux 發行版,
Google 一下應該可以找到很多類似的 script 可用。

chroot 並不是完美的虛擬環境,所以有些注意事項:

1. 它只是『切換至另一個 root 目錄』中,所以很多東西,
像是 Kernel、網路環境、系統參數,全都是沿用主系統。
不要在裡面亂搞一些可能會影響到主系統的東西,
像改系統參數啦、跑 iptables 啦、重建 GRUB 等等。

2. 儘量不要在裡面執行任何服務程式。
像預設會安裝的 logrotate cron rsyslog 等等,
可以的話不如移掉以免後患。

3. 雖然是在虛擬環境中,但和原生系統一樣,
非必要千萬不要用 root 執行任何程式。
chroot 的安全性老實說 不 堪 一 擊,請小心為上!

進入 chroot 後,請先新增一個使用者,如 user:

adduser user

然後使用以下指令切換至 user:

su - user

下文中會以 $USER 代表您的 user 帳號。

4. 因為 chroot 環境只是切換至新的目錄,
所以一些檔案系統的權限切過去後可能會和 chroot 環境裡的不符。
比如說,您的系統裡的 input 群組號碼和 SteamOS 的可能會不一樣,
導致 chroot 進去後,$USER 無法讀取 /dev/input/*。

如果可以,請把主系統的 /etc/passwd 及 /etc/group 複製過去,
可以少掉很多麻煩!

5. 可能是為了配合 systemd-nspawn,$CHROOT/dev/ptmx 被改成使用 link。
請修正如下,不然很多程式會抱怨找不到 tty,甚至無法啟動:
(錯誤訊息大概會類似:『Can not write log (Is /dev/pts mounted?)』)

rm -f $CHROOT/dev/ptmx
mknod -m 666 $CHROOT/dev/ptmx c 5 2
chown root:tty $CHROOT/dev/ptmx

6. 有部份系統目錄,像 proc 或 tmpfs,必須掛到 $CHROOT 裡:

mount proc $CHROOT/proc -t proc
mount /dev/pts $CHROOT/dev/pts -t devpts
mount tmpfs $CHROOT/dev/shm -t tmpfs

但在退出 chroot 環境時請記得 umount。

7. 而 steam 是極傲嬌的程式,
所以 不 要 用 bind 來掛載任何 steam 裡的目錄。
取而代之的,你可以掛在別的目錄然後用符號連結 XD

比如說:

mount -o bind steamapps $CHROOT/home/$USER/steamapps

然後進入 chroot 環境後:

ln -s $HOME/steamapps $HOME/.local/share/Steam/steamapps

8. 原始的 $CHROOT/etc/apt/sources.list 如下:

deb http://repo.steampowered.com/steamos brewmaster main contrib non-free
deb [arch=amd64,i386] http://repo.steampowered.com/steam/ precise steam

當然您可以自己再加入其它的套件庫,
如:Debian Jessie (stable) 或 Debian Stretch (testing)。
既然是虛擬環境,當然要拿來亂搞了 XD

9. 因為架構的是 64 bit 的 chroot 環境,
請用以下指令來讓系統也可以安裝 i386 套件:

dpkg --add-architecture i386

因為相容性的關係,大部份 i386 套件會使用較保守的編譯參數。
因此可以預期的,64 位元的應用程式在效能上表現會比較好。

不過 Steam 裡的遊戲大多還是 i386 就是了。

10. 您可能會想安裝的套件:

locales xauth libc6:i386 libc6-i686:i386
libssl1.0.0:i386 libva1:i386 dbus-x11 libasound2 steam
libgl1-mesa-glx libgl1-mesa-glx:i386
libgl1-mesa-dri libgl1-mesa-dri:i386
libtxc-dxtn-s2tc0 libtxc-dxtn-s2tc0:i386
nvidia-driver | libgl1-fglrx-glx | i965-va-driver

以及各個 driver 的 i386 版本函式庫。

另,請執行 dpkg-reconfigure locales 讓系統支援 zh_TW.UTF-8。

11. 就如前文所說,請以一般者用權限來跑 steam。(記得 steam 不給用 root 跑...)
請將使用者加入以下群組:

audio dip video plugdev netdev input

12. steam 在啟動時會透過 dbus 查詢某些系統及網路參數。
為了讓 chroot 環境裡的 steam 能存取主系統的 dbus,
請先在【主系統】安裝以下套件:

dbus dbus-x11

並把 sysfs 及 run/dbus 掛到 $CHROOT 裡:

mount sysfs $CHROOT/sys -t sysfs -o nodev,nosuid,noexec,ro
mount -o bind /run/dbus $CHROOT/run/dbus

否則 steam 會 segfault 然後開不起來。

另,如果突然無法進入 steam,然後吐出如下錯誤訊息:

Segmentation fault $STEAM_DEBUGGER "$STEAMROOT/$STEAMEXEPATH" "$@"

那麼重啟主系統的 dbus 服務或許就能解決問題了:

/etc/init.d/dbus restart

還有,千萬不要在 chroot 裡啟動 dbus。
在技術上雖然可行,但問題真的超級多。會出事的!

在退出 chroot 環境時請記得 umount 這些目錄。

13. 請務必保持顯示卡驅動程式和主系統的版號相同,
不然可能連 Steam 都進不去。
也就是,您可能得設法自行安裝較新版本的驅動程式...
(比如說,直接裝 Debian Stretch 版的套件?)

14. 為了讓 chroot 裡的應用程式也能存取 X,也就是若您想跑視窗程式的話
您必須設定某些參數。

首先,在主系統以 $USER 身份滙出 X 憑証:

xauth extract $CHROOT/tmp/display $DISPLAY

然後,進入 chroot 環境後,以同一 $USER 身份匯入該 X 憑証:

xauth merge /tmp/display

然後指定 DISPLAY 參數,就行了:

export DISPLAY=:0

(註:這個參數依您的系統而定。
比如說,如果您有安裝 Display Manager 的話,或許會是 :1)

15. 我習慣不用任何的 Sound Server,ALSA 對我而言就很夠用了。
但為了讓遊戲有聲音,請把 ALSA 的目錄也掛進去:

mount -o bind /dev/snd $CHROOT/dev/snd

然後遊戲應該就會有聲音了... 應該啦!

一樣,在退出 chroot 環境時請記得 umount。

16. 或許有部份的遊戲還在使用 5、6 年前就不再被 Linux 支援的 OSS 聲音系統來發聲。
但預設上 debootstrap 不會建立這個 dev/dsp 檔,請手動建立:

mknod -m 660 /dev/dsp c 14 3
chown root:audio $CHROOT/dev/dsp

並在主系統中載入以下模組:

snd_pcm_oss
snd_mixer_oss

但還在用 OSS 的軟體應該很少很少了...

但若遊戲真的使用 OSS 發聲,
它可能會獨佔 /dev/dsp 導致其它也是使用 OSS 來發聲的應用程式無法出聲。
(有時會 hang 在那裡等待 /dev/dsp 回應)
這個似乎無法可想?

17. 而在 Linux 上最常見的 Sound Server 應該是 PulseAudio,
但敝人長久使用以來負面體驗太多,
(敝人使用 Linux 桌面已超過 15 年了...)
所以對 PulseAudio 有點敬謝不敏,在此就略過了。(饒了我!拜託~~)

但如果您真的沒有在用 PulseAudio,
請刪除以下檔案來讓遊戲不會試圖去呼叫 PulseAudio:

Steam/ubuntu12_32/steam-runtime/amd64/usr/lib/x86_64-linux-gnu/libpulse-simple.so.0.0.3
Steam/ubuntu12_32/steam-runtime/amd64/usr/lib/x86_64-linux-gnu/libpulse-simple.so.0
Steam/ubuntu12_32/steam-runtime/i386/usr/lib/i386-linux-gnu/libpulse-simple.so.0.0.3
Steam/ubuntu12_32/steam-runtime/i386/usr/lib/i386-linux-gnu/libpulse-simple.so.0

否則有些遊戲,如《返校》,呼叫 PulseAudio 失敗後會直接當掉無法執行。

18. 為了驅動搖桿,請把 /dev/input 及 /run/udev 目錄也掛進去:

mount -o bind /dev/input $CHROOT/dev/input
mount -o bind /run/udev $CHROOT/run/udev

並確認一下 input 這個群組的編號主系統和 chroot 環境裡的是不是相符。

搖桿相關問題可以參考前文中 SteamOS 段落。

一樣,在退出 chroot 環境時請記得 umount。

19. 您可能也希望在 Steam 裡使用中文輸入法。

我們假設您的主系統已安裝好 HIME 輸入法並已正確啟動,(喂喂!)
那麼,只要確認 steam 的 LOCALE 參數和 *啟動 HIME 時* 的 LOCALE 參數一樣,
(這可能是 HIME 的限制...)
然後設定好 XMODIFIERS 環境變數即可。例:

LC_ALL=zh_TW.UTF-8 XMODIFIERS=@im=hime steam

根據個人實測,Steam 只有在 Big Picture 介面下的輸入欄位有支援輸入法,
且只支援 XIM 的 ROOT 模式。所以也不是任何地方都叫得出 HIME 就是了。

但因為不是用 SteamOS 的 steamcompmgr 當 Window Manager,
所以輸入法視窗應該可以正常顯示出來。用起來應該有比較順手一點點。

另,或許有部份遊戲中可以打字,
所以您可能想在系統裡安裝完整的 HIME 套件及設定完整的輸入法環境變數,
然後祈禱這個遊戲能至少支援 XIM 輸入法...
但目前敝人手上的遊戲都無此需求,所以無從測試起。Sorry...

20. steam 在啟動後,於系統工具列上出現的圖示是白色系的。
您可能改用原本的藍色系圖示:

cd /usr/share/pixmaps
rm steam_tray_mono.png
ln -s steam.png steam_tray_mono.png

或,把原有藍色系圖示稍加修改成小一點點:(需安裝 imagemagick 套件)

cd /usr/share/pixmaps
convert steam.png -geometry 40x40 -background none -gravity center -extent 48x48 steam_tray_mono.png

21. 和 Windows 版 Steam 類似的,Linux 版的 Steam 也有字型太小的問題。
然後也和 Windows 版的類似:『無法可解』。XD

Linux 版的 Steam 雖然會透過 fontconfig 來抓字型,
但它基本上不會理會 fontconfig 的設定。
(fontconfig 可以設定縮放字型或是設定最小字體等等,但對 Steam 無效)
所以唯一的不完美解決方案,就是和 Wine 一樣,
改 Steam 所使用的 skin 的字型大小了...

22. 而系統工具列上的 Steam 圖示上選單的字型大小則是視使用者 GTK2+ 的設定。
可修改 ~/.gtkrc-2.0 來設定它的字型及大小,比如說:

gtk-font-name = "Noto Sans T Chinese Medium 20"

23. 在進行遊戲其間,Steam 似乎會關閉 X 的休眠功能。
也就是,只要 Steam 的遊戲開著,螢幕就不會進入省電模式。

這大概是因為 X 只會根據鍵盤滑鼠的動作來決定是否啟用休眠,
但『搖桿』卻不在它的偵測範圍內。

註:您可以用 xinput --list 確認一下,應該沒看到搖桿列在裡面

也就是,如果在使用搖桿玩遊戲時,因為鍵盤滑鼠長時間無動作,
所以 X 可能會進入休眠模式,然後擅自把螢幕給關了,
如果這時正當遊戲的緊要關頭,螢幕卻自己暗掉,玩家真的會抓狂。
所以 Steam 就把這個功能關掉了。XD

所以,如果要長時間離開電腦,
請先關閉遊戲,或手動關閉螢幕電源... orz

注:SteamOS 是在 steamos-session 裡把 dpms 關掉,然後自行進行電源管理。
但目前還我找不到 Steam 本身在哪裡把 dpms 關掉的...

用 chroot 環境來跑 SteamOS 主要是希望 Steam 的運作環境能越貼進 SteamOS 越好,
但打造 chroot 環境可真的不是普通的累。更精確得說,根本是恐怖大工程。
可是以實際運行結果來看,和用 Debian 直接跑 Steam 其實也沒有差很多啦!
(大概是因為 SteamOS 本來就是 Debian Based,環境沒有差異太大)
也就是... 根本在白做工 XDDDD

如果您是別的 Linux 發行版,如 ArchLinux 或 openSUSE,可能才會對這個比較有興趣。
但問題可能會卡在:如何在這個 chroot 環境裡安裝同版本的顯示卡驅動程式?XD

注:若想手動編譯驅動模組,Debian 有提供一個方便的輔助套件 module-assistant。
若有這類需求可以研究看看!

不過,這個 chroot 環境只要能成功建立起來,
您就可以方便得備份、複製、搬移、胡搞瞎搞這個 chroot 環境,
真的不行就還原或打掉重練即可。其實還是很方便的!

【注意】:在刪除 chroot 環境前,請務必確認還有沒有什麼目錄還掛在裡面,
若有什麼重要資料不小心也跟著一起被刪除掉,事情就大條了。
建議寫個 script 以防自己手太賤。
實在太多慘痛經驗了... (現在回想起來還是很心痛)

--
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

--

All Comments

Necoo avatarNecoo2017-05-04
有沒有預計出 steam + bumblebeed 的流程 ?
Adele avatarAdele2017-05-09
快推免得被人發現我看不懂
Tracy avatarTracy2017-05-13
先推再看
Eden avatarEden2017-05-16
這是愛
Valerie avatarValerie2017-05-19
推 XD
Dinah avatarDinah2017-05-23
Connor avatarConnor2017-05-25
真愛給推 你steam這套遊戲玩得真深入
Madame avatarMadame2017-05-27
way too hardcore QwQ
Cara avatarCara2017-05-31
真的是要對環境分離超有執念才會想要這樣玩
Liam avatarLiam2017-06-04
被朋友的朋友推薦來看這系列的文章。
Steve avatarSteve2017-06-08
反正我Arch Linux直上steam,除了輸入法無解外其他都還
好,大部分都是卡顯示驅動(媽的AMD閉源可以讓Xorg版本
新一點嗎?),所以畫面不能開太強,CSGO倒是爽爽打就是
John avatarJohn2017-06-12
是說現在Lib也沒什麼問題,在archlinux下steam有分nati
ve跟runtime,跑runtime就是拿steam自己提供的Lib跑,
所以也無關系統Lib
Gilbert avatarGilbert2017-06-14
我絕對不會跟你說我Linux裝N卡驅動花了兩天才成功
Rae avatarRae2017-06-15
bump
Zora avatarZora2017-06-16
真的,這是真愛啊...
Tristan Cohan avatarTristan Cohan2017-06-17
推 XDD
Regina avatarRegina2017-06-21
Archlinux + nvidia-dkms 用好一陣子都 ok 的
Dinah avatarDinah2017-06-23
不過以前好像有遇過 32 -> 64 的套件轉換期
那段時間裝起來超痛苦
Belly avatarBelly2017-06-25
是 T 長輩!!!!! \粉絲出沒/
Freda avatarFreda2017-06-29
Bennie avatarBennie2017-07-04
Ophelia avatarOphelia2017-07-06
我媽問我為什麼跪著看電腦