[心得] Linux 與 Steam(完):在 chroot 下裝 SteamOS

看板Steam作者 (小四)時間7年前 (2017/04/30 20:59), 7年前編輯推噓18(18010)
留言28則, 18人參與, 最新討論串1/1
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 以防自己手太賤。 實在太多慘痛經驗了... (現在回想起來還是很心痛) -- 時間並不能治療我心中的疼痛 南方的春天說什麼也溫暖不了我冰冷的血 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.34.18.3 ※ 文章網址: https://www.ptt.cc/bbs/Steam/M.1493557185.A.4D2.html

04/30 21:10, , 1F
有沒有預計出 steam + bumblebeed 的流程 ?
04/30 21:10, 1F
我的 NB 只是 intel 晶片。幫不上忙,Sorry... ※ 編輯: Tetralet (1.34.18.3), 04/30/2017 21:53:26

04/30 22:16, , 2F
快推免得被人發現我看不懂
04/30 22:16, 2F

04/30 22:36, , 3F
先推再看
04/30 22:36, 3F

04/30 23:19, , 4F
這是愛
04/30 23:19, 4F

05/01 00:05, , 5F
推 XD
05/01 00:05, 5F

05/01 00:14, , 6F
05/01 00:14, 6F

05/01 00:17, , 7F
真愛給推 你steam這套遊戲玩得真深入
05/01 00:17, 7F

05/01 02:05, , 8F
way too hardcore QwQ
05/01 02:05, 8F

05/01 02:06, , 9F
真的是要對環境分離超有執念才會想要這樣玩
05/01 02:06, 9F

05/01 05:06, , 10F
被朋友的朋友推薦來看這系列的文章。
05/01 05:06, 10F

05/01 07:50, , 11F
反正我Arch Linux直上steam,除了輸入法無解外其他都還
05/01 07:50, 11F

05/01 07:50, , 12F
好,大部分都是卡顯示驅動(媽的AMD閉源可以讓Xorg版本
05/01 07:50, 12F

05/01 07:50, , 13F
新一點嗎?),所以畫面不能開太強,CSGO倒是爽爽打就是
05/01 07:50, 13F

05/01 07:50, , 14F
05/01 07:50, 14F

05/01 07:54, , 15F
是說現在Lib也沒什麼問題,在archlinux下steam有分nati
05/01 07:54, 15F

05/01 07:54, , 16F
ve跟runtime,跑runtime就是拿steam自己提供的Lib跑,
05/01 07:54, 16F

05/01 07:54, , 17F
所以也無關系統Lib
05/01 07:54, 17F

05/01 10:27, , 18F
我絕對不會跟你說我Linux裝N卡驅動花了兩天才成功
05/01 10:27, 18F

05/01 11:20, , 19F
bump
05/01 11:20, 19F

05/01 12:23, , 20F
真的,這是真愛啊...
05/01 12:23, 20F

05/01 19:22, , 21F
推 XDD
05/01 19:22, 21F

05/02 05:04, , 22F
Archlinux + nvidia-dkms 用好一陣子都 ok 的
05/02 05:04, 22F

05/02 05:06, , 23F
不過以前好像有遇過 32 -> 64 的套件轉換期
05/02 05:06, 23F

05/02 05:06, , 24F
那段時間裝起來超痛苦
05/02 05:06, 24F

05/02 23:00, , 25F
是 T 長輩!!!!! \粉絲出沒/
05/02 23:00, 25F

05/03 08:07, , 26F
05/03 08:07, 26F

05/03 10:53, , 27F
05/03 10:53, 27F

05/06 08:19, , 28F
我媽問我為什麼跪著看電腦
05/06 08:19, 28F
文章代碼(AID): #1P1T_1JI (Steam)