web-dev-qa-db-ja.com

Ubuntu 18.04 LTS x11vncは機能しなくなりました

最近、kvm/qemuの新しいバージョンが必要になったため、Ubuntu 16.04 LTSから18.04 LTSに変更しました。

16.04では、「コミュニティヘルプWiki」の指示に従うことで、x11vncサービス(デーモン)を簡単に実行できました。 https://help.ubuntu.com/community/VNC/Servers

これには、x11vncデーモンサービスをセットアップするために必要なスクリプトがあります。これにより、最初にローカルにログインしなくても、マシンにリモートでログインできます。マシンをサーバーとして実行し、地下に配置し、ローカルではなくVNCを介して常にアクセスするため、これが必要です。

最初は、「Community Help Wiki」の指示どおりに「[環境変数]でsystemdを介してx11vncを自動的に起動する(Vivid +)」というsystemctlスクリプトを追加する以外、18.04のクリーンインストールを行いませんでした。

これが機能しなくなったことがわかったので、検索に基づいて次のことを行いました。

  1. このスクリプトで/etc/gdm3/custom.confを編集し、WaylandEnable=falseを設定して、「Wayland」ディスプレイマネージャーを無効にしました。

    [daemon]
    # Uncoment the line below to force the login screen to use Xorg
    #WaylandEnable=false
    WaylandEnable=false  <--- HERE
    
  2. 18.04のように、/lib/systemd/system/x11vnc.service ExecStartコマンドを別のxauthディレクティブを使用するように変更し、$HOME/.Xauthorityディレクティブを介して検出できる自動生成された-xauth guestファイルがないように見えます。

    から:

    ExecStart=/usr/bin/x11vnc -auth guess -forever -loop -noxdamage -repeat -rfbauth /home/USERNAME/.vnc/passwd -rfbport 5900 -shared
    

    に:

     ExecStart=/usr/bin/x11vnc -auth /run/user/120/gdm/Xauthority -forever -loop -noxdamage -repeat -rfbauth /home/USERNAME/.vnc/passwd -rfbport 5920 -shared
    

Xauthorityでの読み取りとテストに基づいてこれを行いました。これは、.Xauthorityトークンの場所が$XAUTHORITY環境変数を介して指定されることを示しています。

この値を見つけるには、次の「find」コマンドを実行して、XAUTHORITY環境変数が定義されているプロセスを見つけます。

注:これは、Linuxの/proc/<procid>/environファイル構造を使用してプロセス環境変数を検索し、

cd /proc
Sudo find . -maxdepth 1 -type d -exec sh -c "(test -f '{}'/environ && cat '{}'/environ | tr '\0' '\n' | grep XAUTHORITY= )" \;

これにより、2つの異なる結果が返されました。

  • XAUTHORITY=/run/user/120/gdm/Xauthority
  • XAUTHORITY=/run/user/1000/gdm/Xauthority

次に、以下を使用して、対応するプロセスIDを見つけました。

Sudo find . -maxdepth 1 -type d -exec sh -c "(test -f '{}'/environ && grep -aH XAUTHORITY= '{}'/environ )" \;

これらに対応するプロセスは次のとおりです。

240 tty1     Sl+    0:00 /usr/lib/gnome-session/gnome-session-binary --autostart /usr/share/gdm/greeter/autostart
14923 tty2     Sl+    0:00 /usr/lib/gnome-session/gnome-session-binary --session=ubuntu

これらの最初はログイングリーター画面に関連付けられているように見え、2番目はユーザーデスクトップです。

環境変数をさらにチェックすると、1つにUSER=gdmがあり、もう1つにUSER=<ME>があることがわかります。

問題は、「greeter」認証ロケーションを使用すると、パスワードを入力するように求められ、その後に黒い画面または空白の画面が表示されることです。ユーザー認証の場所を使用する場合、ディスプレイを開くことができないというエラーがステータスから返されるため、クライアント接続はまったく取得されません。

13/05/2018 16:19:14 *** XOpenDisplay failed.

したがって、xauthメカニズムの変更に巻き込まれたようです。

誰かがこれに関するガイダンスを提供できますか?

5
zebity

私は同じ問題を抱えていて、x11vncとgdmをいじくり回した後、単にlightdmに切り替えることにしました:

apt install lightdm

これにより、ディスプレイマネージャーの構成が表示されます。実行されない場合:

dpkg-reconfigure lightdm

次の構成でスーパーバイザーを介してx11vncサーバーを実行します。

$ cat /etc/supervisor/conf.d/x11vnc.conf
[program:x11vnc]
command=/usr/bin/x11vnc -xkb -safer -nopw -once -geometry 1024x768 -auth /var/run/lightdm/root/\:0 -display :0
user=root
autorestart=true

さらに、noVNCを(これもスーパーバイザー経由で)実行しているため、ブラウザーを介してデスクトップにリモートでアクセスできます。興味がある場合に備えて、構成ファイルは次のようになります。

$ cat /etc/supervisor/conf.d/novnc.conf
[program:noVNC]
command=/opt/noVNC/utils/launch.sh --vnc localhost:5900
user=root

$ cat /etc/nginx/sites-enabled/novnc
upstream vnc_proxy {
    server 127.0.0.1:6080;
}

server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    include snippets/snakeoil.conf;

    root /var/www/html;

    index index.html index.htm index.nginx-debian.html;

    server_name _;

    location / {
            auth_pam               "Secure Zone";
            auth_pam_service_name  "nginx";
            proxy_pass http://vnc_proxy/;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            keepalive_requests 10000;

            proxy_read_timeout 61s;

            proxy_buffering off;
    }
}

追加のセキュリティをラップすることもできます。

5
Uli

Ubuntu 18.04 x11vncユーザー。

ログインせずにVNCアクセスを取得できる「ハックアンサー」を次に示します。

ハッキングとは、2つのx11vncサービスを実行することを意味するためです。

1つ目はDISPLAY=:0経由のログインを許可することであり、2つ目はVNCを使用してDISPLAY=:1経由でデスクトップにアクセスすることです。

これを実現するために、次の2つのデーモンスクリプトを使用しました。

最初は:x11vnc-login.serviceログイングリーティング用

[Unit]
Description=Start x11vnc-login at startup.
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -auth /run/user/120/gdm/Xauthority -forever -loop -noxdamage -repeat -rfbauth /home/<ID>/.vnc/password -rfbport 5922 -shared -display :0
[Install]
WantedBy=multi-user.target

2番目は:x11vnc.service for desktop

[Unit]
Description=Start x11vnc at startup.
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -auth /run/user/1000/gdm/Xauthority -forever -loop -noxdamage -repeat -rfbauth /home/<ID>/.vnc/password -rfbport 5920 -shared -display :0
[Install]
WantedBy=multi-user.target

スクリプトのインストールと有効化は、 コミュニティヘルプサイトのドキュメント に記載されています。

これは恐ろしいハックですが、適切な解決策が見つかるまで当分の間は走り続けます。

使用中、まずポート5922へのVNCセッションを開き、ログインします。ログインすると、黒い画面が表示されます。そこで、ポート5920でVNCセッションを開くと、出来上がりです。デスクトップがあります。サーバーマシンが実行されている場所に移動するよりも、私にとっては簡単です...

明らかに、ユーザーがログインしているかどうかを確認するために実行中のプロセスの予備検索を行うスクリプトが必要な場合は、既存のユーザーセクションのXAUTHORITY/DISPLAY情報を使用します(/ proc/PROCID/environから抽出)それ以外の場合は、greeter XAUTHORITY/DISPLAYを使用してソケットをgreeter画面に接続し、ユーザーのデスクトップXAUTHOURITY/DISPLAY値を使用してソケット接続を別のx11vncセッションに移動します。

少し複雑なfork/socket/file記述子プログラミングが疑われる。

他の可能性は、18.04ディスプレイマネージャーを以前の16.04のように動作させる方法があるかどうかを把握することです。

2
zebity

これを再び機能させる最も簡単な方法は、GDM3からLightDMに切り替えることです。

ちなみに、これはダウングレード/ステップバックではありません。

buntu 18.04 VNC経由でログイン画面に接続

0
Seb