テクニカルプア

備忘録と若干の補足

nspawn コンテナのなかで X なアプリケーションを動かす

追記:

当初の記事ではコンテナ内 qutebrowser を起動させるときに systemd-nspawn -M CONTAINER という感じのコマンドを使用していたが、これはコンテナが登録済み(machinectl list に使用したコンテナが表示される状態)では上手く動かないことがわかった。

環境変数を直打ちしないといけない面倒さはあるが machinectl shell で同様のことができるようなので、本文中は machinectl コマンドに差しかえしている。

動機

人生オワタの大冒険 みたいな Flash ゲームをたまにやりたくなる。 が、2018年にもなって手元の PC に Flash を入れたくはない。

いままでは LiveUSB かなにかで起動した GUIFlash をいれて凌いでいたが、ゲームやるためだけに PC 起動しなおすみたいなのはしたくない。

なんとかしたいなと思いチマチマ調べたり手を動かしていたものがやっとできるようになったので書く。

加えて昨今はコンテナ内で X なアプリケーションを動かすことが流行っているような印象があったので、流行にのれそうなチャンスを活かしたいという気持ちもあった。

やったこと

個人的な事情で make するときに reflector が必要。まずこれをインストールする:

# pacman -S reflector

そのあと mkosi-files/guispawn at master · nosada/mkosi-files · GitHub を手元にもってきて

# make
# make install

したあと

$ xhost +local:
$ machinectl start guispawn
$ machinectl shell -E DISPLAY=:0 -E XAUTHORITY=~/.Xauthority -E 
PULSE_SERVER=unix:/run/user/host/pulse/native gui@guispawn /usr/bin/qutebrowser

すれば Flash の動く qutebrowser があがってくる。 この qutebrowser は nspawnコンテナのなかで動くので、Flash 関連の諸々がホストに入ることもない。

ブラウザに qutebrowser を使っているのは筆者が qutebrowser のファンであるため。

nspawn へ与える設定

[Exec]
Environment=DISPLAY=:0
Environment=XAUTHORITY=~/.Xauthority
Environment=PULSE_SERVER=unix:/run/user/host/pulse/native
PrivateUsers=true
NotifyReady=true

[Files]
BindReadOnly=/tmp/.X11-unix/
BindReadOnly=/etc/resolv.conf
Bind=/run/user/1000/pulse:/run/user/host/pulse
Bind=/dev/snd
Bind=/dev/shm

[Network]
# Private=yes
# VirtualEthernet=yes

Network セクションは好みにあわせて変更する。

こんな設定を /etc/systemd/nspawn/ 下に コンテナ名.nspawn で作成してコンテナを作れば、コンテナ内で X が使え、それをホストから参照できるようになる様子。

備考

人生オワタの大冒険は tanasinn の倒しかたがわからず進捗していない。

参考