ディスプレイの無い環境でも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環境変数に設定する際のスクリーン番号となります(以下の例では、nvidia0がDISPLAY=:0.0, nvidia1がDISPLAY=: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セクションも既存の物を複製し、ここまでに設定してきたnvidia1とMonitor1を割り当てます。解像度を変えたりしたい場合はここで変更します
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
|
参考サイト