qshinoの日記

Powershell関係と徒然なこと

X11色々

X11関係で徒然と。

テーマはXdmx, Xvnc, Xnest, VirtualGL, xrdp, rdesktopなど。

x11 転送関係

https://www.qoosky.io/techs/b71444ec83

複数のX11サーバを立ち上げる方法

一つのマシンに複数のコンソールを立ち上げる事は良くあること。立ち上げ後、CTRL-ALT-FunctionKeyでコンソールを切り替える。

一方、インストール直後は一台のマシンにX11サーバが一つ。コンソールの様にXも複数立ち上げられるか?

期待値は欲しい数だけXを立ち上げる事。Xの切り替えはコンソール同様に、C-ALT-FuncKeyだとやりやすい。

$ X :1
$ X :2
$ X :3

上記だと、上がったとしても、素のXサーバ。WindowManagerなども同時に起動したいなら、

$ startx --   :1
$ startx --   :2
$ startx --   :3

最近のXはディスプレイが無いと上がらない場合があり、その対策も必要かもしれない。

とりあえず、startxは複雑過ぎて上手く行かず、素のX で何とか立ち上がる。

ubuntu18.04 だと、2つ目のXのvtを指定しないと失敗した。また、root権限が必要とlogに出たのでsudo。立ち上がったのは、

  • sudo X vt2 :1

しかし、Xが上がっただけでアプリもWMもいない。つまり、何もできない。:1用のWindowManagerを立上げ、適当にxterm等を上げて、C-A-F2 で:1のXに切り替わる。

startx では vt# を自動で検索してくれたり便利なのだが、動かないものは使えない。時間ができたら考える。

昔の仮想デスクトップのイメージ。

startx

さて、前項ではstartxのX起動中にfailしたため、startxの裏側を調査。

詳細はrefを参照して欲しいが簡単に。

全体の流れは個々のDistributionにより異なるがらUbuntuでは下記の流れ。

  1. stratx : /usr/bin/startx
  2. xinitrc : ~/.xinitrc or /etc/X11/xinit/xinitrc
  3. xserverrc : ~/, or /etc/X11/xinit/
  4. xsession : /etc/X11/Xsession
  5. session-mamager or window-mamager or terminal-emlator

とても深く、かつ、それぞれの段階で選択肢がある。また、OS毎に異なる。AIXの場合の始まりは、

startx [ -d Display:0 ] [ -t | -w ] [ -x Startup | [ -r Resources ] [ -m Window_Manager ] ] [ -wait ]

Xorgだと、

startx [ [ client ] options ... ] [ -- [ server ] options ... ]

https://www.x.org/releases/X11R6.9.0/doc/html/startx.1.html

以後はxorg版で。startx は色々な確認後、client用にxinitrcを探し、server用にxserverrc を探す。

個人用xinitrc, xserverrcがない場合、それぞれグローバルなものを使う。

xinitrc はxsession を起動するだけ。 xserverrcはXを起動するだけ。

xsessionは、/etc/X11/Xsession.d/配下のスクリプトを順に実行し、スクリプトがSM or WM or TEを起動する。

SMだった場合、SMがX とWMを起動する。

また、xinitのオプション形式は、

xinit [ [ client ] options ] [ -- [ server ] [ display ] options ]

これはstartxと全く同じ。機能もほぼ同様。実質的にxinitはstartxに置き換えられたと見るのが正しいのかもしれない。xinitはxorgが提供し、startxはデストリブューターが提供するという、提供元の違いと言う面もある。

ref

http://www.nslabs.jp/startx.rhtml

https://www.ibm.com/support/knowledgecenter/ja/ssw_aix_71/com.ibm.aix.cmds5/startx.htm

Xのスクリーン

X では、ディスプレイをhost:display.screen で指定する。displayがディスプレイ=Xサーバ、screenがモニター番号を示す。

一つのXサーバで複数のスクリーンを持つことが出来る。xorg.conf にてスクリーンを割り当てる。

スクリーンが複数ある場合、DISPLAY変数が異なるため、通常はウインドウの移動等はできない。よって、複数のスクリーンを一つに見せる xinerama extensionやrandrがある。また、nvidiaにはtwinviewドライバがある。

詳細は下記ref参照。

ref

https://wiki.archlinux.jp/index.php/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%87%E3%82%A3%E3%82%B9%E3%83%97%E3%83%AC%E3%82%A4

マルチなX、なんなんなん行くさん

https://sites.google.com/site/teyasn001/ubuntu-12-10/huan-jing-bian-shudisplay

xnest/ xephyr

xnest/xephyr 共に基本機能は同じ。xnestは収束の方向で、今後の利用にはxephyrが推奨されている。

機能は、別のXserver のウインドウとして新たなXサーバー画面を表示する。

Xの中にXがあると言うネスト構造から、xnestと命名されたと思われる。

f:id:qshino:20190613213809j:plain

xnest/xephyrの用途としては、

  1. xdmcp等のデスクトップ全体をウインドウ表示する。
  2. xプロトコルを中継する。

Xのデスクトップ表示はxdmcpプロトコルであり、これを表示できるのはXサーバである。

中継は、app - x1 - x2 - x3 の様にappの出力をXサーバを中継して転送する。Firewall 等の理由により直接通信できない環境で、遠隔画面の表示が可能となる。

起動のコマンドラインは下記の通り。

DISPLAY=<d1> Xephyr -display :<d2>
  • d1 : ウインドウを表示するXサーバ
  • d2 : 新たに立ち上げるXサーバ

d2 Xサーバで受けたXプロトコルをd1のウインドウに表示する。xapp - d2 - d1 の流れでイメージが転送される。

OpenGL拡張等への対応が課題。

ref

http://tenten909.blog.shinobi.jp/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E9%96%A2%E9%80%A3/xephyr%20%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89

xdmx

複数のXサーバの画面を一つのXdmxサーバで表示する。

一言で言うと、リモートXサーバの乗っ取り。

2つのpc a,bが共にXサーバを起動している時、aでxdmxを立ち上げると、bのXサーバがaのセカンドモニタとなる。

例えば、下記のような立上げコマンドをa上で打つと、a/b2台のpcがaのモニタとなる。入力はaのkbd,mouseが使える。

xdmx -display a:0 -display b:0 +xinerama

下記のコマンドラインとコンフィグファイルを使うと、4台のpcの画面を一台のサーバで表示する事ができる。

$ Xdmx :1 -configfile xdmx.conf -config example2 +xinerama &
xdmx.conf

virtual example2 {
        display PC01:0 1280x1024 @0x0;
        display PC02:0 1280x1024 @1280x0;
        display PC03:0 1280x1024 @0x1024;
        display PC04:0 1280x1024 @1280x1024;
}

コマンドラインを見ると分かるが、xinerama拡張を利用する。

通信における暗号化等のセキュリティについては詳細不明。

xdmxサーバを親、個別のXサーバを子と呼ぶと、参考例では、子から下記のsshで親に入りxdmxを立上げていた。

子$ ssh -X -c blowfish-cbc 親
親$ env|grep DISP
親$ xdmx :10 -display :0 -display 前のコマンド出力 -input 前のコマンド出力

上記は子のキーボードを使用する。親のキーボードを使用する場合は、-input :0とする。

ref

man xdmx

http://dmx.sourceforge.net/Xdmx.html#toc

https://www.atmarkit.co.jp/flinux/rensai/linuxtips/844xdmxsetting.html

http://etc2myday.jugem.jp/?eid=76

若き日の過ち

http://hakurei-shain.blogspot.com/2009/03/?m=1

intellilinx / How to share a window across multiple computers using Xorg

https://web.archive.org/web/20110225150836/http://intellilinux.info/node/25

xrandr

xinerama拡張を使ったxdmxと同様なXサーバ。

wikipediaによると、「XRandR(エックス・アール・アンド・アール)は、X Window System を再起動せずに解像度の変更や、画面の回転、表示モニターの切替え、マルチモニターの設定など、を行うことを容易にするライブラリとコマンドである。XRandRは、X Window System Resize and Rotate Extension を略したもの。」

コマンド

コマンドの使用例編集

モニターと可能な設定の表示

xrandr

全てのモニターを最高解像度で、同じ画面を表示する。

xrandr --auto

内蔵モニターの右側に外部モニターを表示。モニターの名前は、上の xrandr で調べられる。ここでは 内部モニター:LVDS、外部モニター:VGA とする。

xrandr --output VGA --right-of LVDS

内蔵モニターの上側に外部モニターを表示。

xrandr --output VGA --above LVDS

マルチモニターを使用する場合、X11の設定ファイル:通常 /etc/X11/xorg.conf で、仮想スクリーンの範囲を大きく取っておく。 例:

Virtual 2048 2048

ref

https://ja.m.wikipedia.org/wiki/XRandR

https://keithp.com/~keithp/talks/randr/

xvnc

その他

いつか。

ref

x11 サーバ複数起動

http://memolinux.blogspot.com/2009/06/xorg.html?m=1

Xdmx

https://www.atmarkit.co.jp/flinux/rensai/linuxtips/836usedmx.html