ディスプレイの無い環境でも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
|
参考サイト