xrdp v0.9.2をRaspberry Pi 3でビルドする

以前の記事でxrdpのv0.9.1のインストール手順を書きました。
xrdp v0.9.1をRaspberry Pi 3にインストールする
v0.9.2がリリースされたので改めてビルドとインストールを行ってみます。
新たにエラーが生じる箇所が増えたので修正箇所も増えました。


Raspberry Piでxrdpをビルドして使えるようにします。
xrdpとはWindowsのリモートデスクトップ接続でRaspberry Piの画面を表示させるためのプログラムです。
xrdp - an open source RDP server
”xrdp provides a graphical login to remote machines using Microsoft Remote Desktop Protocol (RDP). xrdp accepts connections from a variety of RDP clients: FreeRDP, rdesktop, NeutrinoRDP and Microsoft Remote Desktop Client (for Windows, Mac OS, iOS and Android).”
https://github.com/neutrinolabs/xrdp より
Raspberry Piがネットにつながっていれば、ネットワーク上のWindowsパソコン、アンドロイドやiPhoneから操作する事ができます。
クリップボードやパソコンのドライブの共有もできます。パソコンと簡単にファイルのやり取りができます。
Raspberry Pi上での音をパソコンから鳴らせます。

Raspbianのリポジトリ上にあるxrdpはバージョンンが古いため上記の機能は使えず実用的ではありません。
自分で最新版をビルドしてインストールします。そんなに難しい事はないので手順を紹介しておきます。

xrdpのビルド

ビルド手順はこちらにあります。
https://github.com/neutrinolabs/xrdp/wiki#building-from-sources
RASPBIAN JESSIEの場合はDebian 8とほぼ同じになります。

OSのパッケージを最新の状態にします。
sudo apt-get -y update
sudo apt-get -y upgrade
sudo reboot

今回のOSのバージョンは次になります。
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.9.24-v7+ #993 SMP Wed Apr 26 18:01:23 BST 2017 armv7l GNU/Linux

必要なライブラリをインストールします。
sudo apt-get -y install libx11-dev libxfixes-dev libssl-dev libpam0g-dev libtool libjpeg-dev flex bison gettext autoconf libxml-parser-perl libfuse-dev xsltproc libxrandr-dev python-libxml2 nasm xserver-xorg-dev fuse libmp3lame-dev

ソースコードを取得します。Downloadsディレクトリに展開します。
cd ~/Downloads
git clone https://github.com/neutrinolabs/xrdp.git
git clone  https://github.com/neutrinolabs/xorgxrdp.git

xrdpのバージョンを確認します。
cd xrdp
git tag -l
タグの一覧が表示されます。
タグでバージョンを変更できます。最新バージョンをお薦めします。バージョンの指定は次のようにします。
git checkout refs/tags/v0.9.2
このコマンドを実行しなければ最新のコードになりますが、開発中コードになるため不具合がある場合が多くなります。

サブモジュールを更新します。
git submodule init
git submodule update

ビルド条件を設定します。
./bootstrap
./configure --enable-fuse --enable-mp3lame --enable-pixman --enable-painter --disable-ipv6
sudo make -j4
sudo make install
cd ..

xorgxrdpをビルドします。
cd xorgxrdp
sudo ./bootstrap
sudo ./configure

sudo make -j4
sudo make install
cd ..
この記事公開時ではmakeがエラーで終了します。
/usr/include/xorg/dixfont.h:32:32: fatal error: X11/fonts/fontutil.h: No such file or directory
fontutil.hが無いためです。なぜこのエラーが出るのか原因はまだわかってません。
fontutil.hを手動で作成します。
/usr/include/X11/fontsフォルダにfontutil.hファイルを作ってください。
sudo touch /usr/include/X11/fonts/fontutil.h
ファイルの中身は検索して入れてください。"fontutil.h" でググって最初に出てきたページで良いでしょう。/usr/include/X11/fonts/fontutil.hをテキストエディタで編集します。
ファイルができたらsudo make -j4からやり直します。

pulseaudioのsinkモジュールを作る

リモートデスクトップで音を出すためのモジュールを作ります。
pulseaudioのバージョンを確認します。
pulseaudio --version
5.0と表示されると思います。pulseaudioのソース取得時に同じバージョンのソースを取得します。
必要なライブラリをインストールします。
sudo apt-get install -y intltool libjson0-dev libsndfile1-dev libspeex-dev libspeexdsp-dev libcap-dev
pulseaudioをビルドします。バージョン5.0のソースを取得します。
cd ~/Downloads
wget https://freedesktop.org/software/pulseaudio/releases/pulseaudio-5.0.tar.gz
tar -zxvf pulseaudio-5.0.tar.gz
cd ~/Downloads/pulseaudio-5.0
./configure
cd ~/Downloads/xrdp/sesman/chansrv/pulse
sudo sed -i 's/PULSE_DIR = \/home\/lk\/pulseaudio-1.1/PULSE_DIR = \/home\/pi\/Downloads\/pulseaudio-5.0/g' Makefile
ここではpiユーザのホームディレクトリの例を書いています。異なるディレクトリで作業している場合はPULSE_DIRを確認し変更してください。

ビルドします。
sudo make
sudo cp *.so /usr/lib/pulse-5.0/modules/
cd ~
この記事公開時ではmakeがエラーで終了するでしょう。同様な症状はこちらのようです。
Pulse audio modules does not compile #723
gkyildirim commented on 3 Apr
”I've cloned the latest code (7a7445f) and followed to build guide of xrdp audio support . make outputs error such as below.”
解決方法としては同引用ページのコメントに従います。
metalefty commented on 4 Apr
"You need to modify Makefile. Add -DXRDP_SOCKET_PATH=\"/path/to/xrdp_socket_dir\" to CFLAGS. The XRDP_SOCKET_PATH is set to /tmp/.xrdp if you don't override default value."
xrdpのv0.9.2からはMakefileの変更がさらに必要なようです。
~/Downloads/xrdp/sesman/chansrv/pulseディレクトリのMakefileファイルを修正します。テキストエディタでMakefileを開きます。
次のCFLAGSの行を探します。
CFLAGS    = -Wall -O2 -I$(PULSE_DIR) -I$(PULSE_DIR)/src -DHAVE_CONFIG_H -fPIC
この行の最後に以下の赤文字のようにフラグを追加します。
CFLAGS    = -Wall -O2 -I$(PULSE_DIR) -I$(PULSE_DIR)/src -DHAVE_CONFIG_H -fPIC -DXRDP_SOCKET_PATH=\"/tmp/.xrdp\"
保存してエディタを終了します。
引用ページコメントにあるようにこれはxrdpのデフォルトの値を使っている場合の変更です。独自のディレクトリ指定をしている方はもう少し修正が必要です。
これで先ほどのsudo makeからやり直します。

xrdpの環境設定ファイルの修正

xrdpの設定をRASPBIANに合わせた値に修正します。
sudo sed -i.bak 's/^\(EnvironmentFile.*sysconfig.*\)/#\1/' /lib/systemd/system/xrdp.service
sudo sed -i 's/^\(EnvironmentFile.*\)\(\/etc\/default\/xrdp\)/\1\/etc\/xrdp/' /lib/systemd/system/xrdp.service
sudo sed -i 's/^\(ExecStart.*\)\(\/usr\/sbin\/xrdp\)\(.*\)/\1\/usr\/local\/sbin\/xrdp\3/' /lib/systemd/system/xrdp.service
sudo sed -i 's/^\(ExecStop.*\)\(\/usr\/sbin\/xrdp\)\(.*\)/\1\/usr\/local\/sbin\/xrdp\3/' /lib/systemd/system/xrdp.service

sudo sed -i.bak 's/^\(EnvironmentFile.*sysconfig.*\)/#\1/' /lib/systemd/system/xrdp-sesman.service
sudo sed -i 's/^\(EnvironmentFile.*\)\(\/etc\/default\/xrdp\)/\1\/etc\/xrdp/' /lib/systemd/system/xrdp-sesman.service
sudo sed -i 's/^\(ExecStart.*\)\(\/usr\/sbin\/xrdp\)\(.*\)/\1\/usr\/local\/sbin\/xrdp\3/' /lib/systemd/system/xrdp-sesman.service
sudo sed -i 's/^\(ExecStop.*\)\(\/usr\/sbin\/xrdp\)\(.*\)/\1\/usr\/local\/sbin\/xrdp\3/' /lib/systemd/system/xrdp-sesman.service

サービスの登録

sudo systemctl daemon-reload
sudo systemctl enable xrdp.service
sudo systemctl start xrdp.service
この後、再起動すればxrdpのビルドとインストールは完了です。

動作確認

Windowsパソコンのリモートデスクトップ接続からRaspberry Piのアドレスを指定して接続します。
正しくつながればログイン画面が出るでしょう。

Sessionでは"Xorg"を選択します。xrdpのv0.9.2からは"Xorg"がデフォルトのセッションになりました。
ユーザー名とパスワードを入れればデスクトップが表示されるでしょう。

音を出す

このままでは音が出ません。ターミナルを開いて次のコマンドを入れます。
start-pulseaudio-x11
セッションを開く毎に実行する必要があります。どこかの設定に書いておけばいいと思うのですが、どこに書けばいいのかいまだにわかってません。

パソコンのドライブ

"thinclient_drives"というディレクトリがホームフォルダの下にできています。ここの下にパソコンのドライブがリダイレクトされて表示されます。
パソコンとファイルの交換が簡単にできます。

クリップボード

パソコンとクリップボードが共有されています。ウェブサイトでの調べものが捗りますね。
ただし、改行コードが異なる事に注意が必要です。Raspberry Piの改行はLF、パソコンはCR+LFです。Raspberry Piに最初から入っているテキストエディタではこの両者の区別がつきません。
スクリプトをコピペして動作がおかしい時は改行コードを疑いましょう。

sudoでのGUI

sudoでGUIウインドウを開くさいエラーが表示されるかもしれません。
$ sudo leafpad
No protocol specified
leafpad: ディスプレイをオープンできません: 
こんな時は
xhost +
を実行します。

不具合

クリップボード/サウンド/ドライブのリダイレクトは時間が経つと機能しなくなるようです。
xrdpのバグなのか、私の設定が悪いのかわかりません。

コメント

最近のコメント

Threaded Recent Comments will be here.