highlight.xcode

ラベル VNC の投稿を表示しています。 すべての投稿を表示
ラベル VNC の投稿を表示しています。 すべての投稿を表示

2018年11月11日日曜日

Debian stretch もしかして腐ってる? 代理マシン編 その2 (x11vnc)



以前TOSHIBA dynabook EX/35LWHKS」というラップトップ PC に、Debian stretch をインストールしたんですが、ラップトップ PC を広げっぱなしにしておくのも邪魔なので、VNC サーバーをインストールし、メイン PC から遠隔操作する事にしました。

普通に Linux に VNC サーバーをインストールすると、VNC クライアントから接続する度に新たなセッションが作られる様になります。それはそれで Linux らしい仕様で良いんですが、今回は既存のセッションを利用する形で運用できないかと思い、色々調べたてみました。どうやら可能みたいです。

x11vnc という VNC サーバーを使用すると、既存のセッションに対して接続出来る様です。x11vnc の基本的な情報は「DebianでX11VNCをインストールする – OSS情報システム研究会」を参考にさせてもらいました。


x11vnc をインストール、パスワードの設定、起動してみます。
# aptitude install x11vnc
(省略)

# x11vnc -storepasswd

Enter VNC password:[パスワード]
Verify password:[パスワード]
Write password to /root/.vnc/passwd? [y]/n
Password written to: /root/.vnc/passwd

# x11vnc -rfbauth /root/.vnc/passwd
VNC クライアントとしては Windows 版 UltraVNC Viewer を使用し、色々試してみました。

が…、またしても腐っていた訳です…。
Debian stretch の x11vnc が…。

イントールされたバージョンは "0.9.13-2" でした。主な問題は次の様なものです。
  1. たまにクラッシュする。
  2. 一部のキーが無限にリピートする。
  3. Shift + TAB入力時に Shift が無視され、TAB のみ入力される。
他にも問題は有るかもしれません…。


取り合えずネットで検索した所「新しいバージョンを使え」という事の様で…。 ご丁寧にスクリプトも公開されていたので、それを参考に、ダウンロード、ビルドを行いました。インストールしたバージョンは "0.9.14" です。

Debian の場合、libxtst-dev、libssl-dev、libjpeg-dev が必要みたいですが、私の環境では libxtst-dev はインストール済みだったので下記では省略しています。
# aptitude install libssl-dev
(省略)
# aptitude install libjpeg-dev
(省略)
# cd /usr/src

# wget http://x11vnc.sourceforge.net/dev/x11vnc-0.9.14-dev.tar.gz
(省略)
# gzip -dc x11vnc-0.9.14-dev.tar.gz | tar -xvf -
(省略)
# cd x11vnc-0.9.14

# ./configure --prefix=/usr/local CFLAGS='-g -O2 -fno-stack-protector -Wall'
(省略)
# make
(省略)
# make install
(省略)
# /usr/local/bin/x11vnc -auth /var/run/lightdm/root/:0 -display :0 -xkb -forever -shared -rfbport 5900 -repeat
しばらく使ってみたんですが、少なくともクラッシュする事はなくなりました。ただし、「キーの無限リピート」や「Shift + TAB が使えない」といった症状はそのままでした。


APT でのパッケージの更新を止めて置かないと、自ビルドしたバイナリを上書きされてしまいますので、このまま使い続ける場合は、x11vnc の更新を停止しておきます。

パッケージの更新停止。
# aptitude hold x11vnc
# aptitude hold x11vnc-dat
パッケージの更新停止を解除する場合。
# aptitude unhold x11vnc
# aptitude unhold x11vnc-dat


「Shift + TAB が使えない」については、解決方法が見つかったので、対処しました。
# vi /usr/share/X11/xkb/symbols/pc
変更前。
key   {  [ Tab,  ISO_Left_Tab    ]   };
変更後。
key   {  [ Tab                   ]   };
これで X の再起動、または PC の再起動で改善されるはずです。


次に、サービス化です。VNC サーバーをサービス化する事により、グラフィカルログイン画面に対しても接続可能とする方法が「debian - Creating x11vnc system service - Unix & Linux Stack Exchange」に、そのままズバリ載っていたので、これも設定します。

vnc.service ファイルを編集(作成)。
# vi /lib/systemd/system/vnc.service
vnc.service ファイルの内容。
[Unit]
Description=Start x11vnc at startup.
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/local/bin/x11vnc -auth guess -forever -loop -noxdamage -repeat -rfbauth /root/.vnc/passwd -rfbport 5900 -shared -remap Zenkaku-Zenkaku_Hankaku,Hankaku-Zenkaku_Hankaku

[Install]
WantedBy=multi-user.target
サービスの有効化、およびリロード。
sudo systemctl enable vnc.service
sudo systemctl daemon-reload
これで、PC を起動直後のグラフィカルログイン画面の状態に対し、VNC ビューワーから接続出来る様になります。

注意が必要なのは、vnc.service ファイルの内容のうち、x11vnc のオプションについては環境により調整が必要だと思います。特にキー関連のイベントの扱いが、使用する VNC ビューワーにより異なるので、思わぬ挙動をする場合もあるようです。


最後に「キーの無限リピート」の対処方、というより誤魔化し方です。

無限リピートが始まったら他のキーを押す事で、リピート自体は止められます。今の所、解決策が見つかっていないので、こんな使い方で誤魔化すしかないでしょう。

私の環境では「半角/全角」キーが 100% リピートするので、「半角/全角」キーを押したら、すぐに「Esc」を押すことでリピートを止めています。

2016年4月27日水曜日

Vine Server(OSXvnc)



以前書いた「VNC で option キーが送れない」問題は、その後も解決出来ていない。2ch やアップルサポートコミュニティにも質問してみたが、回答 0件…。ウェブ上の情報も概ね解決には至っていない…。

そんな中、「OS X の画面共有は止めて、Vine Server という VNC サーバーを使うと良い」という様な情報が在ったので、試しに使ってみた所、少なくともモディファイヤキーに関してはマトモに動作してくれた。
パッケージは testplant.com からダウンロード出来る。

ただし、例によってキーボードレイアウトが US になってしまうという問題が残った。
一応、内部的に US-Keylayout から JP-Keylayout への変換をしていてくれているので、ほとんどのキーは問題無く打てるのだが、一部のキーがおかしかった。

入力したキー 入力される文字
ˆ 6
' "
= +
@ 2
` ˜
: ;

色々検索しているうちに日本語キーボードパッチなるモノも見つかったが、いかんせんバージョンが解らないわ、古いわで役に立たなかった…。

結局、自力で改造してみる事にした。
Source Forge: Vine Server (OSXvnc)」->「web-based CVS repository viewer」->「Download GNU tarball」からソースがダウンロード出来る。
バージョンは「4.01」。
ライセンスは「GPLv2」。

早速、ダウンロードして、解凍して「OSXvnc.xcodeproj」を Xcode で開いて、ビルドしてみた。
環境は「OS X El Capitan 10.11.4」上の「Xcode 7.3」。

やはり古いソースなので最新の環境とは設定が合わないらしく「Update to recommended settings」と質問されたので、とりあえずお薦め設定にしてビルドしてみた。

一応ビルドには成功したものの、警告23個…。
早速、Windows 側から VNC で接続してみたが、「メッセージの長さが合わないよ。続ける?」みたいなメッセージが永遠と表示され、まともに使えなかった…。

結局、時間はかかったものの、この問題は解決出来た。
Vine Server(OSXvnc) の最終バージョン(4.01)は 32bit バイナリなのに、ビルド環境が 64bit なせいで、前述のお薦め設定により「Build Settings」->「Architectures」が「Standard Architectures (64-bit intel)(x86_64)」になってしまっていた。
これを「Universal (32/64-bit intel)(x86_64, i386) - S(ARCHS_STANDARD_32_64_BIT)」に変更してビルドし直した所、使えるバイナリが出来た。

さて、本番はここからなのだが…。

警告のほとんどは、キャストや型書式に関するものだったので、適当に修正した。
残る 3つは「'xxx' is deprecated: first deprecated in OS X 99.9」といったもの。
これは「'xxx' は OS X バージョン 99.9 で廃止されますよ。」という警告なので放っておくしかない…。
最適な移行方法も、警告抑制の仕方も解らないしなぁ…。

結局、「XCodeでのwarning抑制方法」を参考に、警告抑制した。

後はおかしいキーを直すだけ…。

キーイベントの処理を探す為、ソースの中を「keyboard」等で検索し、あちこち眺めてみた所、「VNCServer.m」の「handleKeyboard」がそれらしいと解った。

多分、この関数の引数が入力キーで、この関数の中から呼ばれている「sendKeyEvent」関数への引数が出力キーっぽいので、「NSLog」を仕掛けて観察。その結果と、US-Keylayout での入力方法を突き合わせて、入力と出力のズレを整理した。

入力キー 入力コード 出力文字(誤) 出力コード(誤) 出力文字(正) 出力コード(正) 結果
ˆ 0x5E 6 0x16 ˆ(6 + shift) 0X16 + shift shift が不足
' 0x27 + shift " 0x27 + shift ' 0x27 shift が余分
= 0x3D + shift + 0x18 + shift = 0x18 shift が余分
@ 0x40 2 0x13 @(2 + shift) 0x13 + shift shift が不足
` 0x60 + shift ˜ 0x32 + shift ` 0x32 shift が余分
: 0x3A ; 0x29 :(; + shift) 20x29 + shift shift が不足

結果としては「shift」が余分か、足りないか、という事だった。

こういうのはテーブルがちょっとズレてるだけとか、簡単に治りそうなもんんだけどなぁ…。
キーの定義は「kbdptr.h」に在ったが、キーとモディファイヤキーの組み合わせをどう定義しているか解らなかった…。

結局、「sendKeyEvent」関数を呼び出す直前に、「sendKeyEvent」関数への引数へ対し「shift」を足したり、引いたりする処理をぶち込んじゃった…。

次に、マウスホイールでのスクロールが異常に遅かったので、「handleMouseButtons」関数でマウスホイールの移動距離を格納している「mouseWheelDistance」変数を 4倍する処理も入れた。

あとは、クリップボードが異常な挙動をする問題も在ったのだが、これは VNC クライアント側でクリップボードの共有を止めれば問題無くなった。クリップボード共有出来た方が便利なんだけど、仕方がない…。

残るは、ログイン、ログアウト関連が対応出来てない臭いけど…。
当分これで様子を見てみようと思う。

オープンソース万歳!!!!!

2016年4月9日土曜日

VNC で option キーが送れない

Mac でウィンドウのスクリーンショットを撮ると、ウィンドウの周りに影を表示する枠が付く。これが邪魔になってきたので調べた。

ウィンドウのスクリーンショットを撮るには、「command + shift + 4」を押下し、マウスカーソルが範囲選択用の十字型になったらスペースキーを押下。これでマウスカーソルがカメラ型になるので、撮りたいウィンドウをクリックする。
これが通常の、枠が付いてしまう撮り方。

カメラ型カーソルになった後、撮りたいウィンドウをクリックする時に、option キーを押しながらクリックすると枠無しで撮れる。

が、ここで今まで見ないふりをしてきた問題が顕在化する。

現在の環境は、Mac の画面共有に対し、Windows 機から VCN ビューワで接続し、キーボード、およびマウスの操作内容を送信している状態だ。
Windows キーボードを直接 Mac に接続した場合は、Windows キーボードの Ctrl キー、Windows キー、Alt キーのそれぞれが、Mac の Contorl キー、optionキー、commandキーへと割り当てられる。
ところが、VNC 越しだと Windows キー、Alt キーのどちらも、command キーに割り当てられてしまい、option キーが押せないのである。

もちろん、VNC クライアントも疑い、何種類か試したが改善せず。
Windows キーボードが繋がった Linux 機から接続しても同じ症状なので、これはサーバー側の問題である可能性が高い。

Mac のキー割り当てを変更出来るアプリ Seil(旧 PCKeyboardHack)も試してみたが、ダメだった。
これらのアプリは、物理キーが押されたイベントと、その時に入力されるキャラクタの対応付けを変更するモノの様で、VNC 接続の様にキャラクタを送信しているであろうソフトには効かないのだ。

ググッてみても、日本語、英語ともにこの問題の報告は散見するが、解決策に辿り着く事は無かった。
VNC クライアント側のキーマッピングが変更出来れば、解決しそうではある…。