Xorg マルチシート
マルチシートとはひとつのコンピュータで同時に複数のユーザーが作業する構成のことです。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)"
どのデバイスがどれかわからない場合 lspci や lsusb と比較してデバイスを識別してください。
デバイスの割り当て
シートはグラフィックカードごとに作成されます。まずはグラフィックカードの割り当てから始めます:
# 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
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
サウンド
シートごとに別々のサウンドカードを使う
サウンドカードをシートに接続することで 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
参照
- オリジナルの Arch フォーラムスレッド
- マルチポインタ X では同一セッションで複数のデバイスを使用する方法を説明しています。
- Multiseat using loginctl
- Using udev to configure multi-seat automatically