Ubuntu Weekly Recipe

第627回 コンテナの中でもWindowsのゲームを!

この記事を読むのに必要な時間:およそ 8 分

第626回のUbuntuでもSteamのWindowsゲームを!では,SteamならUbuntu上でもWindowsゲームをプレイできる可能性が高いことを示しました。今回はSteamそのものをLXDコンテナの中に閉じ込めて実行してみましょう。

ホストをできるだけキレイに保つために

Steamのインストーラーはソースが公開されているものの,ゲーム自体はもちろんのこと,Steamクライアントやランタイムの一部はプロプライエタリなソフトウェアです。このためホスト上で実行することに抵抗があるかもしれません。また,Steam側の制約でホスト上に32bitライブラリが必要です。よってSteamそのものをコンテナに閉じ込められるとホストをクリーンに保てます※1⁠。ひとつの方法は非公式のFlatpak版パッケージを使うことです。本記事ではLXDコンテナの中で公式のSteamクライアントを,GPUアクセラレーションが動く形で実行する方法を紹介しましょう。

※1
実は最近Steam自身がコンテナ化を進めています。少なくとも最新のベータ版クライアントでは,Linuxの名前空間を利用してゲーム自身をコンテナの中で実行するような仕組みが実装されたようです

これまでにも第416回第433回第589回などで,GUIアプリケーションをLXDコンテナの中で動かす方法を紹介してきました。今回も基本的な作業は同じです。ただし今回は,LXD 4.0までに実装された諸々の機能を活用し,GPUやサウンドデバイス,ゲームコントローラーをコンテナの中から使えるようにします。

あらかじめ第521回の入門システムコンテナマネージャーLXD 3.0などを参考に,最新のLXDをインストールしておいてください。記事は3.0の頃の話ですが,4.0でもインストール部分に大きな違いはありません。一点注意すべきは,LXDのパッケージ形式はsnap版に統合されている点です。Ubuntu 20.04 LTSでもDebianパッケージ版のlxdパッケージは残っていますが,snap版への移行用のダミーパッケージとなっています。今後はsnap版を使うようにしましょう。

steamコンテナの準備

では早速steamコンテナを作ってみましょう。今回は手作業で随時設定していますが,パッケージのインストールや日本語環境の設定についてはプロファイルやcloud-initで自動化してしまうという手もあります。

コンテナの作成:
$ lxc launch ubuntu:20.04 steam
$ lxc exec steam -- sh -c \
  "apt update && apt full-upgrade -y && apt autoremove -y"

UID/GIDの設定:
$ lxc config set steam raw.idmap 'both 1000 1000'

パッケージのインストール:
$ lxc exec steam -- dpkg --add-architecture i386
$ lxc exec steam -- sh -c 'apt update && apt install -y \
  x11-apps mesa-utils libgl1-mesa-glx:i386 \
  libcanberra-gtk-module:i386 pulseaudio dbus-x11 \
  language-pack-ja fonts-noto-cjk-extra \
  fonts-noto-color-emoji'

日本語環境の設定:
$ lxc exec steam -- update-locale LANG=ja_JP.UTF-8
$ lxc exec steam -- timedatectl set-timezone Asia/Tokyo

今回は「Ubuntu 20.04 LTS」ベースのコンテナにしています。⁠UID/GIDの設定」でUID/GID 1000番のユーザー・グループがホスト上とコンテナ上で同じになるように変更しています。これはコンテナの中からホスト上のXサーバーやPulseAudioのunixドメインソケットにアクセスできるようにするためです。raw.idmapについては第479回のLXDコンテナとホストの間でファイルを共有する方法を参照してください※2⁠。

※2
LXD 4.0ではこのあたりの設定がさらに簡単になるようにshiftfsが導入されています。ただ,現時点ではまだ安定して動かないようです。

Steamクライアントをインストールするために,i386アーキテクチャーを有効化した上で,コンテナの中にグラフィックとサウンド関連のパッケージもインストールしています。ただしUbuntuのLXDコンテナなら最初からi386が有効化されているはずではあります。また日本語フォントもコンテナの中に存在しないと,日本語化したときに正しくUIを表示できません。

次にコンテナの中からホストのサウンドサーバーにアクセスできるようにしておきましょう。単にUnixドメインソケットをそのままコンテナの中に見せているだけです。

$ lxc exec steam -- sed -i "s/; enable-shm = yes/enable-shm = no/g" /etc/pulse/client.conf
$ lxc exec steam -- sh -c "echo export PULSE_SERVER=unix:/tmp/.pulse-native | tee --append /home/ubuntu/.profile"
$ lxc config device add steam pa disk source=/run/user/1000/pulse/native path=/tmp/.pulse-native

さらにコンテナからホストのXサーバーとGPUデバイスにアクセスできるようにします。

$ lxc exec steam -- usermod -aG video ubuntu
$ lxc config set steam environment.DISPLAY :0
$ lxc config device add steam xorg disk \
  source=/tmp/.X11-unix/X0 path=/tmp/.X11-unix/X0
$ lxc config device add steam mygpu gpu \
  gid=`getent group video | cut -d: -f3`

第532回のLXDのコンテナからGPUを利用するでも説明しているように,コンテナの中のデバイスのグループがrootになってしまうため,videoになるよう調整しています。さらに一行目でUbuntuコンテナの初期アカウント(ubuntu)なら最初からvideoグループに所属しているはずではあります。なお/tmp/.X11-unix/X0はグラフィカルログインして初めて作られます。ログイン画面が表示された状態でこのコンテナを起動するとうまく動きませんので注意してください。

同様の理由でコンテナの自動起動を停止しておいたほうが無難でしょう。後ほどSteamを起動するタイミングでコンテナも起動するスクリプトを作ります。

$ lxc config set steam boot.autostart false

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。