私はラズベリーパイをヘッドレスで動かしていて、今後モニターとキーボードを繋ぐ予定はまったくありません。とは言ってもプログラミングを始めるとエディタ、IDE、terminalソフトぐらいはGUIで動かしたくなります。そこで今回はパソコン側でXサーバを動かして、ラズベリーパイのソフトをXクライアントとしてパソコン上で表示させてみましょう。
X Window Systemとは?
なじみの無い人のためにXを簡単に説明します。X Window Systemとは、MITが1980年代半ばに開発したウィンドウシステムで、ビットマップディスプレイへの表示コマンドをハードウェアから分離して、ネットワーク上のどのコンピュータでも表示できるようにしたものです。例えばコンピュータAで実行しているアプリケーションaの画面を、ネットワークに接続されたコンピュータBの画面で操作することができます。
VNCとの違いは?
似たようなものにVNCがあります。VNCは「コンピュータの画面」をリモートマシンに転送しますが、X Windowシステムは「ウィンドウへの描画コマンド」を送り出します。例えば「絵」という文字を画面に描く場合、X Window Systemでは「絵という文字をモニタBのx, yに描け」というコマンドを送ります。
これに対してVNCでは、プログラム自体は画面をそのままAに描画しますが、VNCが「モニターAの位置x, yのサイズx size, y sizeが変更された」というメッセージと、更新されたビットマップそのものをモニターBに送ります。
どちらが速いか、使うべきかはネットワーク帯域とアプリケーションの複雑さ、および利用目的に依存するため一概には言えません。単純に考えるとX Window Systemの方が速いのですが、初期化・sshプロトコル交換のオーバーヘッドが比較的大きいのと、ネットワークが十分速く単純なテキストだけ更新するようならVNCでも遅くはありません。こればかりは両方試して使い勝手の良い方を選べばよいと思います。
ラズベリーパイ側に必要なもの
GUIで動くソフトを動かすと言っても、VNCと違ってラズベリーパイ側で実際に画面を表示させているわけでは無いため、Rasbianの設定は最小限で済みます。表示するX Windowをsshを通して通信するためのソフトと、Xアプリケーション間の通信のために次の二つのパッケージが入っているのを確認しましょう(Raspbian Jessie Liteにはdbus-X11が、minibianには両方とも入っていません)。
$ sudo apt-get install xauth $ sudo apt-get install dbus-x11
この他にX11でよく使われるGTKというツールキットには、アクセスビリティ・バス(障害者用のデバイスを繋ぐために使われる)に接続できないという古いバグが残っているます。そのためXを使うソフトで頻繁にそのエラーメッセージが表示されることがあります(実害はありません)。これが毎回表示されるのはかなりうざったいので、その表示を抑えるために次の環境変数を.bashrcへ追加することを勧めます。
export NO_AT_BRIDGE=1
あとは普通にパッケージをインストールすればそれで終わりです。例えばleafpadを使いたければ、次のコマンドでleafpadと関連するX関係のライブラリが追加されます。
$ sudo apt install leafpad
実際にどれだけのサイズがインストールされるかは導入するソフト次第で、minibianにGTK, KDE toolkit, Gnome Toolkitをフルに使っているソフトをはじめてインストールするときには、20MBから数百MBほどパッケージ本体以外に大量のlibファイルが追加されることがあります。
リモートコンピュータ(パソコン側)の設定
ラズベリーパイ本体への設定は最小限で済みますが、アクセスするPC/Mac/Linuxコンピュータ側にはX サーバが入っている必要があります。
1. Linux
デスクトップ版のLinuxならXウィンドウシステムが既に動いているので普通は何もする必要はありません。ただ、セキュリティポリシーによって/etc/ssh/ssh_config、もしくは~/.ssh/configのForwardingX11をyesにする必要があります。これは使っているディストリビューションによって設定方法が微妙に違うのでドキュメントを参照するか詳しい人に聞聞いてください。
2. Mac
XQuartzが以前Appleが公式にサポートしていたX11サーバのユーザーメインテナンス版です。導入方法はサイトドキュメントを参照にしてください。
3. Windows
WindowsにはXFree86から派生した複数のX11サーバがあります。有名なところでは、Xming X server for Windows, XcXsrv Windows X Server, Cygwin/X の三つでしょう。さらにいくつかありますが、違いは、、、私もよく知りません^^; 私はCygwin/Xを使ってますが、Cygwinと同じところで配布してるからで特に意味はありません。Googleにでも聞いて好きなものを選んでください。
注意することと言えば、Windowsを起動したときに自動的に起動するようにショートカットをstartupフォルダに入れておくぐらいですね。
パソコンからのラズベリーパイへのアクセス方法
Xサーバをパソコン側で起動したら準備は完了ですが、もう一つ注意するべきことがあります。ラズベリーパイへのアクセスに、ターミナルからsshコマンドを直接使っている場合(linux, OS X)、sshコマンドに-Xオプションを指定してください(-XのXは大文字)。
$ ssh -X pi@192.168.0.xxx
これでコマンドラインからX対応のコマンドを実行すれば(例えば $ leafpad)、パソコン側に起動したアプリケーションが多少の間を置いて表示されます。
Windowsでは標準Terminalソフトが存在しないため、利用しているterminalソフト側でX11 Forwardingを有効にする必要があります。参考によくつかわれるPuTTYの設定は次の場所で行います。
これでXのアプリケーションをパソコンから起動できるようになったはずです。
補足
コマンドラインからGUIアプリケーションを起動するのに慣れていない人のために簡単に解説しておくと、X Windowのアプリケーションを立ち上げると、terminalが反応しなくなります。これは、terminalが親プロセスとなり、起動したXソフトの終了を待っているからです。
そこでアプリケーションをバックグラウンド・ジョブとして起動します。コマンドの後ろに & を付けてください。例えば、leafpadならば
$ leafpad &
とします。&を付け忘れて起動したら、^Zでアプリケーションを一旦サスペンドさせて、コマンドプロンプトを呼び出し、bgを実行するこどで停止しているleafpadをバックグランドで動かせるようになります。
pi@RPi-Dev:~$ leafpad ^Z [1]+ Stopped leafpad pi@RPi-Dev:~$ bg [1]+ leafpad & pi@RPi-Dev:~$