Xorg マルチシート

提供: ArchWiki
移動先: 案内検索

マルチシートとはひとつのコンピュータで同時に複数のユーザーが作業する構成のことです。2台のモニター、2枚のキーボードおよび2個のマウスを使います。以下のようなメリットがあります:

  • 消費電力が少ない (ひとつのコンピュータしか稼働しない)。
  • 購入しなくてはならないハードウェアが少ない。

混乱を避けるために、この記事では以下のように用語を定義します:

  • スクリーン: Xorg がウィンドウを表示するスクリーンです。スクリーンにはモニターとグラフィックカードを接続します。
  • モニター: あなたの目の前にある物理モニターです。
  • サーバーレイアウト: どのスクリーン・キーボード・マウスを使用するかの定義です。
  • シート: 物理モニター・物理キーボード・物理マウスからなる作業環境です。

要件

キーボードとマウス

標準的な PS/2 または USB キーボードで問題ありません。マウスも同じです。

グラフィックハードウェア

最高の結果を得るにはグラフィックカードが2枚必要です。

1枚のビデオカードでデュアルヘッド構成にすることもできますが、セカンドモニターでは Xephyr を使う必要があり、性能を生かすためにディスプレイの解像度が同じである必要があります。

ソフトウェア

使用するグラフィックカードの Xorg ドライバーと evdev (xf86-input-evdev) ドライバーが必要です。

デバイスをシートに接続

udev ルールを作成することで Systemd の loginctl を使ってデバイスをシートに割り当てます。

デバイスの確認

デフォルトのシート (seat0) の状態を確認:

# loginctl seat-status seat0
seat0
        Sessions: *11
         Devices:
                  ├ /sys/devices/pci0000:00/0000:00:02.0/0000:03:00.0/drm/card0
                  │ (drm:card0)
                  ├ /sys/devices/pci0000:00/0000:00:02.0/0000:03:00.0/graphics/fb0
                  │ (graphics:fb0) "radeondrmfb"
                  ├ /sys/devices/pci0000:00/0000:00:02.0/0000:03:00.1/sound/card1
                  │ (sound:card1) "Generic"
                  │ └ /sys/devices/pci0000:00/0000:00:02.0/0000:03:00.1/sound/card1/input15
                  │   (input:input15) "HD-Audio Generic HDMI/DP,pcm=3"
                  ├ /sys/devices/pci0000:00/0000:00:12.0/usb3
                  │ (usb:usb3)
                  │ ├ /sys/devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.2/0003:046D:C52B.0006/input/input5
                  │ │ (input:input5) "Logitech Unifying Device. Wireless PID:101b"
                  │ └ /sys/devices/pci0000:00/0000:00:12.0/usb3/3-1/3-1:1.2/0003:046D:C52B.0006/input/input6
                  │   (input:input6) "Logitech Unifying Device. Wireless PID:200a"
                  ├ /sys/devices/pci0000:00/0000:00:14.2/sound/card0
                  │ (sound:card0) "SB"
                  │ ├ /sys/devices/pci0000:00/0000:00:14.2/sound/card0/input7
                  │ │ (input:input7) "HDA ATI SB Line"
                  │ └ /sys/devices/pci0000:00/0000:00:14.2/sound/card0/input9
                  │   (input:input9) "HDA ATI SB Rear Mic"
                  ├ /sys/devices/pci0000:00/0000:00:04.0/0000:02:00.0/drm/card1
                  │ (drm:card1)
                  ├ /sys/devices/pci0000:00/0000:00:04.0/0000:02:00.0/graphics/fb1
                  │ (graphics:fb1) "radeondrmfb"
                  ├ /sys/devices/pci0000:00/0000:00:04.0/0000:02:00.1/sound/card2
                  │ (sound:card2) "HDMI"
                  │ └ /sys/devices/pci0000:00/0000:00:04.0/0000:02:00.1/sound/card2/input16
                  │   (input:input16) "HDA ATI HDMI HDMI/DP,pcm=3"
                  ├ /sys/devices/pci0000:00/0000:00:12.1/usb4/4-1/4-1:1.0/input/input2
                  │ (input:input2) "CHESEN PS2 to USB Converter"
                  ├ /sys/devices/pci0000:00/0000:00:12.1/usb4/4-1/4-1:1.1/input/input3
                  │ (input:input3) "CHESEN PS2 to USB Converter"
                  └ /sys/devices/pci0000:00/0000:00:12.1/usb4/4-2/4-2:1.0/input/input4
                    (input:input4) "Microsoft Microsoft 3-Button Mouse with IntelliEye(TM)"

どのデバイスがどれかわからない場合 lspcilsusb と比較してデバイスを識別してください。

デバイスの割り当て

シートはグラフィックカードごとに作成されます。まずはグラフィックカードの割り当てから始めます:

# loginctl attach seat-1 /sys/devices/pci0000:00/0000:00:04.0/0000:02:00.0/drm/card1
# loginctl attach seat-1 /sys/devices/pci0000:00/0000:00:04.0/0000:02:00.0/graphics/fb1

それから入力デバイスを追加:

# loginctl attach seat-1 /sys/devices/pci0000:00/0000:00:12.1/usb4/4-1/4-1:1.0/input/input2
# loginctl attach seat-1 /sys/devices/pci0000:00/0000:00:12.1/usb4/4-1/4-1:1.1/input/input3
# loginctl attach seat-1 /sys/devices/pci0000:00/0000:00:12.1/usb4/4-2/4-2:1.0/input/input4

サウンドカードが複数ある場合、シートごとに割り当てることでユーザーセッションの PulseAudio で使えるようになります:

# loginctl attach seat-1 /sys/devices/pci0000:00/0000:00:04.0/0000:02:00.1/sound/card2/input16
# loginctl attach seat-1 /sys/devices/pci0000:00/0000:00:04.0/0000:02:00.1/sound/card2

ハードウェアが2つのシートに分割されていることを確認:

# loginctl seat-status seat0
# loginctl seat-status seat-1

Xorg の設定

loginctl でデバイスをシートに接続したら特別な Xorg の設定は必要ありません。それぞれのキーボード・マウス・ビデオカード・モニターを2つのサーバーレイアウトで設定できます。

xorg.conf.d ツリーの例
├── 00-keyboard.conf   #created by localectl
├── 31-monitor-seat0.conf
├── 32-monitor-seat1.conf
├── 40-serverflags.conf
├── 41-graphic-seat0.conf
├── 42-graphic-seat1.conf
├── 51-screen-seat0.conf
├── 52-screen-seat1.conf
├── 61-layout-seat0.conf
└── 62-layout-seat1.conf

利用可能な入力デバイスを定義

Xorg#入力デバイスに書かれているようにデバイスを設定してください。"Identifier" は ServerLayout で割り当てる識別子で "Device" は設定する物理デバイスです。

01-keyboard-seat0.conf
Section "InputDevice"
        Identifier      "keyboard0"
        Option          "Device"                "/dev/input/event1"
        #Option          "Device"                "/dev/input/by-path/pci-0000:00:1a.0-usb-0:1.6:1.0-event-kbd"  # or by path
        Option "GrabDevice" "on" # prevent send event to other X-servers
EndSection

他は Xorg#入力デバイスと同じです。

Monitor

Xorg#モニターの設定に書かれているようにモニターを設定します。識別子に注意してください。

31-monitor-seat0.conf
Section "Monitor"
    Identifier             "monitor0"
EndSection

ServerFlags

40-serverflags.conf
Section "ServerFlags"
        Option "AutoAddGPU" "off"
EndSection

グラフィックカード

BusId に注意してください。使用するハードウェアカードを指定するオプションです。BusId は lspci で確認できますが、オプションに使用する値とは違います。lspci はデバイスアドレスを16進数で表示するためです。アドレスを16進数から10進数に変換する必要があります。lspci でデバイスアドレスが 0:0a:0 であれば xorg.conf では 0:10:0 と指定します。

42-graphic-seat1.conf
Section "Device"
        Identifier      "graphic0"
        Driver          "nvidia"
        Option          "NoLogo"                "1"  # Remove nvidia branding at startup
        BusId           "PCI:1:0:0"
        MatchSeat       "seat-1"                     # Needed when only configuring part of Xorg for non-seat0.
        Option          "Monitor-DVI-1"         "monitor1"  #assigns monitor configuration to graphic output port
EndSection

Screen

"monitor" オプションに注意してください。

51-screen-seat0.conf
Section "Screen"
        Identifier              "screen0"
        Device                  "graphic0"
        Monitor                 "monitor0"
        DefaultDepth    24
        Subsection "Display"
                Depth   24
                Modes   "1280x1024"     "1024x768"
        EndSubsection
EndSection

ServerLayout

各シートごとのセクションを作成します (Identifier に注意してください):

62-layout-seat1.conf
Section "ServerLayout"
        Identifier      "seat-1"
        Screen          "screen1"       0                   0
        InputDevice     "mouse1"        "CorePointer"
        InputDevice     "keyboard1"     "CoreKeyboard"
        Option          "Seat"  "seat-1"
        Option          "SingleCard" "on"   # use this to simplfied isolatedevice option
EndSection

再起動する前に各ユーザーディレクトリの ~/.Xauthority ファイルは削除してください。

ちらつきを抑えるために以下を /etc/environment に追加すると良いでしょう:

CLUTTER_PAINT=disable-clipped-redraws:disable-culling
CLUTTER_VBLANK=True

テスト

ログインマネージャを設定する前に、まずは個別のシートをテストします。

twm (tiny window manager) でシートが機能するか確認します。~/.xinitrc に以下を追加:

exec twm

以下のコマンドを使って個別のシートをテストします:

startx -- -layout seat0 -config xorg.conf.multiseat

シートごとに上記のコマンドをテストします。全て動作したら完了です。

ログインマネージャの設定

XDM

/etc/X11/xdm/Xservers を開いて以下の変数を設定:

# NOTE: don't add -sharevts on seat0, otherwise it may reset in about 10~20 minutes automatically.
:0 local /usr/bin/X :0 vt07 -nolisten tcp -novtswitch -layout seat0 -seat seat0
:1 local /usr/bin/X :1 vt08 -nolisten tcp -novtswitch -layout seat-1 -seat seat-1
ノート: シート番号が XDM によって正しくセッションに割り当てられない場合 (loginctl でシートがないセッションが表示される)、接続されたデバイスが上手く機能しなくなります。

Archlinux テーマを使用する場合は /etc/X11/xdm/xdm-config を編集:

DisplayManager._0.setup:        /etc/X11/xdm/arch-xdm/Xsetup
DisplayManager._0.startup:      /etc/X11/xdm/arch-xdm/Xstartup
DisplayManager._0.reset:        /etc/X11/xdm/arch-xdm/Xreset
DisplayManager._1.setup:        /etc/X11/xdm/arch-xdm/Xsetup
DisplayManager._1.startup:      /etc/X11/xdm/arch-xdm/Xstartup
DisplayManager._1.reset:        /etc/X11/xdm/arch-xdm/Xreset

LightDM

LightDM は自動的にマルチシートを認識しますが、必要であれば /etc/lightdm/lightdm.conf で設定できます:

[LightDM]
run-directory=/run/lightdm

[Seat:*]
greeter-session=lightdm-gtk-greeter
greeter-hide-users=false # Bug: lightdm-gtk-greeter doesn't load user saved session when greeter-hide-users=true[1]
session-wrapper=/etc/lightdm/Xsession

[Seat:seat0]
xserver-command=/usr/bin/X :0
xserver-layout=seat0
 
[Seat:seat-1]
xserver-command=/usr/bin/X :1
xserver-layout=seat-1
ノート: Xorg サーバーはバージョン 1.16 から VT を non-seat0 で起動するように処理しません。そのため -sharevts オプションは不要です [2]

サウンド

シートごとに別々のサウンドカードを使う

サウンドカードをシートに接続することで PulseAudio がサウンドカードを認識して使えるようになります。

ひとつのサウンドカードを複数のユーザーで使う

同時に複数のユーザーがサウンドカードを同時に使えるようにしたい場合、サウンドサーバーの PulseAudio が必要です。

デフォルトの設定をメインユーザーのホームディレクトリにコピー:

$ cp /etc/pulse/default.pa ~/.pulse/

または:

$ cp /etc/pulse/default.pa ~/.config/pulse/

ファイルを編集して、末尾に以下を追加:

load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1

pulseaudio を再起動:

$ pulseaudio -k
$ pulseaudio --daemonize=no

2番目のユーザーでは以下のようにユーザーとして設定:

$ echo "default-server = 127.0.0.1" > ~/.pulse/client.conf

トラブルシューティング

Windows キーが機能しない

スタートアップファイルに以下を記述してください:

xmodmap -e "add Mod4 = Super_L Super_R"

挙動が安定しない

全てを正しく設定しても、何らかの理由でカーソルが表示されない黒画面になる場合、BIOS で最初に初期化するカードを PCI カードに設定してみてください。

デスクトップに小さな黒いボックスが表示される

仮想端末の一部が X に描画されています。おそらく Linux のカーネルフレームバッファが原因です。フレームバッファを無効化するか、1番目のシートの X 引数から "-sharevts" オプションを削除することで解決できます。

マルチメディアキーが機能しない

キーボードにマルチメディアキーがある場合、マルチシート環境でマルチメディアキーが動作しなくなることがあります。そのようなキーボードは複数の "event" デバイスとして認識されるのが原因です。適切な event デバイスを確認して、InputDevice セクションを追加して、適切な ServerLayout セクションにその InputDevice セクションを追加してください。"SendCoreEvents" オプションを使用することでコアキーボードでない場合でもデバイスからの入力が処理されます。例:

Section "InputDevice"
    Identifier      "Keyboard0"
    Driver          "evdev"
    Option          "Device" "/dev/input/event6"
    Option          "XkbModel" "evdev"
EndSection

Section "InputDevice"
    Identifier      "Keyboard0Multimedia"
    Driver          "evdev"
    Option          "Device" "/dev/input/event7"
    Option          "XkbModel" "evdev"
EndSection

Section "ServerLayout"
    Identifier     "Layout0"
    Screen      0  "Screen0" 0 0
    InputDevice    "Keyboard0" "CoreKeyboard"
    InputDevice    "Keyboard0Multimedia" "SendCoreEvents"
    InputDevice    "Mouse0" "CorePointer"
    Option         "AutoAddDevices" "no"
EndSection

参照