問題
ディスプレイが接続してあるRaspberryPiに対してUbuntuからリモート接続してみたところ、ディスプレイが同期されなかった。つまり、RaspberryPiに接続されているディスプレイが表示しているデスクトップとは別のデスクトップに繋がってしまった。
原因
これまではRaspberryPiのVNCサーバーとしてXtightvncを用いていたのだが、Xtightvncには物理ディスプレイが用いているディスプレイ番号(0)を使用することができないという特性があり、VNCサーバーを立ち上げる際は必ず1以上のディスプレイ番号が割り当てられてしまうことが問題の原因だった。
ディスプレイ番号について
私の場合、RaspberryPiのGUI(デスクトップシステム)にはXWindowSystemを使用していた。
このXWindowSystemではデスクトップ1つ1つにデスクトップ番号が割り振られる。
ディスプレイ番号はxdpyinfo
を実行してname of display
欄を確認することによって確かめられる。
例えば、
$ xdpyinfo
name of display: localhost:0.0
...
となっていた場合localhost:(ディスプレイ番号).(スクリーン番号)
となっているため、ディスプレイ番号は0、スクリーン番号は0となる。
解決
x11vncを用いることでディスプレイ番号0に接続して、物理ディスプレイに表示されているデスクトップを操作することができた。
実行コマンドは以下の通り。
sudo apt update --fix-missing
sudo apt install xorg-dev #必要パッケージ
x11vnc --storepassword #ここでVNC接続に用いるパスワードを設定する
x11vnc -auth guess -display :0 -rfbauth /home/pi/.vnc/passwd -rfbport 5900 -forever -loop -noxdamage -repeat -shared #動作確認
sudo gedit /etc/systemd/system/x11vnc.service #デーモンファイル作成(内容は後述)
#以下デーモン起動
sudo systemctl daemon-reload
sudo systemctl enable x11vnc
sudo systemctl start x11vnc
なお、デーモンファイルの中身は以下のとおりである。
escription=x11vnc (Remote access)
After=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/x11vnc -auth guess -display :0 -rfbauth /home/pi/.vnc/passwd -rfbport 5900 -forever -loop -noxdamage -repeat -shared
ExecStop=/bin/kill -TERM $MAINPID
ExecReload=/bin/kill -HUP $MAINPID
KillMode=control-group
Restart=on-failure
[Install]
WantedBy=graphical.target
使用ツール
- Rapberry Pi 3 Model B
- x11vnc
- xorg-dev
- VNC Viewer (realVNC)
#参考文献
http://extstrg.asabiya.net/pukiwiki/index.php?vncserver%A4%CE%BB%C8%CD%D1%CA%FD%CB%A1
https://blog.asial.co.jp/842
https://ubuntuforums.org/showthread.php?t=1538189
http://mixture.dcmnjp.net/linux/ubuntu/x11vnc.html