ディスプレイの無い環境でもNvidia GPUでXサーバを作るメモで、仮想ディスプレイを作成する方法がわかったので、今度はディスプレイを2つ用意して、SeleniumのChrome Nodeをそれぞれに実行するようにしてみます

変更前: xorg.conf

前回の記事で作成した/etc/X11/xorg.confが、だいたいこんな感じになっている前提とします

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 関係のあるセクションだけ抜粋
Section "ServerLayout"
Identifier "Layout0"
Screen 0 "Screen0"
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Mouse0" "CorePointer"
EndSection

Section "Monitor"
Identifier "Monitor0"
VendorName "Unknown"
ModelName "Unknown"
Option "DPMS"
EndSection

Section "Device"
Identifier "nvidia0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce GTX 1050"
EndSection

Section "Screen"
Identifier "Screen0"
Device "nvidia0"
Monitor "Monitor0"
DefaultDepth 24
Option "AllowEmptyInitialConfiguration" "True"
Option "UseDisplayDevice" "None"
Option "ConnectedMonitor" "None"
SubSection "Display"
Virtual 1920 1080
Depth 24
EndSubSection
EndSection

変更する: Monitorセクション

まるっとコピーして、Identifierを繰り上げるだけ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Section "Monitor"
Identifier "Monitor0"
VendorName "Unknown"
ModelName "Unknown"
Option "DPMS"
EndSection

# コピー
Section "Monitor"
Identifier "Monitor1" # ←繰り上げ
VendorName "Unknown"
ModelName "Unknown"
Option "DPMS"
EndSection

変更する: Deviceセクション

デフォルトでは、Screenは省略されているので、以下の(※)の行を追記します

1
2
3
4
5
6
7
Section "Device"
Identifier "nvidia0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce GTX 1050"
Screen 0 # ※
EndSection

次に、BusIDを追加します。nvidia-xconfigでは追加されなかった設定項目ですが、グラボを2枚挿ししていたりする際には、どちらのグラボを使用するのか指定が必要になってくると思います。今回はグラボ1枚ですが、BusIDを明示的に指定して、ハードウェア構成の変更に対応出来るようにしておきます

nvidia-xconfigコマンドを使用して、Bus IDを取得します。

1
2
3
4
5
6
7
8
9
$ nvidia-xconfig --query-gpu-info
Number of GPUs: 1

GPU #0:
Name : GeForce GTX 1050
UUID : GPU-a55246f1-f4fa-1f09-f238-8bfd1e88as10
PCI BusID : PCI:1:0:0

Number of Display Devices: 0

ここでハマりそうなポイントとして、lspci | grep -i nvidia等でもBus IDは取得する事ができますが、xorg.confに指定するBusIDは10進数で、lspciで表示されるBusIDは16進数のようです
参考: lspci vs nvidia-smi vs nvidia-xconfig reporting different PCI BusId - NVIDIA Developer Forums

取得したBusIDを(※)の要領で設定します

1
2
3
4
5
6
7
8
Section "Device"
Identifier "nvidia0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce GTX 1050"
BusID "PCI:1:0:0" # ※
Screen 0
EndSection

最後に、この設定を複製して、Screenを1つ繰り上げます。ここで指定するScreenは、後に、DISPLAY環境変数に設定する際のスクリーン番号となります(以下の例では、nvidia0DISPLAY=:0.0, nvidia1DISPLAY=:0.1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Section "Device"
Identifier "nvidia0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce GTX 1050"
BusID "PCI:1:0:0"
Screen 0
EndSection

# コピー
Section "Device"
Identifier "nvidia1" # ←繰り上げ
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce GTX 1050"
BusID "PCI:1:0:0"
Screen 1 # ←繰り上げ
EndSection

変更する: Screenセクション

Screenセクションも既存の物を複製し、ここまでに設定してきたnvidia1Monitor1を割り当てます。解像度を変えたりしたい場合はここで変更します

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Section "Screen"
Identifier "Screen0"
Device "nvidia0"
Monitor "Monitor0"
DefaultDepth 24
Option "AllowEmptyInitialConfiguration" "True"
Option "UseDisplayDevice" "None"
Option "ConnectedMonitor" "None"
SubSection "Display"
Virtual 1920 1080
Depth 24
EndSubSection
EndSection

# コピー
Section "Screen"
Identifier "Screen1" # ←繰り上げ
Device "nvidia1" # ←Deviceセクションで追加した物を割り当て
Monitor "Monitor1" # ←Monitorセクションで追加した物を割り当て
DefaultDepth 24
Option "AllowEmptyInitialConfiguration" "True"
Option "UseDisplayDevice" "None"
Option "ConnectedMonitor" "None"
SubSection "Display"
Virtual 1920 1080
Depth 24
EndSubSection
EndSection

変更する: ServerLayoutセクション

最後に、ServerLayoutセクションで、スクリーンの配置を指定します。(※を追加)

1
2
3
4
5
6
7
Section "ServerLayout"
Identifier "Layout0"
Screen 0 "Screen0"
Screen 1 "Screen1" leftOf "Screen0" # ※
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Mouse0" "CorePointer"
EndSection

変更後: xorg.conf

変更後のファイル全体はこんな感じになります

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// 関係のあるセクションだけ抜粋
Section "ServerLayout"
Identifier "Layout0"
Screen 0 "Screen0"
Screen 1 "Screen1" leftOf "Screen0"
InputDevice "Keyboard0" "CoreKeyboard"
InputDevice "Mouse0" "CorePointer"
EndSection

Section "Monitor"
Identifier "Monitor0"
VendorName "Unknown"
ModelName "Unknown"
Option "DPMS"
EndSection

Section "Monitor"
Identifier "Monitor1"
VendorName "Unknown"
ModelName "Unknown"
Option "DPMS"
EndSection

Section "Device"
Identifier "nvidia0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce GTX 1050"
BusID "PCI:1:0:0"
Screen 0
EndSection

Section "Device"
Identifier "nvidia1"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BoardName "GeForce GTX 1050"
BusID "PCI:1:0:0"
Screen 1
EndSection

Section "Screen"
Identifier "Screen0"
Device "nvidia0"
Monitor "Monitor0"
DefaultDepth 24
Option "AllowEmptyInitialConfiguration" "True"
Option "UseDisplayDevice" "None"
Option "ConnectedMonitor" "None"
SubSection "Display"
Virtual 1920 1080
Depth 24
EndSubSection
EndSection

Section "Screen"
Identifier "Screen1"
Device "nvidia1"
Monitor "Monitor1"
DefaultDepth 24
Option "AllowEmptyInitialConfiguration" "True"
Option "UseDisplayDevice" "None"
Option "ConnectedMonitor" "None"
SubSection "Display"
Virtual 1920 1080
Depth 24
EndSubSection
EndSection

確認する: VNCを入れて仮想ディスプレイへ接続

Xorg自体にVNCモジュールがあって、このあたりに見て取れるんですが、今の所未検証です(時間出来たらちゃんとしたい)

普通にx11vncを入れてサーバを立てて確認します

1
2
3
4
5
6
7
8
9
10
11
// インストール
$ sudo apt install -y x11vnc

// パスワード設定(vnc4serverパッケージのコマンドかも)
$ vncpasswd

// DISPLAY :0.0 を5900番ポートに
$ x11vnc -auth guess -display :0.0 -rfbauth ~/.vnc/passwd -rfbport 5900 -forever -loop -noxdamage -repeat -shared

// DISPLAY :0.1 を5901番ポートに
$ x11vnc -auth guess -display :0.1 -rfbauth ~/.vnc/passwd -rfbport 5901 -forever -loop -noxdamage -repeat -shared

なんか動かないなーという時のログ出力先

0の所はディスプレイ番号?(未確認)

1
$ cat /var/log/Xorg.0.log

参考サイト