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

Hedy avatar
By Hedy
at 2017-04-30T20:59

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 以防自己手太賤。
實在太多慘痛經驗了... (現在回想起來還是很心痛)

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

--
Tags: Steam

All Comments

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

請問cs go可以兩個人一起打電腦嗎?

Wallis avatar
By Wallis
at 2017-04-30T19:03
想請教大家cs go的問題 因為技術不純熟所以想先玩玩看跟朋友一起打電腦 或是組隊她跟一隊電腦我跟一隊電腦對抗這樣 想請問要怎麼設定才可以這樣進行遊戲 感謝 - ...

無線耳麥打fps遊戲的選擇

Jacky avatar
By Jacky
at 2017-04-30T13:44
最近時間上比較空閒 想說先前都使用有線耳麥 (目前HyperX cloud 2服役中...) 看到朋友在玩絕地求生的時候用無線耳麥覺得很好用阿 可以到處跑來跑去不受線的干擾 目前鎖定 羅技的G933以及Corsair VOID Wireless RGB 想說如果在使用上玩絕地求生或是CS一些FP ...

狙擊之王怎麼能出到3代?

Aaliyah avatar
By Aaliyah
at 2017-04-30T10:31
狙擊之王(sniper ghost warrior)是一系列由波蘭ci game出產的第一人稱射擊遊戲 這公司以盛產低品質遊戲為名 最近已經出到3代了,每一代的評價都一樣慘 IGN評分 1代 5.5/10 2代 5/10 3代 5.5/10 到底它在遊戲性還是劇情有非常好的表現 讓它能出到第3集? - ...

【絕命精神病院2】3小時電影剪輯版(中字)

Elvira avatar
By Elvira
at 2017-04-30T09:35
【絕命精神病院2】3小時電影剪輯版 (全1集) - 2K60FPS無損錄製 2017/4/30開播,3小時完整版 全程以特效全開原生1440p60FPS無損錄製,帶給你最震撼的電影級享受! 所謂劇情電影(Full Movie)就是指除了劇情動畫及劇情需要之過場與流程之外的內容全部 刪減 以便讓大家更 ...

GO MISSION: SPACE TRAVEL免費領取

Hamiltion avatar
By Hamiltion
at 2017-04-30T08:42
【 遊 戲 名 稱 】:GO MISSION: SPACE TRAVEL 【限時/限量免費網址】:https://www.indiegala.com/dieyoung#giveaway 【 介紹/商店連結 】:http://store.steampowered.com/app/487270/ ...