☎️

Linux のログイン画面 (gdm) に vnc 接続する

2022/02/19に公開

設定ファイルほとんど弄りません。

確認環境

  • Ubuntu 18.04, 20.04
  • gdm3
  • Gnome Desktop
  • SSH 接続がいつでも出来る

CentOS とか Fedora とか archLinux でも出来ると思うが、話を簡潔にするために、Ubuntuに限定して書く。
lightdm の場合は、ググったら上位に解決策が色々出てきたので書きません。

Ubuntuの基本的なリモートデスクトップの設定と問題点

  • Settings を開く
  • Sharing → Screen Sharing → 有効にする

これで、vncを使ってリモートでデスクトップを操作できるようになる。が、この方法で有効化したリモートデスクトップサーバは、ユーザがデスクトップからログアウトするとサーバを終了してしまう。
そのため、出先からリモートデスクトップに接続する場合は、電源を入れておくだけでなく、常にログイン状態を維持しなければならない。

結論

各パラメータは環境で異なる可能性がある。

前準備。バックエンドが X11 か Wayland か確認する[1]。もし Xwayland 等が動いているようであれば、/etc/gdm3/custom.conf を編集して、gdm3 から wayland を利用しないよう修正する[2]。その後、gdm3を再起動する[3]

Screen Sharing は有効化しておく。
ログアウトしてvncが切断されたら、SSHでリモートにログインし、以下コマンドを実行する。

sudo -u gdm x11vnc -xkb -noxrecord -noxfixes -noxdamage \
   -rfbport 5901 -display :0 -auth /run/user/121/gdm/Xauthority

ポート番号5901にvncサーバが立ち上がるので、そのポート番号に対してvncを接続すると、ログイン画面につながる。
ログイン画面でユーザにログインすると、画面は真っ暗になる。このとき、ログインは成功していてScreen Sharing で設定した方の、ユーザごとのvncサーバが起動する。上記コマンドで立ち上げた x11vncctrl+c で終了して vnc を切断し、Screen Sharing で設定した方に再度vncを接続すると、ログイン完了となる。

方針・結論に対する考え方

なぜログアウトするとvncが閉じられるのか?
1つは、そのvncサーバがログインしたユーザで動作しているから。

$ ps aux | grep vino
fai       118992  0.0  0.1 396796 37524 ?        Ssl   2月18   0:00 /usr/lib/vino/vino-server
fai      1536150  0.0  0.0  13284  2784 pts/1    S+   00:13   0:00 grep --color=auto vino

もう1つは、gdm3 がXサーバをログインユーザごとに立てるため。ログアウトしたら、ユーザのXサーバは終了する。
vncサーバは1つのXサーバに接続するので、ログインユーザのXサーバが立っていないと vncサーバは起動できないし、ユーザがログアウトすると、それXサーバに接続するvncサーバも終了する。
以下のコマンドを実行してみると、Xサーバが複数起動していることが分かる。ログイン画面はgdmによって起動されている。

$ ps aux | grep Xorg
gdm       5932  0.0  0.0 902272   984 tty1     Sl+   2月18   0:08 /usr/lib/xorg/Xorg vt1 -displayfd 3 -auth /run/user/121/gdm/Xauthority -background none -noreset -keeptty -verbose 3
buyoh     6972  0.4  0.0 962976 15320 tty2     Sl+   2月18   3:09 /usr/lib/xorg/Xorg vt2 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -background none -noreset -keeptty -verbose 3
buyoh     8283  0.0  0.0  17336  1096 pts/22   S+   00:25   0:00 grep --color=auto Xorg

ちなみにlightdmであれば、以下のようにXサーバは1つである。

$ ps aux | grep Xorg
root        1400  0.2  0.3 25406616 102856 tty7  Ssl+  2月18   3:13 /usr/lib/xorg/Xorg -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
fai      1565328  0.0  0.0  13284  2916 pts/1    S+   00:28   0:00 grep --color=auto Xorg

よって、gdm3を使っている人が、リモートデスクトップでログインを行いたいとき、gdmが立ち上げているXorgに接続するvncサーバを立てれば良い。
ただし、以下に気を付ける。

  • X authority を設定する。Xorg がどのような引数で起動しているか確認すれば良い。上記の結果を見ると、-auth /run/user/121/gdm/Xauthority となっているので、x11vncにもこの引数を渡せば良さそう。
  • 特定のユーザで起動する。今回は gdm。sudoを使って、sudo -u gdm x11vnc
  • Screen Sharing で設定した方のvncサーバと被らないport番号。大抵は5900なので、-rfbport 5901 とした。
  • ログインしたユーザのXサーバはまた別物なので、ログイン後操作ができなくなる。ログインしたら、もう1つvncサーバを立てて、ログインしたユーザのXサーバに再接続する。

以上から、以下のコマンドを錬成した[4]

sudo -u gdm x11vnc -xkb -noxrecord -noxfixes -noxdamage \
   -rfbport 5901 -display :0 -auth /run/user/121/gdm/Xauthority

この x11vnc を service で常時立てた状態にしても良いと思いますが、誰かがログインしている状態の時は画面は真っ暗になるので、なんだこれ?となるかもしれません。

脚注
  1. 自分の場合は、ps aux | grep -i wayland して wayland 関係のプロセスがいるかどうか確認した。 ↩︎

  2. WaylandEnable=false という項目を直ぐに見つけられるはず。 ↩︎

  3. sudo service gdm3 restart など。 ↩︎

  4. display 番号は一覧を出力して、適当に選びました… 環境によっては :1 かもしれません。一覧の出力方法は https://unix.stackexchange.com/questions/17255/is-there-a-command-to-list-all-open-displays-on-a-machine↩︎

Discussion