Windowsをサスペンドしてレジュームした際に、VcXsrv上のリモートクライアントのウィンドウが消えてしまう問題とその回避策です。
発端
VcXsrvはWindows上のXサーバとして広く使われていると思います。私も最近Windows 10上のVirtualBoxでLinux(Fedora)を使い始めたのですが、ゲストのLinux上のXクライアントのウィンドウがホストのWindowsのウィンドウと同様に扱えるのが大変便利です。
しかし一つ問題があります。
それは、Windowsをサスペンドしてレジュームすると、Linux上のXクライアントのウィンドウが消え、そのプロセスがハングアップ状態になることです。
調査
調べてみると、VirtualBox上のXクライアントに限らず、別の物理ホスト上のXクライアントも含めて、
export DISPLAY=hostname:0.0
と指定してVcXsrvに接続すると、Windowsのサスペンドレジュームでウィンドウが消えることがわかりました。
VirtualBoxのゲストOSもhost-only networkやbridge modeなどでネットワーク経由でホストOSに接続されるわけですから、VcXsrvから見ると同じものなのでしょう。
ちなみにXサーバ側をXming(パブリックドメイン版)やCygwin/Xに替えても、仮想マシン側をWSL2に替えても同じ症状でした。WSL2についてはこのチケットで報告されている通り、少なくともWindows 10 19042.928では解決しているようです。
回避策
VcXsrvと直接つながるのがリモートクライアントでなければいいので、sshのX11 forwardingを使えば回避できます。
具体的には、WSLなどから
ssh -X hostname
で接続先のホスト(VirtualBoxでも別の物理ホストでも)に入ってXクライアントを立ち上げれば、サスペンドレジュームしても生き残ります。ただしhostnameはbridge modeではなくhost-only networkなどのアドレスにしないと、サスペンドで切れることがあります。
しかし…
別の物理ホストであれば、sshのX11 forwardingを使うのがセキュリティ的にも正しいと思います。
しかし、ゲストOSとホストOS間で使うのはCPU時間がもったいないです(貧乏症?)。
また、WSL2の場合、cygwinからsshでX11 forwardingしても、サスペンドレジュームでウィンドウが消えます。
本質的な解決策として、ネットワークが切れてもセッションを保存できるXpraを使う方法について、別記事を書きました。