Messages in cipher reflected in the looking glass
[ Yasuhiro Fujitsuki's Weblog ]
http://blogs.sun.com/thaniwa/date/20080116 2008年 1月 16日 水曜日

(JA) xrdp 0.4.0

http://xrdp.sourceforge.net/
で開発されている xrdp というソフトウェアがあります。
以前、このブログで紹介した事のある rdesktop は Windows Terminal Server に接続するためのソフトウェアですが、 xrdp は linux を Terminal Server 化してしまうソフトウェアです。 (xrdp は rdesktop や vnc などの機能を内部で利用しているそうです。)
Linux や Solaris などの X-Window システムでは、 他のマシンに Xのアプリケーションを転送することなどは簡単なので、 用途は少なそうですが、xrdp を使うことにより、RDP でアクセス可能になるため、 Windows XP などのターミナルサーバ接続を利用して Linux に接続が行えるようになります。
っと、これがうれしいかどうかわかりませんが、せっかくなので試してみました。
linux用なんですけど、無謀にも Solaris Express 動かしてみようと思い、 中を除くと、autoconfを利用していないようで、Makefileしかありません。 Makefile を見ると、linux用に作り込んでいるので、Solaris用に改変が必要でした。 大まかに書くと、

  • 全部のMakefile内の make を gmake に変更、install を/usr/ucb/install に変更。
  • libxrdp/Makefile の LIBS = -ldl の -ldl を削除。
  • sesman/Makefile の DEFINES に -D_POSIX_PTHREAD_SEMANTICS を追加。LDFLAGS に -lsocket を追加。
  • sesman/libscp/Makefile の LDFLAGS の -lpthread を削除。
  • sesman/tools/Makefile の LDFLAGS に -lsocketを追加。

その後、下記の通り、環境変数をセットし、gmake を実行。

# setenv PATH $PATH":/usr/sfw/bin"
# setenv LD_LIBRARY_PATH /usr/lib:/usr/ccs/lib:/usr/sfw/lib
# setenv LD /usr/sfw/bin/gld
#
# gmake 
# gmake install

これでとりあえずビルドはなんとかなりました。 ただ、本当にこの変更が正しいのか自信はまったくありません(笑。

一応、インストールされたので、

# /usr/local/xrdp/xrdp_control.sh start

を実行して daemon を起動しようとしましたが、動きません。 中身を見てみると、一行めが #!/bin/sh になってます。 Linux の場合、sh = bash だったりするので、 #!/bin/bash に変更しました。
それ以外に、grep を利用してプロセスの存在を確認する部分があるのですが、 これも Solaris では動かないので変更しました。

  #ps u --noheading -C $XRDP | grep -q -i $XRDP
  /usr/ucb/ps auc | ggrep -v xrdp_control.sh | ggrep -q -i $XRDP

  #ps u --noheading -C $SESMAN | grep -q -i $SESMAN
  /usr/ucb/ps auc | ggrep -q -i $SESMAN

これでなんとか、起動しました。 後は rdesktop などで接続したのですが、デスクトップが英語になってしまいます。 この制御は /usr/local/xrdp/startwm.sh に書いてあります。 一応、そのままでも動きますが、先頭は #!/bin/bash に変更。 あと、LANG を日本語に変更し、gnome-session を dtlogin の実行する Xsession.jds に変更しました。こうすると ATOK の起動も全部やってくれるので楽ちんです。^-^;

export LANG=ja_JP.UTF-8

# gnome
which gnome-session
if [ $? -eq 0 ]; then
  #gnome-session
  /usr/dt/config/Xsession.jds
  exit 0
fi

これで起動してみると動きますが、Solaris Expressではなんとか動いているという感じです。不安定だったり謎の挙動もあります…。
本当はソースをちゃんと確かめないといけないのでしょうが、 今回は Makefile を適当に改変^-^;しただけなので、当然と言えば当然かもしれません。
あと、キーボードが英語キーボードの配列になってます…。
それで、
http://xrdp.sourceforge.net/documents/keymap/newkeymap.html
を見てみると、xrdp 0.4.0 では外部 keymap ファイルには対応しておらず、 内部のキーマップを参照しているとのこと。 ちょっとソースコードを調べて見たところ、xrdp/lang.c が該当するようです。
中身を見てみると、en_US, Italy, en_UK, Portuguese(Brazil), German, French と書いてあります。 ここをイジれば、なんちゃって日本語対応もできそうです。 適当にイジってみて、何となく日本語キーボードを認識するようになりました。

0.5.0では外部キーマップに対応する予定らしいので、もうちょっとまともになっていくのかもしれません。

ということで、全部パッチにしてみました。


# gpatch -p0 < xrdp-0.4.0-ja.gdiff

という感じで当ててください。 あとは上記の通り、gmake, gmake install (linuxの場合は patch, make, make install) でインストールすれば完了です。
xrdp-0.4.0-ja.gdiff は Linux でも使えると思います。

(追記 : 2008/01/23)
Solaris Express 用パッチ( xrdp-0.4.0-sxce.gdiff )に sesman/env.c に対するパッチを追加しています。
コメントアウトした部分がどうも Segmentation Fault を引き起こすみたいです。 その前に pw_shell 変数の値を取得する部分があるのですが、 ここで値がうまく取れていないみたいなので、 セットしないようにしました。

        g_clearenv();
        //g_setenv("SHELL", pw_shell, 1);
        g_setenv("PATH", "/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin", 1);
        g_setenv("USER", username, 1);
        g_sprintf(text, "%d", uid);

rdesktopでxrdpサーバに接続したところ(ログイン画面)



Solaris Express にログインしたところ (gnome)