サーバー : Ubuntu 16.04
X11rdp : X11RDP-o-Matic で master リポジトリをインストール
xorgxrdp : master リポジトリをインストール(https://github.com/neutrinolabs/xorgxrdp)
クライアント : Windows 10 Home 32bit
原因を確認したいのですが、以下の点がわかりません。
・Windows 10 の「リモードデスクトップ接続」のエラーログの確認方法
・xorgxrdp のエラーログの確認方法(/var/log/xrdp-sesman.log?)
・/etx/xrdp/sesman.ini の [Xorg] セクションで param4=.xorgxrdp.log をすると、ホームディレクトリ以下にログが作成されることを確認したが、プロトコルエラーの場合は不要か?
以上、ご存じの方はお教えて下さい。
また、xorgxrdpの詳細なログの出し方は、今のところ各ソースコードファイルの中で
マクロで定義されているログレベルを上げることになるでしょう。
xrdpのソースコードディレクトリで、例えば以下のようにして一括で置き換えてやるのが楽だと思います。
大量のログが出るので、ファイルを絞ってログレベルを上げて見ていくのがいいかもしれません。
find xorgxrdp -type f | xargs sed -i.bak -e 's|#define LOG_LEVEL [0-9]*|#define LOG_LEVEL 10|'
プロトコルエラーの調べ方ですが、xrdp+xorgxrdpの組み合わせで起こるとはいえ、
どちらが直接の原因なのかはまだ特定できていないため、xrdpとxorgxrdpの両方を
調べる必要があると思います。
xrdpの方は ./configure 時に --enable-xrdpdebug オプションをつけるとより詳細なログが
出力されます。
また、ターミナルを2つ開いて、xrdpとxrdp-sesmanのそれぞれをフォアグラウンドで
実行して、出力されるログを追うのもひとつの手です。この場合は、xorgxrdpのログは
xrdp-sesmanの方のターミナルに出力されます(xorgxrdpはsesmanからforkされるため)。
# xrdp -ns
# xrdp-sesman -ns
以上参考まで。
2016年7月7日木曜日 16時25分16秒 UTC+9 Akira Taniguchi:
「リモードデスクトップ接続」>「画面」>「画面の色」> "True Color (24ビット)"
としたところ、安定して接続できているようです。
自分としてはしばらくこの状況で使用したいと思っています。
申し訳ありませんが、どなたか追試と neutrinolabs/xorgxrdp への報告をお願いいたします。
英語も苦手ですし issue としてどの時点で何を報告すればよいのかさっぱりわかりません。
壁紙など広い範囲が書き換えられる場合にプロトコルエラーが再現しやすいようです。
クライアントを32bitのままにして、パフォーマンスタブの回線の設定を変えて
いくとどうなるでしょうか?xrdpは基本的にパフォーマンスタブの回線速度の
設定は影響しません(デスクトップ背景やフォントのスムージング、ドラッグ中の
ウィンドウ内容の表示などはウィンドウマネージャの管轄で手出しできないため)
が、「LAN(10Mbps以上)」とそれ以外でのみ一部動きを変えています。
ソースコードで言うと mcs_connection_type がキーワードです。
モデム mcs_connection_type=1
低速ブロードバンド mcs_connection_type=2
衛星 mcs_connection_type=3
高速ブロードバンド mcs_connection_type=4
WAN mcs_connection_type=5
LAN mcs_connection_type=6
接続品質の自動検出 mcs_connection_type=7
となっており、「LAN(10Mbps以上)」とそれ以外という言葉の通り
「接続品質の自動検出」は「LAN(10Mbps以上)」の下に表示されてはいますが、
xrdp的には「WAN(10Mbps以上, 高レイテンシ」以下の速度設定と同じになります。
これは xrdp/xrdp_encoder.c の中の xrdp_encoder_create 関数の中で
if (mm->wm->client_info->mcs_connection_type != 6) /* LAN */
{
return 0;
}
というコードがあり、6とそれ以外という判定になっているためです。
上記コードの下に
if (mm->wm->client_info->bpp < 24)
{
return 0;
}
というコードがありますが、これだと32bitと24bitは同じ扱いなので、24bitにすると
解決したという話とは合わず、この関数内の処理が問題ではないとは思っているのですが。他にも色数によって処理を変えている箇所はあるので、そこを見ていくと何か
わかるかもしれません。
こちらの手元でも検証してみます。
2016年7月8日金曜日 18時20分01秒 UTC+9 Akira Taniguchi:
不確定な情報が続きますが、バックエンドがxorgxrdpかx11rdpかによっても処理を
変えている箇所が恐らくあるので、xorgxrdpかつ32bit colorの場合のみに通る
コードがあるかというのがとりあえずのポイントですね。
自分は以下のように推測しています。
xrdp 側で 24bpp をクライアント向けに 32bpp に変換していると思われるので、その部分が怪しいと思います。
変換した結果がプロトコル上の値の範囲を超えてしまっているため、プロトコルエラーになってしまっていると考えるのが素直ではないでしょうか。
などと勝手な推測をしていますが、不具合の報告は事実のみ報告した方が良いと思います。
報告者の推測が全く関係ないとしても、全く関係ないと納得させるために調べざるを得ず、余計な時間が必要になる場合が多いです。
変換は行っていませんが、32bitのときにだけ通る処理がありました。
libxrdp/xrdp_orders.c の2334行目からを見ると、
32bitの場合は libxrdp/xrdp_bitmap32_compress.c で、
それ未満の場合は libxrdp/xrdp_bitmap_compress.c が使われます。
この32bit用のビットマップ圧縮の処理[1]に問題があると仮定して、
仮定が正しかったかどうか検証してみます。
[1] https://msdn.microsoft.com/en-us/library/cc241877.aspx
2016年7月9日土曜日 3時05分28秒 UTC+9 Akira Taniguchi:
圧縮した単位でプロトコルエラーとなっていると考えると辻褄が会うと思います。
/etc/X11/xrdp/xorg.conf では Depth=24 となっていますし、/etc/xrdp/xrdp.ini の [Session manager]セクションで xserverbpp=24 となっています。
このことから、libxrdp/xrdp_bitmap32_compress.c と libxrdp/xrdp_bitmap_compress.c の内部で、24bpp をクライアントの bpp に合わせて変換しながら圧縮していると考えて、ほぼ間違いないと思います。
24bpp について、実際は 32bpp に見せかけるだけと考えられますので 24bpp 以下の接続のみサポートとしても問題ないと思います。
bpp 毎に安定・不安定を確認すべきかもしれません。
今回の確認で 24bpp は安定していると判断して問題ないと思います。
2016年7月9日土曜日 18時13分28秒 UTC+9 meta:
再現条件は Windows の mstsc.txe で
・32bitカラーで接続
・非RemoteFXモード(接続速度でLAN以外を*選択*)で接続
じきにマージされるとは思いますが、みなさまテストしていただけると助かります。
参考までに X11RDP-RH-Matic では以下のように実行すると、対象PRのブランチ
ビルド&インストールすることができます。xorgxrdp そのものは今回の修正には
関係ないため、改めてビルドする必要はありませんが、未インストールの場合は
更に --with-xorgxrdp オプションをつけてください。
$ GH_ACCOUNT=jsorg71 GH_BRANCH=mstsc-orders-proto-error ./X11RDP-RH-Matic.sh --nox11rdp --maintainer
2016年7月7日木曜日 16時25分16秒 UTC+9 Akira Taniguchi: