はじめに
研究室の共有サーバをUbuntu 18にアップデートしましたが,VNCによる画面共有が使えないことに気づきました.調べてみるとディスプレイマネージャがLightDMからGDMに戻ったことで,x11vncが使えなくなったことが原因のようです.
Ubuntu 18の画面共有はVinoを使っており,ログインしないとアクセスできません.つまり,常にログインしっぱなしにしておかないと駄目で,再起動したら現場に行くしかなくなります.
解決策
解決策はいろいろあります.
- GDMを消してLightDMを使う →共有サーバなので変えにくい……
- x11vncだけを使う →ログインすると真っ暗に
- 他のVNCサーバを使う →TigerVNCを使ってみたがうまく動作せず
- そもそも画面共有を使わない →Xのフォワーディングだけで頑張るのはちょっとキツい
- x11vncとvinoを共存させる →面倒だけどこれならできそう……
x11vncとvinoを共存させる
結局,これに行き着きました.ログイン画面にいるときはTCP5901でx11vncに接続して,ログイン後にTCP5900でvinoに接続し直します.
vinoを有効にする
シンプルにvinoをインストールして,GUIで有効にするだけです.
クライアントがmacやWindowsの場合は,暗号化を解除する必要があるので,dconf-editorを入れておきましょう.
dconf-editorを開いたら,org -> gnome -> desktop -> remote-access
の中にあるrequire-encryption
をfalseにしておきます.
sudo apt install vino dconf-editor
GUIで設定できない(デスクトップにアクセスできない)場合……
dconfコマンドで設定すればGUIにアクセス出来ない状態でも設定できます.
まずはネットワーク接続のUUIDを確認して……
$ nmcli connection show
NAME UUID TYPE DEVICE
docker0 xxxxxxxxxxxxxxxxxxxxxxxxxx bridge docker0
有線接続 1 yyyyyyyyyyyyyyyyyyyyyyyyyy ethernet enp0s31f6
dconf writeでvinoを有効にしたいコネクションを指定します.今回はEthernetを指定したいので,後者のUUIDを指定します.
dconf write /org/gnome/settings-daemon/plugins/sharing/vino-server/enabled-connections "['yyyyyyyyyyyyyyyyyyyyyyyyyy']"
dconf readで設定が確認できます.
$ dconf read /org/gnome/settings-daemon/plugins/sharing/vino-server/enabled-connections
['yyyyyyyyyyyyyyyyyyyyyyyyyy']
x11vncを有効にする
続いて,x11vncをインストールします.
apt-get install x11vnc
x11vncのパスワードを設定します.
パスを指定しない場合,パスワードのファイルは /home/<user>/.vnc/passwd
に保存されます.
x11vnc -storepasswd
起動時にx11vncが上がるようにする
VNCをサービスとして取り扱うため,x11vnc.service
を作成します.
5900ポートはvinoが使っているため,5901を使います.
/etc/systemd/system/x11vnc.service
を以下のように編集します.
[Unit]
Description=x11vnc (Remote access)
After=multi-user.target
[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -auth /run/user/<UID>/gdm/Xauthority -display :0 -rfbauth /home/<user>/.vnc/passwd -rfbport 5901 -forever -loop -noxdamage -repeat -shared
[Install]
WantedBy=multi-user.target
<UID>
は,ps -auxw | grep Xauth
で確認できます.以下のように,Xauthority
のフルパスがわかればOKです.この例だと1001になります.
たぶん/run/user/<UID>/gdm/Xauthority
が2つ以上出てくると思うので,もし接続できなければ別を試すと動くかもしれません.(rootで固定だと思っていましたがそうではないっぽい)
$ ps -auxw | grep Xauth
root 19522 0.3 0.2 381404 71100 tty2 Sl+ 14:17 1:41 /usr/lib/xorg/Xorg vt2 -displayfd 3 -auth /run/user/1001/gdm/Xauthority -background none -noreset -keeptty -verbose 3
最後に以下を実行して,サービスが動いているか確認します.
$ sudo systemctl daemon-reload
$ sudo systemctl enable x11vnc
$ sudo systemctl start x11vnc
$ sudo systemctl status x11vnc
● x11vnc.service - x11vnc (Remote access)
Loaded: loaded (/etc/systemd/system/x11vnc.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-05-11 18:27:11 JST; 2 weeks 3 days ago
Main PID: 2144 (x11vnc)
Tasks: 2 (limit: 4915)
CGroup: /system.slice/x11vnc.service
├─2144 /usr/bin/x11vnc -auth /run/user/1001/gdm/Xauthority -display :0 -rfbauth /home/ryorsk/.vnc/passwd -rfbport 5901 -forever -loop -noxdamage -repeat -shared
└─2184 /usr/bin/x11vnc -auth /run/user/1001/gdm/Xauthority -display :0 -rfbauth /home/ryorsk/.vnc/passwd -rfbport 5901 -forever -loop -noxdamage -repeat -shared
あとは,vnc://<addr>:5901
に接続してログインし,vnc://<addr>:5900
に接続しなおせばOKです.少し面倒ですがこの作業が必要になるのは再起動後くらいなので我慢します.ちなみに上記の作業はCUI環境のみで完結するので,万が一設定し忘れてサーバルームに放り込んでしまっても大丈夫です.
参考
http://fx-kirin.com/ubuntu/ubuntu-vnc-server/
https://freefielder.jp/blog/2015/10/ubuntu-vnc-server-on-startup.html
https://qiita.com/lin_noob/items/afadb3a8a0897e4be909#7vncx11vncサーバのインストール