nspawn コンテナのなかで X なアプリケーションを動かす
追記:
当初の記事ではコンテナ内 qutebrowser を起動させるときに systemd-nspawn -M CONTAINER
という感じのコマンドを使用していたが、これはコンテナが登録済み(machinectl list
に使用したコンテナが表示される状態)では上手く動かないことがわかった。
環境変数を直打ちしないといけない面倒さはあるが machinectl shell
で同様のことができるようなので、本文中は machinectl
コマンドに差しかえしている。
動機
人生オワタの大冒険 みたいな Flash ゲームをたまにやりたくなる。 が、2018年にもなって手元の PC に Flash を入れたくはない。
いままでは LiveUSB かなにかで起動した GUI に Flash をいれて凌いでいたが、ゲームやるためだけに 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 の倒しかたがわからず進捗していない。