Ubuntu 12.10‎ > ‎

DISPLAY

ubuntu 12.10で採用されているx window systemは、xアプリケーションxクライアント)が出した要求を、xサーバが受けてモニタにそのウインドウを表示するといった、いわゆるサーバ・クライアント方式で構成されています。

そのため、xアプリケーションを起動したPCのモニタにそのウインドウを普通に表示するだけでなく、ネットワーク上にある別のPCのモニタにそのウインドウを表示するといった、文字通り離れ技もできてしまいます。

この様な柔軟なウインドウ表示をコントロールするために、xアプリケーションは環境変数DISPLAYを参照しています。

環境変数DISPLAYの書式を調べると、次のようになっています。

DISPLAY=(ホスト):(ディスプレイ).(スクリーン)

ホストは、xアプリケーションのウインドウを表示する、ネットワーク上のxサーバが稼働するPCのホスト名(IPアドレスも可)です。

ホスト名は、hostnemeコマンドで確認できて、/etc/hostnameファイルに記述されています。

ディスプレイは、1つのOSに同時に起動された複数のxサーバを区別するための番号で、「0,1,2...」と0から始まる連番です。

ubuntu 12.10はtty1からtty6まで6個の仮想コンソールを持っているので、それぞれの仮想コンソールからxサーバを同時に稼働させることが可能なのです。

スクリーンは、1台のPCに物理的に接続された複数のモニタを区別するための番号で、「0,1,2...」と0から始まる連番です。

普通ディスプレイと言うと、物理的なモニタのことをイメージしますが、ここではxサーバが物理的なモニタやキーボードやマウス等を管理するための概念として使っていますので、注意が必要です。

稼働するxサーバごとにディスプレイという概念が存在しますので、ディスプレイはxサーバのことと考えた方がわかり易いかもしれません。

もう少し具体的に説明しましょう。

次の様に、ネットワーク上にホスト名(IPアドレス)がそれぞれhostA(192.168.0.10)、hostB(192.168.0.20)であるPCがあって、hostAは通常の構成で、hostBでは複数のxサーバが稼働し、かつ、複数のモニタが接続されているとします。

ホスト名:hostA
xサーバ :0番(一つだけ稼働)
モニタ  :0番(1台だけ接続)

ホスト名:HostB
xサーバ :0番、1番、2番(3つ同時稼働)
モニタ  :0番、1番(2台接続)

この構成で、hostAでleafpadを起動し、hostBの3つ目のxサーバによって、hostBの2台目のモニタにそのウインドウを表示させる実際の手順を説明してみます。

まず、準備として次の2つのことをします。

①名前解決のために、/etc/hostsファイルを変更
  hostA:
  $ cat /etc/hosts
  127.0.0.1        localhost
  127.0.1.1        hostA
  192.168.0.20  hostB        ←追加
   :

  hostB:
  $ cat /etc/hosts
  127.0.0.1        localhost
  127.0.1.1        hostB
  192.168.0.10  hostA        ←追加
   :

②hostBのxサーバがTCPポートをlistenするように、/etc/X11/xinit/xserverrcファイルを変更(要再起動)
  $ cat /etc/X11/xinit/xserverrc
  #!/bin/sh

  #exec /usr/bin/X -nolisten tcp "$@"        ←コメントアウト
  exec /usr/bin/X "$@"

  確認:(ポート名とポート番号の対応は、/etc/servicesファイルを参照)
  $ netstat -at
  稼働中のインターネット接続 (サーバと確立)
  Proto 受信-Q 送信-Q 内部アドレス 外部アドレス 状態
  tcp        0      0  *:x11         *:*           LISTEN        ←x11はポート6000番
  tcp        0      0  *:x11-1       *:*           LISTEN        ←x11-1はポート6001番
  tcp        0      0  *:x11-2       *:*           LISTEN        ←x11-2はポート6002番 
   : 

次にhostB(xサーバ側)の設定をします。

hostAからのアクセスを許可するために、3つ目のxサーバの管理下で、xhostコマンド(セキュリティ的には非推奨だそうで…)を使い、hostAにアクセス権を与えます。

$ xhost +hostA
hostA being added to access control list

確認:
$ xhost
access control enabled, only authorized clients can connect
INET:hostA
SI:localuser:xxxx

次に、hostA(xクライアント側)の設定をします。

環境変数DISPLAYに出力先を設定します。

$ export DISPLAY=hostB:2.1

確認:
$ echo $DISPLAY
hostB:2.1

以上で、hostAにおいてleafpadを起動すると、ネットワーク越しに、hostBの3つ目のxサーバによって、hostBの2台目のモニタにそのウインドウが表示されるはずです。

ところで、hostBの1つ目のxサーバでleafpadを起動して、hostBの3つ目のxサーバによって、hostBの2台目のモニタにそのウインドウを表示するといった、いわゆるローカルな場合は、ubuntu 12.10ではTCPポートを使って通信をせずに、内部的にプロセス間通信を行なっていますので、上記の様な手順を踏まなくても、次の様に環境変数DISPLAYを設定するだけで問題なく動作します。

$ export DISPLAY=:2.1

ホスト名が省略されていすが、内部的にプロセス間通信を行なっている場合は「unix」が省略されています。(ちなみに、TCP通信の場合は「localhost」が省略)

尚、xアプリケーションによっては、環境変数DISPLAYを参照する代わりに、「-display」オプションで出力先を設定できるモノもあります。

$ (xアプリケーション) -display (ホスト):(ディスプレイ).(スクリーン)

Comments