Ubuntu 22.04 LTS デスクトップマシンに x11vnc を導入しログイン画面からリモート操作する

この記事は約10分で読めます。

ここでは、Ubuntu 22.04 LTS デスクトップマシンに VNCサーバーの x11vnc を導入します。x11vncは、リモートコントロール用の追加のディスプレイを作成せず、既存のX11ディスプレイを表示することができます。そのため、他のモニターを接続しているデスクトップマシンにリモート接続しても同一の画面上でリモート操作することができるデスクトップ共有を構築することが可能になります。

今回は、ディスプレイマネージャ GDM3 の Xセッション(Ubuntu on Xorg)上で x11vnc を導入し、パスワード入力のログイン画面(login screen)、パスワード入力後のログイン中画面にデスクトップ共有で接続することを目的とします。

前回、Wake on Lan でリモートの Ubuntu デスクトップパソコンを起動することができるように環境を構築したので、今回の構築でリモートによる電源投入から、ログインパスワードの入力、とグイン中の画面操作をおこなうことができるようになります。

Ubuntu 22.04 Wake on LanでリモートのUbuntuデスクトップパソコンを起動する
Wake on Lan(WOL)は、手元のパソコンからネットワーク(おもにLAN)につながっているパソコンを遠隔で起動するテクノロジーです。...

その前に、リモートデスクトップについてすこし説明します。

 

デスクトップマシンのリモート操作は、一般的にリモートデスクトップと呼ばれるテクノロジーを利用します。リモートデスクトップを利用すると、手元のパソコンやスマートフォン、タブレットなどのデバイス(クライアント)から、ネットワークで接続された他のパソコンなどのデバイス(サーバー)のGUI(グラフィカルユーザーインターフェース)やデスクトップ環境を遠隔で操作することができます。

リモートデスクトップを実現するには、クライアントマシン、サーバーマシンのそれぞれにクライアント用、サーバー用のソフトウェア(アプリ)を導入する必要があります。クライアント側とサーバー側は同一の転送方式を利用するリモートデスクトップソフトウェアである必要があります。一般的にクライアント用ソフトウェアは複数の転送方式をサポートしている場合が多くありますが、サーバー用ソフトウェアはひとつの転送方式に限られる場合がほとんどです。

転送方式は、RFB(Remote FrameBuffer)プロトコルを使用したVNC(Virtual Network Computing)や、RDP(Remote Desktop Protocol)を使用したRDS(emote Desktop Services)などがあります。

VNCは、クロスプラットフォームなソフトウェアとして開発され、OSなどのプラットフォームの種類に依存することなくGUIの遠隔操作が可能です。また、ソースコードがGPL方式のライセンス下でオープンソースとして公開されているため、さまざまな派生ソフトがあり、自由度が高いのも特徴です。

RDSは、Windowsの画面を遠隔操作するために、マイクロソフトが開発・提供するリモートデスクトップ機能です。Windows 11 マシンには標準で導入されているので、Windowsを中心にリモートデスクトップ環境を構築する場合は便利です。ただし、Windows 11 Home ではクライアント側にはなれますが、サーバー側にはなれないので注意して下さい。

 

スポンサーリンク

Ubuntu 22.04 LTS デスクトップマシンに x11vnc を導入

Ubuntu 22.04 は、デフォルトのディスプレイサーバーに「Wayland」が採用されています。

「Wayland」では x11vnc は動かすことができないので、ディスプレイサーバーを「Xorg(X11)」にします。

『標準のディスプレイマネージャ「GDM3」では x11vnc を動かすことができないので、ディスプレイマネージャに「LightDM」を導入する』との情報もありますが、私の環境では問題なく使用することができています。

 

ディスプレイサーバーを「Xorg(X11)」に変更

使用されているディスプレイサーバーを確認します。

$ echo $XDG_SESSION_TYPE
Wayland

値が「x11」であれば、「Xorg(X11)」が使用されています。

値が「Wayland」の場合は、ディスプレイサーバーを「Xorg(X11)」に変更します。

ログイン画面でユーザーを選択したとき右下に表示される歯車アイコンから「Ubuntu on Xorg」を選択することで、ディスプレイサーバーを「Xorg(X11)」に変更することができます。

しかし、この方法ではログイン画面のセッションが「Wayland」になり、ログイン画面に対して x11vnc によるリモート操作をおこなうことができません。

必ず、次の方法でディスプレイサーバーを変更するようにして下さい。

「/etc/gdm3/custom.conf」を適当なエディタで開いて、「#WaylandEnable=false」のコメントアウトを解除し、Wayland を無効にします。

$ sudo vim /etc/gdm3/custom.conf

WaylandEnable=false

設定を反映させるために Ubuntu を再起動します。

ログインしてディスプレイサーバーを確認して下さい。

$ echo $XDG_SESSION TYPE
x11

値が「x11」であれば、無事にディスプレイサーバーが変更されています。

これで前準備が整いました。

 

x11vnc の導入

x11vnc パッケージを導入します。

$ sudo apt install x11vnc

認証用のパスワードファイルを作成します。

$ sudo x11vnc -storepasswd /etc/.vncpasswd
Enter VNC password: 
Verify password: 
Write password to /home/user/.vnc/passwd? [y]/n y
Password written to: /home/user/.vnc/passwd

パスワードを2回入力し「Write password to /home/user/.vnc/passwd? [y]/n」に「y」を入力してパスワードを保存します。

上記の例ではパスワードを「/etc/.vncpasswd」に保存していますが、別の場所に保存しても問題なく動作すると思います。「x11vnc -storepasswd」だけで実行するとホームディレクトリにパスワードファイルが作成されます。なお、別の場所に保存した場合は、後記の起動コマンドのパスワードファイル名を適宜変更して下さい。

Systemd サービス化

Ubuntu 22.04 の起動時から x11vnc を動かすために Systemd ユニットをサービスとして登録します。

ここで重要なのは、ログイン画面にアクセスするサービスと、ログイン中画面にアクセスするサービスの2つのサービスを登録します。なぜ2つのサービスが必要かというと、Xディスプレイの接続に必要な認証ファイル「Xauthority」の場所がログイン画面とログイン中画面で異なるためです。そのため、2つのサービスにより、ログイン画面とログイン中画面それぞれに x11vnc で接続できるように設定します。

ログイン画面用

ログイン画面に接続するためのサービス用ユニットファイルを作成します。

ディスプレイ番号 :0 に対してポート5901を使用します。

$ sudo vim /etc/systemd/system/x11vnc_loginscreen.service
[Unit]
Description=x11vnc_loginscreen (Remote access)
After=graphical.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -auth /run/user/125/gdm/Xauthority -display :0 -rfbauth /etc/.vncpasswd -rfbport 5901 -forever -loop -xkb -noxdamage -shared -noshm -o /var/log/x11vnc_loginscreen.log
ExecStop=/bin/kill -TERM $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
KillMode=control-group
Restart=on-failure

[Install]
WantedBy=graphical.target

「/run/user/125/gdm/Xauthority」の場所は環境により異なる場合があるかもしれません。その場合は適宜変更して下さい。また「/etc/.vncpasswd」は先ほど作成したパスワードファイルを指定して下さい。

なお、ExecStart の最後にある「-o /var/log/x11vnc_loginscreen.log」はログファイルの場所を指定していますが、ログファイルは自動で作成されないので自分で作成する必要があります。適当なエディタで空白ファイルを作成して下さい。

ログイン中画面用

ログイン中画面に接続するためのサービス用ユニットファイルを作成します。

ディスプレイ番号 :1 に対してポート5900を使用します。

$ sudo vim /etc/systemd/system/x11vnc_mainscreen.service
[Unit]
Description=x11vnc_mainscreen (Remote access)
After=graphical.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -auth /run/user/1000/gdm/Xauthority -display :1 -rfbauth /etc/.vncpasswd -rfbport 5900 -forever -loop -xkb -noxdamage -shared -repeat -noshm -o /var/log/x11vnc_mainscreen.log
ExecStop=/bin/kill -TERM $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
KillMode=control-group
Restart=on-failure

[Install]
WantedBy=graphical.target

「/run/user/1000/gdm/Xauthority」の場所は環境により異なる場合があるかもしれません。その場合は適宜変更して下さい。また「/etc/.vncpasswd」は先ほど作成したパスワードファイルを指定して下さい。

なお、ExecStart の最後にある「-o /var/log/x11vnc_mainscreen.log」はログファイルの場所を指定していますが、ログファイルは自動で作成されないので自分で作成する必要があります。適当なエディタで空白ファイルを作成して下さい。

 

サービス用ユニットファイルの作成が終了したら、サービスを有効にします。

$ sudo systemctl daemon-reload
$ sudo systemctl enable x11vnc_loginscreen
$ sudo systemctl start x11vnc_loginscreen
$ sudo systemctl enable x11vnc_mainscreen
$ sudo systemctl start x11vnc_mainscreen

 

以上で設定は完了です。

操作されるデスクトップマシンを再起動して下さい。

 

クライアント側から接続

クライアント側からの接続は、ログイン画面はポート番号5901、ログイン中画面はポート番号5900でおこないます。

任意のVNCクライアントを使用して、はじめは「192.168.1.xxx:5901」とポート番号5901へ接続します。Ubuntu 22.04 のログイン画面が表示されたらパスワードを入力しログインします。この時点でポート番号5901への接続は終了して大丈夫です。

この時点で操作される Ubuntu 22.04 デスクトップマシンはログインされているので、「192.168.1.xxx:5900」とポート番号5900へ接続します。無事に操作されるデスクトップマシンの画面がクライアント側で表示できれば全て完了です。

 

おわりに

以上で、Ubuntu 22.04 LTS デスクトップマシンに VNCサーバーの x11vnc での接続環境が構築されました。

多少つまずきかけましたが、無事に接続できて安心しました。

これで、クライアントマシンから離れずにリモートマシンの電源投入から操作までをおこなうことができ、作業効率をアップさせることができます。

 

コメント

タイトルとURLをコピーしました