Linux のログイン画面 (gdm) に vnc 接続する
設定ファイルほとんど弄りません。
確認環境
- 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サーバが起動する。上記コマンドで立ち上げた x11vnc
を ctrl+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 で常時立てた状態にしても良いと思いますが、誰かがログインしている状態の時は画面は真っ暗になるので、なんだこれ?となるかもしれません。
-
自分の場合は、
ps aux | grep -i wayland
して wayland 関係のプロセスがいるかどうか確認した。 ↩︎ -
WaylandEnable=false
という項目を直ぐに見つけられるはず。 ↩︎ -
sudo service gdm3 restart
など。 ↩︎ -
display 番号は一覧を出力して、適当に選びました… 環境によっては
:1
かもしれません。一覧の出力方法は https://unix.stackexchange.com/questions/17255/is-there-a-command-to-list-all-open-displays-on-a-machine 。 ↩︎
Discussion