Hatena::Grouplinux2

Going My Linux Way このページをアンテナに追加 RSSフィード

2012年01月28日(土)

X のディスプレイ

| 12:26 | X のディスプレイ - Going My Linux Way を含むブックマーク はてなブックマーク - X のディスプレイ - Going My Linux Way X のディスプレイ - Going My Linux Way のブックマークコメント

X のディスプレイに関するちょいメモです。

記憶に基づいてます。間違いも含まれているかもです。

----

X サーバ

X は サーバ/クライアント モデルのシステムです。

X サーバは「ディスプレイに対する入出力」をサービスとして提供します。

X サーバは 1つの「ディスプレイ」をハンドルします。

X のディスプレイ

X でいう「ディスプレイ」は論理的な概念で、液晶ディスプレイとかの表示装置(ハードウェア)のことではありません。

ディスプレイは以下の要素を持ちます。

ディスプレイは 0 から始まるディスプレイ番号で識別されます。多くの場合は ディスプレイ番号 0 しか使われません。

スクリーン

ハードウェアとして、通常は表示装置が割り当てられます。

ビデオメモリだけ(画面なし)を割り当てることも可能*1です。

スクリーンは一つのディスプレイに複数あります。これらは 0 から始まるスクリーン番号で識別されます。多くの場合は スクリーン番号 0 しか使われません。

キャラクタ入力デバイス

ハードウェアとして、通常はキーボードが割り当てられます。

他のデバイスを割り当てることも可能と思われますが、例を知りません。

ポインティングデバイス

ハードウェアとして、通常はマウスが割り当てられます。

タブレットなどを割り当てることも可能です。

サーバクライアントの通信

X のサーバクライアントTCP で通信します。

TCP 通信なので、他のホストの X サーバに X アプリケーションの画面を表示させることもできます。(ただし、リモート X サーバアクセス許可の設定が必要です)

ディスプレイ番号 0 のサーバはポート 6000、番号 1 はポート 6001、... を listen します。

ただし、最近の実装では localhost の場合は (効率のため)TCP でなくプロセス間通信を使用します。

ディスプレイの指定

環境変数 DISPLAY は X クライアントデフォルトで使用するディスプレイを指定します。書式は以下の通りです。

  IPアドレス(or名前解決可能なホスト名) +「:」+ ディスプレイ番号

例です。

  DISPLAY=192.168.0.10:0  # 192.168.0.10 のディスプレイ番号 0

  DISPLAY=example.com:1   # example.com のディスプレイ番号 1

  DISPLAY=:0  # ホストを省略(localhostと解釈される)した場合

多くの X クライアントは -display オプションで明示的にディスプレイを指定できます。また、環境変数 DISPLAY が未設定の場合は DISPLAY=:0 と解釈して動作します。

スクリーン番号

スクリーン番号は以下の書式で示します。

  ディスプレイ識別子 + 「.」+ スクリーン番号

例は以下です。

  192.168.0.10:0.0 # ディスプレイ 192.168.0.10:0 のスクリーン 0

  :0.1             # ディスプレイ localhost:0 のスクリーン 1

他のディスプレイに表示する例

ローカルホストのもう一つのディスプレイに表示させる例です。

$ sudo xinit wmaker -- :1  # ディスプレイ番号 1 に WindowMaker を起動
(画面がディスプレイ番号 1 に移動するので「Ctrl + Alt + F7」で戻ってきて)
$ export DISPLAY=:1        # ディスプレイをディスプレイ番号 1 に指定
$ mlterm &     # これ以降の X クライアントはディスプレイ番号 1 に表示される
$ firefox &
$ gimp &
(画面を「Ctrl + Alt + F8」でディスプレイ番号 1 に移動して確認)

----

[追記:(2012/02/02)]

下の図が X のクライアント/サーバのモデルです。

f:id:lnznt:20120204161730j:image

※ X のポートは 6000 + ディスプレイ番号

現在の X サーバの実装では(デフォルトで)TCPポートをlistenしません。Unixドメインソケットでローカルの Xクライアントとだけ通信します。

f:id:lnznt:20120204161732j:image

今回行った、DISPLAY#1(2番目のディスプレイ)として Xサーバをもう一つ起動したイメージ図です。

f:id:lnznt:20120204161731j:image

普通ユーザは表示装置やキーボードがあるホストX側にいるので、ホストAなどにリモートログインして、そこからホストXのディスプレイを指定してXクライアントを起動する、ような使い方をします。

ログインマネージャHack

01:46 | ログインマネージャHack - Going My Linux Way を含むブックマーク はてなブックマーク - ログインマネージャHack - Going My Linux Way ログインマネージャHack - Going My Linux Way のブックマークコメント

LINUXデスクトップHACKS」の第三章「ログインマネージャ」を読みました。

特筆するところのみメモします。

本が 2005 年出版なので古い内容があるかもしれません。

また、内容の実機検証はしてません。あくまで本の内容に関するメモです。

----

仮想コンソールの切り替え

大抵の Linux ディストリビューションでは、

  • テキストベースの仮想端末が 6つ
  • グラフィカルログイン用の仮想端末が 3つ

が、デフォルトで構成されているらしいです。

仮想コンソールの切り替えは、

  • Ctrl + Alt + Fnキー (X 環境で切り替える場合)
  • Alt + Fnキー (コンソール環境で切り替える場合)

で行ないます。(Fn の n は仮想コンソール番号)

例えば、X環境で「Ctrl + Alt + F1」を押下すると仮想コンソール#1 (テキストベース)へジャンプします。

仮想コンソール#1 で「Alt + F7」 を押下すると元の X 環境に戻ります。

複数のデスクトップ

テキストベースの仮想コンソールは 6 つ起動してますが、グラフィカルログインできる仮想コンソールは(大抵のディストリでは)1つです。

複数の仮想コンソールでグラフィカルログインをそれぞれ行うには、ディスプレイマネージャを複数起動すればいいはずです。

KDM や GDM を使用している場合は、構成ファイルをいじってみましょう。

Ubuntu では lightdm というディスプレイマネージャが使用されてます。構成ファイルを見てみましたが、どこをいじればいいのか見当つきませんでした(残念)。

----

ディスプレイマネージャ複数起動は断念しましたが、直接 ウィンドウマネージャを複数起動するのはできそうです。

私はデスクトップ環境Xfce を使用しています。このウィンドウマネージャは xfwm4 です。もう一つの仮想コンソールに wmaker (WindowMaker のウィンドウマネージャ) を起動してみます。

# wmaker が未インストールだったら、次のようにしてインストール
$ sudo apt-get install wmaker

$ sudo xinit wmaker -- :1

xinit は X サーバを起動するコマンドです。引数に起動する Xクライアント(ここでは wmaker)を指定しています。-- 以降は X サーバに渡されるオプションです。:1 はディスプレイ番号 1 を指定しています。(通常のディスプレイは番号 0)

本来は root で X を起動するのはセキュリティ上危険なので避けましょう。(Xauth 関連のエラーが面倒なので、ここでは sudo を使用しています)

上のコマンドを実行すると、仮想コンソール#8 に WindowMaker が起動したデスクトップ環境が表示されます。(戻ってくる場合は 「Ctrl + Alt + F7」押下)

仮想コンソールの WindowMaker (移動は「Ctrl + Alt + F8」)を終了させるには、WindowMakerexit するか、「login」とタイトルされた X 端末のウィンドウを閉じます。(この X端末は xinit の最後の仕事なので、これが終了すると xinit コマンドが終了する)

フレームバッファを使用したログインマネージャ Qingy

qingy はフレームバッファを使用したログインマネージャです。

Ubuntu では qingy パッケージが用意されてます。

# Ubuntu でのインストール
$ sudo apt-get install qingy

qingy は getty の置き替えになるので、/etc/inittab の該当箇所を書き替えれば使用できるようになります。。。。ですが、Ubuntu は /etc/inittab がありません。

Ubuntu では /etc/init/tty6.conf を書き替えます。(仮想コンソール#6 を使う場合)

(書き替える箇所)
#exec /sbin/getty -8 38400 tty6
exec /usr/sbin/qingy tty6

システムを再起動した後、仮想コンソール#6 に移動すると Qingy のビジュアルなログイン画面が表示されています。で、ログインまではできたのですが、ログインした後コマンドラインが表示されませんでした。(残念)

メモリの節約

テキストベース仮想コンソールは 6つ用意されていますが、せいぜい 2 個あれば十分です。不要な仮想コンソールは閉じておくとメモリの節約になります。

。。。しかし Ubuntu ではどうやんでしょう? /etc/init/tty[3-6].conf を削除すればいいのかな?

----

*1:Xvfb という X サーバがあります

トラックバック - http://linux2.g.hatena.ne.jp/lnznt/20120128